From 5dbee2af38ec928af109d084fa6571733b05dea5 Mon Sep 17 00:00:00 2001 From: stephendeoca <107068002+stephendeoca@users.noreply.github.com> Date: Wed, 17 Jun 2026 12:56:51 -0700 Subject: [PATCH] @W-21791338 Extensions v1.17.0 (#637) * Update ECCN designation in CODEOWNERS (#620) * Extensions Release v1.17.0 --------- Co-authored-by: Jim Jagielski --- CODEOWNERS | 2 +- ...tableau.extensions.1.16.0-pre.5.min.js.map | 0 .../tableau.extensions.1.16.0.js | 0 .../tableau.extensions.1.16.0.min.js | 0 ...tableau.extensions.1.17.0-pre.8.min.js.map | 1 + lib/tableau.extensions.1.17.0.js | 13936 ++++++++++++++++ lib/tableau.extensions.1.17.0.min.js | 2 + lib/tableau.extensions.1.latest.js | 11214 +++++++------ lib/tableau.extensions.1.latest.min.js | 4 +- package-lock.json | 376 +- package.json | 6 +- 11 files changed, 20098 insertions(+), 5443 deletions(-) rename lib/{ => previous}/tableau.extensions.1.16.0-pre.5.min.js.map (100%) rename lib/{ => previous}/tableau.extensions.1.16.0.js (100%) rename lib/{ => previous}/tableau.extensions.1.16.0.min.js (100%) create mode 100644 lib/tableau.extensions.1.17.0-pre.8.min.js.map create mode 100644 lib/tableau.extensions.1.17.0.js create mode 100644 lib/tableau.extensions.1.17.0.min.js diff --git a/CODEOWNERS b/CODEOWNERS index 995a9c54..10fb2b98 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -1,2 +1,2 @@ -#ECCN:EAR99 +#ECCN:Open Source #GUSINFO:Open Source,Open Source Workflow diff --git a/lib/tableau.extensions.1.16.0-pre.5.min.js.map b/lib/previous/tableau.extensions.1.16.0-pre.5.min.js.map similarity index 100% rename from lib/tableau.extensions.1.16.0-pre.5.min.js.map rename to lib/previous/tableau.extensions.1.16.0-pre.5.min.js.map diff --git a/lib/tableau.extensions.1.16.0.js b/lib/previous/tableau.extensions.1.16.0.js similarity index 100% rename from lib/tableau.extensions.1.16.0.js rename to lib/previous/tableau.extensions.1.16.0.js diff --git a/lib/tableau.extensions.1.16.0.min.js b/lib/previous/tableau.extensions.1.16.0.min.js similarity index 100% rename from lib/tableau.extensions.1.16.0.min.js rename to lib/previous/tableau.extensions.1.16.0.min.js diff --git a/lib/tableau.extensions.1.17.0-pre.8.min.js.map b/lib/tableau.extensions.1.17.0-pre.8.min.js.map new file mode 100644 index 00000000..8c2dd722 --- /dev/null +++ b/lib/tableau.extensions.1.17.0-pre.8.min.js.map @@ -0,0 +1 @@ +{"version":3,"file":"tableau.extensions.1.17.0-pre.8.min.js","mappings":"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","sources":["webpack://tableau/./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js","webpack://tableau/../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js","webpack://tableau/../api-internal-contract-js/lib/src/messaging/interface/MessageListener.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/external/ExternalStackingVersionConverter.js","webpack://tableau/./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js","webpack://tableau/../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Workbook.js","webpack://tableau/../api-internal-contract-js/lib/src/messaging/CrossFramePreparedMessage.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/GetDataModels.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js","webpack://tableau/./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ExternalContextMenuServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/Param.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/external/ExternalContractVersionConverter.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Sheet.js","webpack://tableau/./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js","webpack://tableau/../api-internal-contract-js/lib/src/interface/VqlInterface.js","webpack://tableau/./lib/src/ExtensionsApi/Models/DashboardObject.js","webpack://tableau/./lib/src/ExtensionsApi/Events/TableauSheetEvent.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/GetDataService.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/DataSourceServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/AccessibilityModels.js","webpack://tableau/../api-internal-contract-js/lib/src/interface/InitializationOptions.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/Models.js","webpack://tableau/../api-internal-contract-js/lib/src/interface/AskDataInterface.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/TableSummary.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js","webpack://tableau/../../node_modules/guid/guid.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/SelectionModels.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/Verbs.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/UI.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/VersionNumber.js","webpack://tableau/./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js","webpack://tableau/../api-internal-contract-js/lib/src/interface/InternalApiDispatcher.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Extensions/TableauError.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Shared/WorkbookFormattingInterfaces.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/DataTypeConverter.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/TableauError.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Shared/SelectionInterfaces.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/UI.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/DashboardContent.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/UIImpl.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Shared/DataSourceInterfaces.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/InternalContractVersionConverter.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Extensions/ParameterInterfaces.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/Settings.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Extensions/EventInterface.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/ConnectedServer.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/DataSource.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js","webpack://tableau/./lib/src/ExtensionsApi/Events/FilterChangedEvent.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js","webpack://tableau/./lib/src/ExtensionsApi/Events/MarksSelectedEvent.js","webpack://tableau/../api-internal-contract-js/lib/src/messaging/interface/MessageDispatcher.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js","webpack://tableau/./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Parameter.js","webpack://tableau/../api-internal-contract-js/lib/src/messaging/interface/Messenger.js","webpack://tableau/../../node_modules/uuid/dist/esm-browser/rng.js","webpack://tableau/../../node_modules/uuid/dist/esm-browser/regex.js","webpack://tableau/../../node_modules/uuid/dist/esm-browser/validate.js","webpack://tableau/../../node_modules/uuid/dist/esm-browser/stringify.js","webpack://tableau/../../node_modules/uuid/dist/esm-browser/v1.js","webpack://tableau/../../node_modules/uuid/dist/esm-browser/parse.js","webpack://tableau/../../node_modules/uuid/dist/esm-browser/v35.js","webpack://tableau/../../node_modules/uuid/dist/esm-browser/md5.js","webpack://tableau/../../node_modules/uuid/dist/esm-browser/v3.js","webpack://tableau/../../node_modules/uuid/dist/esm-browser/v4.js","webpack://tableau/../../node_modules/uuid/dist/esm-browser/sha1.js","webpack://tableau/../../node_modules/uuid/dist/esm-browser/v5.js","webpack://tableau/../../node_modules/uuid/dist/esm-browser/nil.js","webpack://tableau/../../node_modules/uuid/dist/esm-browser/version.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/FilterModels.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Models/GetDataTableReaderModels.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/IdentityVersionConverter.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/AnimationServiceImpl.js","webpack://tableau/../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Shared/FilterInterfaces.js","webpack://tableau/../api-internal-contract-js/lib/src/messaging/interface/PreparedMessage.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/Extensions.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/VersionTranslations.js","webpack://tableau/../api-internal-contract-js/lib/src/JsApiInternalContract.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/Deferred.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/Notifications.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/VizQLDataServiceInterfaces.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Shared/SheetInterfaces.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Shared/AnnotationInterfaces.js","webpack://tableau/./lib/src/ExtensionsApi/Events/ParameterChangedEvent.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js","webpack://tableau/./lib/src/ExtensionsApi/Events/SummaryDataChangedEvent.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/Parameters.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Shared/DataTableInterfaces.js","webpack://tableau/../api-shared-js/lib/src/ApiShared.js","webpack://tableau/../api-internal-contract-js/lib/src/interface/VersionNumber.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js","webpack://tableau/../api-internal-contract-js/lib/src/interface/PulseInterface.js","webpack://tableau/./lib/src/ExtensionsApi/Events/WorksheetFormattingChangedEvent.js","webpack://tableau/./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Shared/VisualModelInterface.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/FieldImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/FilterServiceImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/Environment.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Dashboard.js","webpack://tableau/./lib/src/ExtensionsApi/Impl/SettingsImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Field.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/ConnectionSummary.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js","webpack://tableau/./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js","webpack://tableau/./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js","webpack://tableau/../api-internal-contract-js/lib/src/messaging/MessageTypeChecks.js","webpack://tableau/../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/LogicalTable.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/EventListenerManager.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/AccessibilityServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/AnnotationServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/ApiVersion.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Embedding/TableauError.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Point.js","webpack://tableau/./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js","webpack://tableau/../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Events/TableauEvent.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/ExportServiceImpl.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js","webpack://tableau/./lib/src/ExtensionsApi/Models/Worksheet.js","webpack://tableau/../api-shared-js/lib/src/VersionedExternalApiDispatcher.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js","webpack://tableau/../api-external-contract-js/lib/src/ExternalContract/Shared/EnvironmentInterfaces.js","webpack://tableau/../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js","webpack://tableau/../api-external-contract-js/lib/src/SharedApiExternalContract.js","webpack://tableau/../api-internal-contract-js/lib/src/contract/Enums.js","webpack://tableau/webpack/bootstrap","webpack://tableau/webpack/runtime/define property getters","webpack://tableau/webpack/runtime/hasOwnProperty shorthand","webpack://tableau/webpack/runtime/make namespace object","webpack://tableau/./lib/src/ExtensionsApi.js"],"sourcesContent":["\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExtensionsImpl = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst Dashboard_1 = require(\"../Models/Dashboard\");\nconst Workbook_1 = require(\"../Models/Workbook\");\nconst Worksheet_1 = require(\"../Models/Worksheet\");\nconst DashboardContent_1 = require(\"../Namespaces/DashboardContent\");\nconst Environment_1 = require(\"../Namespaces/Environment\");\nconst Settings_1 = require(\"../Namespaces/Settings\");\nconst UI_1 = require(\"../Namespaces/UI\");\nconst WorkbookFormattingEnvUtil_1 = require(\"../Namespaces/WorkbookFormattingEnvUtil\");\nconst WorksheetContent_1 = require(\"../Namespaces/WorksheetContent\");\nconst RegisterAllExtensionsServices_1 = require(\"../Services/RegisterAllExtensionsServices\");\nconst ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nconst BentonSansFontNameConstants_1 = require(\"./BentonSansFontNameConstants\");\nconst ExtensionWorkbookImpl_1 = require(\"./ExtensionWorkbookImpl\");\nconst LegacyInternalApiDispatcherHolder_1 = require(\"./LegacyInternalApiDispatcherHolder\");\nconst SettingsImpl_1 = require(\"./SettingsImpl\");\nconst TableauBookFontNameConstants_1 = require(\"./TableauBookFontNameConstants\");\nconst UIImpl_1 = require(\"./UIImpl\");\nclass ExtensionsImpl {\n initializeAsync(isExtensionDialog, contextMenuCallbacks) {\n if (!this._initializationPromise) {\n this._initializationPromise = new Promise((resolve, reject) => {\n const initOptions = { isAlpha: api_shared_js_1.ApiVersion.Instance.isAlpha, isExtensionDialog: isExtensionDialog };\n // First thing we want to do is check to see if there is a desktop dispatcher already registered for us\n if (LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise(initOptions)) {\n // Running in a pre-2019.3 desktop, use our legacy dispatcher promise\n const desktopDispatcherPromise = LegacyInternalApiDispatcherHolder_1.LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise(initOptions);\n desktopDispatcherPromise === null || desktopDispatcherPromise === void 0 ? void 0 : desktopDispatcherPromise.then((dispatcherFactory) => this.onDispatcherReceived(dispatcherFactory, isExtensionDialog, contextMenuCallbacks)).then((openPayload) => {\n resolve(openPayload);\n }).catch((error) => {\n reject(error);\n });\n }\n else {\n // We must be running in server, so we should try to kick of the server dispatcher bootstrapping\n const onDispatcherReceivedCallback = this.onDispatcherReceived.bind(this);\n (0, api_shared_js_1.doCrossFrameBootstrap)(window, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, initOptions)\n .then((factory) => {\n return onDispatcherReceivedCallback(factory, isExtensionDialog, contextMenuCallbacks);\n })\n .then((openPayload) => {\n resolve(openPayload);\n })\n .catch((error) => {\n reject(error);\n });\n }\n });\n }\n return this._initializationPromise;\n }\n reportExtensionRenderComplete(mediaBlob) {\n return __awaiter(this, void 0, void 0, function* () {\n const exportService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"export-service\" /* ServiceNames.Export */);\n return exportService.reportExtensionRenderComplete(mediaBlob);\n });\n }\n createVizImageAsync(inputSpec) {\n const vizService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"viz-service\" /* ServiceNames.Viz */);\n return vizService.createVizImageAsync(inputSpec);\n }\n setClickThroughAsync(clickThroughEnabled) {\n const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"UIService\" /* ExtensionsServiceNames.UIService */);\n return uiService.setClickThroughAsync(clickThroughEnabled, this.extensionZoneId);\n }\n isDashboardExtensionLocator(locator) {\n const dashboardExtensionLocator = locator;\n if (!dashboardExtensionLocator.dashboardPath) {\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error during initialization.');\n }\n return true;\n }\n onDispatcherReceived(dispatcherFactory, isExtensionDialog, contextMenuFunctions) {\n let dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION);\n // Call to register all the services which will use the newly initialized dispatcher\n (0, RegisterAllExtensionsServices_1.registerInitializationExtensionsServices)(dispatcher);\n // Get the initialization service and initialize this extension\n const initializationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"InitializationService\" /* ExtensionsServiceNames.InitializationService */);\n const callbackMapKeys = contextMenuFunctions ? Object.keys(contextMenuFunctions) : [];\n return initializationService.initializeDashboardExtensionsAsync(isExtensionDialog, callbackMapKeys).then((result) => {\n // If we receive an invalid plaform version, this means that platform is runnning 1.4 or 2.1 and\n // doesn't pass the platform version to external. In this case we assume the platform version to be 1.9\n const platformVersion = result.extensionEnvironment.platformVersion\n ? result.extensionEnvironment.platformVersion\n : { major: 1, minor: 9, fix: 0 };\n // Wrap our existing dispatcher in a dispatcher that can downgrade/upgrade for an older platform.\n if (api_shared_js_1.VersionedExternalApiDispatcher.needsVersionConverter(platformVersion)) {\n dispatcher = new api_shared_js_1.VersionedExternalApiDispatcher(dispatcher, platformVersion);\n }\n // Registration of services must happen before initializing content and environment\n // Extensions doesn't need to pass in a registryId. By default, the service registry instance is associated with registryId=0.\n (0, api_shared_js_1.registerAllSharedServices)(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId);\n (0, RegisterAllExtensionsServices_1.registerAllExtensionsServices)(dispatcher);\n if (result.extensionDashboardInfo && this.isDashboardExtensionLocator(result.extensionInstance.locator)) {\n this.dashboardContent = this.initializeDashboardContent(result.extensionDashboardInfo, result.extensionInstance.locator.dashboardPath);\n this.extensionZoneId = result.extensionDashboardInfo.extensionZoneId;\n }\n if (result.extensionWorksheetInfo) {\n this.worksheetContent = this.initializeWorksheetContent(result.extensionWorksheetInfo);\n }\n this.environment = new Environment_1.Environment(result.extensionEnvironment);\n this.settings = this.initializeSettings(result.extensionSettingsInfo);\n this.ui = new UI_1.UI(new UIImpl_1.UIImpl(isExtensionDialog));\n this.workbook = new Workbook_1.Workbook(new ExtensionWorkbookImpl_1.ExtensionWorkbookImpl());\n if (result.extensionEnvironment.workbookFormatting) {\n this.initializeTableauFonts(dispatcher, result.extensionEnvironment.workbookFormatting);\n this.applyAllFormatting(result.extensionEnvironment.workbookFormatting);\n }\n // After initialization has completed, setup listeners for the callback functions that\n // are meant to be triggered whenever a context menu item is clicked.\n this.initializeContextMenuCallbacks(contextMenuFunctions);\n // Also set up listeners for ExtensionStylesChangedEvent\n this.initializeWorkbookFormattingChangedEventCallback(dispatcher);\n // In the normal initialization case, this will be an empty string. When returning from initializeAsync to the\n // developer, we just ingore that string. In the case of initializing from an extension dialog, this string\n // is an optional payload sent from the parent extension.\n return result.extensionDialogPayload;\n });\n }\n applyAllFormatting(formattingModel) {\n if (!this._styleElement) {\n this._styleElement = document.createElement('style');\n this._styleElement.id = 'Tableau-Extension-Formatting';\n document.head.appendChild(this._styleElement);\n }\n if (!this._styleElement.sheet || !formattingModel) {\n return;\n }\n const stylesheet = this._styleElement.sheet;\n while (stylesheet.cssRules.length > 0) {\n stylesheet.deleteRule(stylesheet.cssRules.length - 1);\n }\n formattingModel.formattingSheets.map((currentFormattingSheet) => {\n this.applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet);\n });\n }\n applyFormattingSheetToStyleSheet(currentFormattingSheet, stylesheet) {\n let styleInfo = '';\n const cssProperties = currentFormattingSheet.cssProperties;\n if (cssProperties.fontFamily) {\n styleInfo += 'font-family: ' + cssProperties.fontFamily.toString() + '; ';\n }\n if (cssProperties.fontSize) {\n styleInfo += 'font-size: ' + cssProperties.fontSize.toString() + '; ';\n }\n if (cssProperties.fontWeight) {\n styleInfo += 'font-weight: ' + cssProperties.fontWeight.toString() + '; ';\n }\n if (cssProperties.fontStyle) {\n styleInfo += 'font-style: ' + cssProperties.fontStyle.toString() + '; ';\n }\n if (cssProperties.textDecoration) {\n styleInfo += 'text-decoration: ' + cssProperties.textDecoration.toString() + '; ';\n }\n if (cssProperties.color) {\n styleInfo += 'color: ' + cssProperties.color + '; ';\n }\n const selector = '.' + currentFormattingSheet.classNameKey;\n const rule = selector + ' { ' + styleInfo + ' }';\n stylesheet.insertRule(rule, stylesheet.cssRules.length);\n }\n initializeWorkbookFormattingChangedEventCallback(dispatcher) {\n const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* ServiceNames.Notification */);\n // Unregister function not used since these notifications should be\n // observed for the full lifetime of the extension.\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, () => true, (eventFormatting) => {\n if (eventFormatting) {\n this.initializeTableauFonts(dispatcher, eventFormatting);\n this.applyAllFormatting(eventFormatting);\n }\n });\n }\n initializeTableauFonts(dispatcher, workbookFormatting) {\n const fontNames = [...BentonSansFontNameConstants_1.SupportedBentonSansFontFaces, ...TableauBookFontNameConstants_1.SupportedTableauFontFaces];\n workbookFormatting.formattingSheets.forEach((formattingSheet) => {\n if (formattingSheet.cssProperties.fontFamily) {\n fontNames.push(formattingSheet.cssProperties.fontFamily);\n }\n });\n if (fontNames.length > 0) {\n const parameters = { [api_internal_contract_js_1.ParameterId.FontNameListItems]: fontNames };\n dispatcher\n .execute(api_internal_contract_js_1.VerbId.GetFonts, parameters)\n .then((response) => {\n this.loadFonts(response.result);\n })\n .catch();\n }\n }\n loadFonts(fonts) {\n fonts.forEach((fontNameAndInfo) => {\n if (TableauBookFontNameConstants_1.SupportedTableauFontFaces.includes(fontNameAndInfo.fontName)) {\n this.loadTableauFonts(fontNameAndInfo);\n }\n else if (BentonSansFontNameConstants_1.SupportedBentonSansFontFaces.includes(fontNameAndInfo.fontName)) {\n this.loadBentonSansFonts(fontNameAndInfo);\n }\n else {\n document.fonts.add(new FontFace(fontNameAndInfo.fontName, fontNameAndInfo.fontBinaryInfo));\n }\n });\n }\n initializeDashboardContent(info, sheetPath) {\n // sheets are always active for Extensions\n 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);\n const dashboardImpl = new api_shared_js_1.DashboardImpl(sheetInfoImpl, info.zones, sheetPath, ServiceRegistryUtil_1.ExtensionsRegistryId, null, info.activeDashboardObjectId);\n const dashboard = new Dashboard_1.Dashboard(dashboardImpl);\n return new DashboardContent_1.DashboardContent(dashboard);\n }\n initializeWorksheetContent(info) {\n 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\n true);\n const worksheetImpl = new api_shared_js_1.WorksheetImpl(sheetInfoImpl, ServiceRegistryUtil_1.ExtensionsRegistryId, info.visualId, null, // parentDashboard is always null for worksheet in WorksheetContent\n null, // parentStoryPoint is only used for embedding\n info.backgroundColor, WorkbookFormattingEnvUtil_1.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(info.formatting));\n const worksheet = new Worksheet_1.Worksheet(worksheetImpl);\n return new WorksheetContent_1.WorksheetContent(worksheet);\n }\n initializeSettings(settingsInfo) {\n const settingsImpl = new SettingsImpl_1.SettingsImpl(settingsInfo);\n return new Settings_1.Settings(settingsImpl);\n }\n initializeContextMenuCallbacks(contextMenuFunctions) {\n const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* ServiceNames.Notification */);\n // Unregister function not used since these notifications should be\n // observed for the full lifetime of the extension.\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ContextMenuClick, () => {\n // Let through any context menu event, these are already filtered on api-core\n // based on the extension locator.\n return true;\n }, (event) => {\n // Execute the function associated with this context menu ID\n if (contextMenuFunctions) {\n if (!contextMenuFunctions[event.id]) {\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Received unexpected context menu Id from event: ${event.id}`);\n }\n contextMenuFunctions[event.id]();\n }\n });\n }\n loadTableauFonts(fontNameAndInfo) {\n switch (fontNameAndInfo.fontName) {\n case TableauBookFontNameConstants_1.TableauBookFontFaceName:\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBookFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' }));\n break;\n case TableauBookFontNameConstants_1.TableauLightFontFaceName:\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauLightFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' }));\n break;\n case TableauBookFontNameConstants_1.TableauRegularFontFaceName:\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauRegularFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' }));\n break;\n case TableauBookFontNameConstants_1.TableauSemiBoldFontFaceName:\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauSemiboldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' }));\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauRegularFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' }));\n break;\n case TableauBookFontNameConstants_1.TableauBoldFontFaceName:\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBoldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' }));\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBoldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' }));\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauMediumFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' }));\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauSemiboldFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' }));\n break;\n case TableauBookFontNameConstants_1.TableauMediumFontFaceName:\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauMediumFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' }));\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauLightFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' }));\n document.fonts.add(new FontFace(TableauBookFontNameConstants_1.TableauBookFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' }));\n break;\n default:\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `'attempted to load unsupported font: ${fontNameAndInfo.fontName}.'`);\n }\n }\n loadBentonSansFonts(fontNameAndInfo) {\n switch (fontNameAndInfo.fontName) {\n case BentonSansFontNameConstants_1.BentonSansBookFontFaceName:\n document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' }));\n document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: '100', style: 'normal' }));\n break;\n case BentonSansFontNameConstants_1.BentonSansLightFontFaceName:\n document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: '100', style: 'normal' }));\n break;\n case BentonSansFontNameConstants_1.BentonSansMediumFontFaceName:\n document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' }));\n document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'bold', style: 'normal' }));\n break;\n case BentonSansFontNameConstants_1.BentonSansSemiDemiFontFaceName:\n document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { weight: 'normal', style: 'normal' }));\n break;\n case BentonSansFontNameConstants_1.BentonSansBookItalicFontFaceName:\n document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansFontFamilyName, fontNameAndInfo.fontBinaryInfo, { style: 'italic' }));\n break;\n case BentonSansFontNameConstants_1.BentonSansSemiDemiItalicFontFaceName:\n document.fonts.add(new FontFace(BentonSansFontNameConstants_1.BentonSansLowDPIFontFamilyName, fontNameAndInfo.fontBinaryInfo, { style: 'italic' }));\n break;\n default:\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `'attempted to load unsupported font: ${fontNameAndInfo.fontName}.'`);\n }\n }\n}\nexports.ExtensionsImpl = ExtensionsImpl;\n//# sourceMappingURL=ExtensionsImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ShouldThrow = exports.EnumConverter = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst TableauError_1 = require(\"../TableauError\");\n/**\n * This class converts from a source enum value to destination enum\n * value given a mapping from source to destination when constructed.\n *\n * Note: This exact same class is defined in api-core. Given its small\n * nature, it is not worth having in a separate project to share this between\n * api-core and api-shared. If more utility functionality is added that is used by api-core\n * and api-shared but has no other dependecies, a utiltity project might be merited,\n * and this class could be moved.\n */\nclass EnumConverter {\n constructor(_mappings, _defaultVal) {\n this._mappings = _mappings;\n this._defaultVal = _defaultVal;\n }\n convert(enumVal, throwIfMissing = ShouldThrow.Yes) {\n if (this._mappings.hasOwnProperty(enumVal)) {\n return this._mappings[enumVal];\n }\n if (this._defaultVal !== undefined && throwIfMissing !== ShouldThrow.Yes) {\n return this._defaultVal;\n }\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Enum Mapping not found for: ${enumVal}`);\n }\n}\nexports.EnumConverter = EnumConverter;\nvar ShouldThrow;\n(function (ShouldThrow) {\n ShouldThrow[\"Yes\"] = \"yes\";\n ShouldThrow[\"No\"] = \"no\";\n})(ShouldThrow || (exports.ShouldThrow = ShouldThrow = {}));\n//# sourceMappingURL=EnumConverter.js.map","\"use strict\";\n// All enum values made available to Extensions developers.\n// Enums should be kept in alphabetical order.\nvar Tableau;\n(function (Tableau) {\n /**\n * All error codes used by the Extensions API.\n */\n let ErrorCodes;\n (function (ErrorCodes) {\n /**\n * Thrown when caller attempts to execute command before initialization has completed.\n */\n ErrorCodes[\"APINotInitialized\"] = \"api-not-initialized\";\n /**\n * Thrown when caller attempts to execute command while extension is not visible.\n */\n ErrorCodes[\"VisibilityError\"] = \"visibility-error\";\n /**\n * Only one dialog can be opened at time with the UI namespace functionality.\n */\n ErrorCodes[\"DialogAlreadyOpen\"] = \"dialog-already-open\";\n /**\n * The open dialog was closed by the user.\n */\n ErrorCodes[\"DialogClosedByUser\"] = \"dialog-closed-by-user\";\n /**\n * An error occurred within the Tableau Extensions API. Contact Tableau Support.\n */\n ErrorCodes[\"InternalError\"] = \"internal-error\";\n /**\n * A dialog must start on the same domain as the parent extension.\n */\n ErrorCodes[\"InvalidDomainDialog\"] = \"invalid-dialog-domain\";\n /**\n * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message field.\n */\n ErrorCodes[\"InvalidParameter\"] = \"invalid-parameter\";\n /**\n * Can occur if the extension interacts with a filter that has been removed from the worksheet.\n */\n ErrorCodes[\"MissingFilter\"] = \"missing-filter\";\n /**\n * Can occur if the extension interacts with a parameter that has been removed from the worksheet.\n */\n ErrorCodes[\"MissingParameter\"] = \"missing-parameter\";\n /**\n * Internal Server Error\n */\n ErrorCodes[\"ServerError\"] = \"server-error\";\n /**\n * Developer cannot save settings while another save is still in progress.\n */\n ErrorCodes[\"SettingSaveInProgress\"] = \"setting-save-in-progress\";\n /**\n * An unknown event name was specified in the call to `addEventListener` or `removeEventListener`.\n */\n ErrorCodes[\"UnsupportedEventName\"] = \"unsupported-event-name\";\n /**\n * A method was used for a type of data source that doesn't support that method (see getActiveTablesAsync for an example)\n */\n ErrorCodes[\"UnsupportedMethodForDataSourceType\"] = \"unsupported-method-for-data-source-type\";\n })(ErrorCodes = Tableau.ErrorCodes || (Tableau.ErrorCodes = {}));\n /**\n * The context in which the Extensions is currently running.\n */\n let ExtensionContext;\n (function (ExtensionContext) {\n ExtensionContext[\"Desktop\"] = \"desktop\";\n ExtensionContext[\"Server\"] = \"server\";\n ExtensionContext[\"Cloud\"] = \"cloud\";\n ExtensionContext[\"PublicWeb\"] = \"public-web\";\n ExtensionContext[\"PublicDesktop\"] = \"public-desktop\";\n })(ExtensionContext = Tableau.ExtensionContext || (Tableau.ExtensionContext = {}));\n /**\n * The mode in which the Extensions is currently running.\n */\n let ExtensionMode;\n (function (ExtensionMode) {\n ExtensionMode[\"Authoring\"] = \"authoring\";\n ExtensionMode[\"Viewing\"] = \"viewing\";\n })(ExtensionMode = Tableau.ExtensionMode || (Tableau.ExtensionMode = {}));\n /**\n * The media type of the exported content.\n */\n let ExportedMediaType;\n (function (ExportedMediaType) {\n ExportedMediaType[\"Image\"] = \"image\";\n ExportedMediaType[\"Pdf\"] = \"pdf\";\n ExportedMediaType[\"Svg\"] = \"svg\";\n ExportedMediaType[\"Html\"] = \"html\";\n ExportedMediaType[\"PowerPoint\"] = \"powerpoint\";\n ExportedMediaType[\"Excel\"] = \"excel\";\n })(ExportedMediaType = Tableau.ExportedMediaType || (Tableau.ExportedMediaType = {}));\n /**\n * Represents the type of event that can be listened for.\n */\n let TableauEventType;\n (function (TableauEventType) {\n /**\n * @experimental\n * Raised when a message is received that was sent by a dialog or extension via `sendDialogMessageAsync`.*/\n TableauEventType[\"DialogMessageReceived\"] = \"dialog-message-received\";\n /** Raised when any filter has changed state. You can use this event type with [Worksheet](../interfaces/worksheet.html) objects.*/\n TableauEventType[\"FilterChanged\"] = \"filter-changed\";\n /** The selected marks on a visualization has changed.\n * You can use this event type with [Worksheet](../interfaces/worksheet.html) objects. */\n TableauEventType[\"MarkSelectionChanged\"] = \"mark-selection-changed\";\n /** The summary data backing a worksheet has changed\n * You can use this event type with [Worksheet](../interfaces/worksheet.html) objects.*/\n TableauEventType[\"SummaryDataChanged\"] = \"summary-data-changed\";\n /** A parameter has had its value modified. You can use this event type with {@link Parameter} objects. */\n TableauEventType[\"ParameterChanged\"] = \"parameter-changed\";\n /** Settings have been changed for this extension. You can use this event type with {@link Settings} objects. */\n TableauEventType[\"SettingsChanged\"] = \"settings-changed\";\n /** The dashboard layout has changed\n * @category Dashboard Extensions\n */\n TableauEventType[\"DashboardLayoutChanged\"] = \"dashboard-layout-changed\";\n /** The workbook formatting has changed\n * @category Dashboard Extensions\n */\n TableauEventType[\"WorkbookFormattingChanged\"] = \"workbook-formatting-changed\";\n /** The worksheet formatting has changed\n * @category Viz Extensions\n */\n TableauEventType[\"WorksheetFormattingChanged\"] = \"worksheet-formatting-changed\";\n })(TableauEventType = Tableau.TableauEventType || (Tableau.TableauEventType = {}));\n /**\n * Enum that represents the data type of encodings for createVizImageAsync.\n * @since 1.6.0\n */\n let VizImageEncodingType;\n (function (VizImageEncodingType) {\n VizImageEncodingType[\"Discrete\"] = \"discrete\";\n VizImageEncodingType[\"Continuous\"] = \"continuous\";\n })(VizImageEncodingType = Tableau.VizImageEncodingType || (Tableau.VizImageEncodingType = {}));\n /**\n * Enum that represents the sort direction for createVizImageAsync.\n * @since 1.8.0 and Tableau 2021.4\n */\n let VizImageSortDirectionType;\n (function (VizImageSortDirectionType) {\n VizImageSortDirectionType[\"Ascending\"] = \"ascending\";\n VizImageSortDirectionType[\"Descending\"] = \"descending\";\n })(VizImageSortDirectionType = Tableau.VizImageSortDirectionType || (Tableau.VizImageSortDirectionType = {}));\n /**\n * Enum that represents the palette type for createVizImageAsync.\n * @since 1.8.0 and Tableau 2021.4\n */\n let VizImagePaletteType;\n (function (VizImagePaletteType) {\n VizImagePaletteType[\"CustomDiverging\"] = \"custom-diverging\";\n VizImagePaletteType[\"CustomSequential\"] = \"custom-sequential\";\n })(VizImagePaletteType = Tableau.VizImagePaletteType || (Tableau.VizImagePaletteType = {}));\n /**\n * Enum that represents the Size Setting type for createVizImageAsync.\n * @since 1.8.0 and Tableau 2021.4\n */\n let VizImageSizeSettingType;\n (function (VizImageSizeSettingType) {\n VizImageSizeSettingType[\"Fixed\"] = \"fixed\";\n VizImageSizeSettingType[\"Manual\"] = \"manual\";\n })(VizImageSizeSettingType = Tableau.VizImageSizeSettingType || (Tableau.VizImageSizeSettingType = {}));\n /**\n * Enum that represents the Size Setting alignment type for createVizImageAsync.\n * @since 1.8.0 and Tableau 2021.4\n */\n let VizImageSizeSettingAlignmentType;\n (function (VizImageSizeSettingAlignmentType) {\n VizImageSizeSettingAlignmentType[\"Right\"] = \"right\";\n VizImageSizeSettingAlignmentType[\"Left\"] = \"left\";\n VizImageSizeSettingAlignmentType[\"Center\"] = \"center\";\n })(VizImageSizeSettingAlignmentType = Tableau.VizImageSizeSettingAlignmentType || (Tableau.VizImageSizeSettingAlignmentType = {}));\n})(Tableau || (Tableau = {}));\nmodule.exports = Tableau;\n//# sourceMappingURL=Tableau.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SharedErrorCodes = void 0;\nvar SharedErrorCodes;\n(function (SharedErrorCodes) {\n /**\n * A CSV or Excel file failed to be created in Viz.exportCrosstabAsync().\n */\n SharedErrorCodes[\"CrosstabCreationError\"] = \"crosstab-creation-error\";\n /**\n * A CSV file failed to be created in Viz.exportDataAsync().\n */\n SharedErrorCodes[\"DataCreationError\"] = \"data-creation-error\";\n /**\n * An invalid aggregation was specified for the filter, such as setting a range filter to \"SUM(Sales)\" instead of\n * \"Sales\".\n */\n SharedErrorCodes[\"InvalidAggregationFieldName\"] = \"invalid-aggregation-field-name\";\n /**\n * A filter operation was attempted on a field that does not exist in the data source.\n */\n SharedErrorCodes[\"InvalidFilterFieldName\"] = \"invalid-filter-name\";\n /**\n * A filter operation was attempted using a value that is the wrong data type or format.\n */\n SharedErrorCodes[\"InvalidFilterFieldValue\"] = \"invalid-filter-fieldValue\";\n /**\n * An invalid date value was specified in a Sheet.selectMarksAsync() call for a date field.\n */\n SharedErrorCodes[\"InvalidSelectionDate\"] = \"invalid-selection-date\";\n /**\n * A field was specified in a Sheet.selectMarksAsync() call that does not exist in the data source.\n */\n SharedErrorCodes[\"InvalidSelectionFieldName\"] = \"invalid-selection-fieldName\";\n /**\n * An invalid value was specified in a Sheet.selectMarksAsync() call.\n */\n SharedErrorCodes[\"InvalidSelectionValue\"] = \"invalid-selection-value\";\n /**\n * A parameter did not include a valid sheet selection for exporting.\n */\n SharedErrorCodes[\"InvalidSelectionSheet\"] = \"invalid-selection-sheet\";\n /**\n * An error occurred within the Tableau API. Contact Tableau Support.\n */\n SharedErrorCodes[\"InternalError\"] = \"internal-error\";\n /**\n * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message field.\n */\n SharedErrorCodes[\"InvalidParameter\"] = \"invalid-parameter\";\n /**\n * A PDF file failed to be created in Viz.exportPDFAsync().\n */\n SharedErrorCodes[\"PDFCreationError\"] = \"pdf-creation-error\";\n /**\n * A PowerPoint file failed to be created in Viz.exportPowerPointAsync().\n */\n SharedErrorCodes[\"PowerPointCreationError\"] = \"powerpoint-creation-error\";\n /**\n * An operation was attempted on a sheet that is not active or embedded within the active dashboard.\n */\n SharedErrorCodes[\"NotActiveSheet\"] = \"not-active-sheet\";\n /**\n * Property or Function is not supported within the Tableau API.\n */\n SharedErrorCodes[\"ImplementationError\"] = \"wrong-implementation\";\n /**\n * Can occur when two incompatible calls are triggered together.\n */\n SharedErrorCodes[\"ApiExecutionError\"] = \"api-execution-error\";\n /**\n * A general-purpose server error occurred. Details are contained in the Error object.\n */\n SharedErrorCodes[\"ServerError\"] = \"server-error\";\n /**\n * Can occur when an api call times out.\n */\n SharedErrorCodes[\"Timeout\"] = \"timeout\";\n})(SharedErrorCodes || (exports.SharedErrorCodes = SharedErrorCodes = {}));\n//# sourceMappingURL=Enums.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CrossFrameMessenger = void 0;\nconst guid = require(\"guid\");\nconst JsApiInternalContract_1 = require(\"../JsApiInternalContract\");\nconst CrossFramePreparedMessage_1 = require(\"./CrossFramePreparedMessage\");\nconst MessageTypeChecks_1 = require(\"./MessageTypeChecks\");\nconst MessageTypes_1 = require(\"./interface/MessageTypes\");\n/**\n * The CrossFrameMessenger is the primary export from the api-messaging module. An instance of\n * this class can be instantiated on both sides of a frame boundary to facilitate communication\n * in both directions between the frames. This class implements both the dispatcher and the listener\n * portions, but doesn't require callers to care about both.\n */\nclass CrossFrameMessenger {\n /**\n * Creates an instance of CrossFrameMessenger. If you would like to use the CrossFrameMessenger as a MessageListener,\n * be sure to call StartListening and register message handlers.\n * @param thisWindow The window object which the CrossFrameMessenger lives. An onMessage listener will be added here.\n * @param [otherWindow] Optional otherWindow which messages will be posted to.\n * If defined, incoming messages must originate from otherWindow to be passed on\n * @param [otherWindowOrigin] The target origin which otherWindow must have in order to receive dispatched messages.\n * This value will be sent as the targetOrigin of a postMessage\n * (https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage)\n */\n constructor(thisWindow, otherWindow, otherWindowOrigin) {\n this.thisWindow = thisWindow;\n this.otherWindow = otherWindow;\n this.otherWindowOrigin = otherWindowOrigin;\n // Make sure to call StartListening\n }\n ///// MessageListener Implementation\n startListening() {\n // Check if we already are listening, if not, hook up a message listener\n if (!this.unregisterFunction) {\n const boundHandler = this.onMessageReceived.bind(this);\n this.thisWindow.addEventListener('message', boundHandler, true);\n this.unregisterFunction = () => this.thisWindow.removeEventListener('message', boundHandler, true);\n }\n }\n stopListening() {\n // Stop listening if we have started listening\n if (this.unregisterFunction) {\n this.unregisterFunction();\n this.unregisterFunction = undefined;\n }\n }\n setInitializeMessageHandler(handler) {\n this.initializeMessageHandler = handler;\n }\n setCommandResponseMessageHandler(handler) {\n this.commandResponseMessageHandler = handler;\n }\n setCommandMessageHandler(handler) {\n this.commandMessageHandler = handler;\n }\n setNotificationMessageHandler(handler) {\n this.notificationMessageHandler = handler;\n }\n setHandshakeMessageHandler(handler) {\n this.handshakeMessageHandler = handler;\n }\n ///// MessageDispatcher Implementation\n /**\n * @param apiVersion api-internal-contract-js version (exported in JsApiInternalConntract)\n * @param crossFrameVersion crossframe messaging version (exported in JsApiInternalConntract)\n * @param options additional options that can be passed at initialization (information about the version of\n * external being used for example)\n */\n prepareInitializationMessage(apiVersion, crossFrameVersion, options) {\n const message = {\n msgGuid: guid.raw(),\n msgType: MessageTypes_1.MessageType.Initialize,\n crossFrameVersion: crossFrameVersion,\n apiVersion: apiVersion,\n options: options,\n };\n return this.prepareMessage(message);\n }\n prepareCommandMessage(verbId, parameters) {\n const message = {\n msgGuid: guid.raw(),\n msgType: MessageTypes_1.MessageType.Command,\n verbId: verbId,\n parameters: parameters,\n };\n return this.prepareMessage(message);\n }\n prepareCommandResponseMessage(commandGuid, data, error) {\n const message = {\n msgGuid: guid.raw(),\n msgType: MessageTypes_1.MessageType.CommandResponse,\n commandGuid: commandGuid,\n data: data,\n error: error,\n };\n if (error) {\n // stringify error object to remove unserializable fields like functions and prevent serialization errors\n message.error = JSON.parse(JSON.stringify(error));\n }\n return this.prepareMessage(message);\n }\n prepareNotificationMessage(notificationId, data) {\n const message = {\n msgGuid: guid.raw(),\n msgType: MessageTypes_1.MessageType.Notification,\n notificationId: notificationId,\n data: data,\n };\n return this.prepareMessage(message);\n }\n prepareAckMessage() {\n const message = {\n msgGuid: guid.raw(),\n msgType: MessageTypes_1.MessageType.Ack,\n platformVersion: JsApiInternalContract_1.INTERNAL_CONTRACT_VERSION,\n };\n return this.prepareMessage(message);\n }\n /**\n * Prepares a pending message for sending and returns the prepared message\n *\n * @param msg The message to be sent to this.otherWindow\n * @returns The prepared message\n */\n prepareMessage(msg) {\n if (!this.otherWindow || !this.otherWindowOrigin) {\n throw 'Other window not initialized, cannot dispatch messages';\n }\n const preparedMessage = new CrossFramePreparedMessage_1.CrossFramePreparedMessage(msg, this.otherWindow, this.otherWindowOrigin);\n return preparedMessage;\n }\n /**\n * Called when a message is received. Does some validation of the message, and then\n * calls an appropriate message handler if one is defined\n *\n * @param event The incoming MessageEvent\n */\n onMessageReceived(event) {\n // If we have an otherWindow defined, make sure the message is coming from there\n if (this.otherWindow && event.source !== this.otherWindow) {\n return;\n }\n // Do some validation on event.data to make sure that we have received a real message\n if (!event.data) {\n return;\n }\n const message = event.data;\n if (!(0, MessageTypeChecks_1.isMessage)(message)) {\n return;\n }\n // Check the declared message type, validate the message, and call an appropriate hander if one exists\n switch (message.msgType) {\n case MessageTypes_1.MessageType.Initialize: {\n if (!(0, MessageTypeChecks_1.isInitMessage)(message) || !this.initializeMessageHandler) {\n return;\n }\n this.initializeMessageHandler(message, event.source);\n break;\n }\n case MessageTypes_1.MessageType.CommandResponse: {\n if (!(0, MessageTypeChecks_1.isCommandResponseMessage)(message) || !this.commandResponseMessageHandler) {\n return;\n }\n this.commandResponseMessageHandler(message, event.source);\n break;\n }\n case MessageTypes_1.MessageType.Command: {\n if (!(0, MessageTypeChecks_1.isCommandMessage)(message) || !this.commandMessageHandler) {\n return;\n }\n this.commandMessageHandler(message, event.source);\n break;\n }\n case MessageTypes_1.MessageType.Notification: {\n if (!(0, MessageTypeChecks_1.isNotificationMessage)(message) || !this.notificationMessageHandler) {\n return;\n }\n this.notificationMessageHandler(message, event.source);\n break;\n }\n case MessageTypes_1.MessageType.Handshake: {\n if (!(0, MessageTypeChecks_1.isHandshakeMessage)(message) || !this.handshakeMessageHandler) {\n return;\n }\n this.handshakeMessageHandler(message, event.source);\n break;\n }\n default:\n // Just ignore this since we don't know how to handle the message type\n }\n }\n setOtherWindow(otherWindow) {\n this.otherWindow = otherWindow;\n }\n setOtherWindowOrigin(origin) {\n this.otherWindowOrigin = origin;\n }\n}\nexports.CrossFrameMessenger = CrossFrameMessenger;\n//# sourceMappingURL=CrossFrameMessenger.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=MessageListener.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExternalStackingVersionConverter = void 0;\n// tslint:disable:no-any\n/**\n * The version converter is designed to allow the platform and external modules\n * to seemlessly communicate over two different versions of the internal API. This converter\n * supports external's version(minor) >= platform's version(minor). When executing\n * commands, it is used to downgrade the external representation to what platform knows on the way in\n * and upgrade the representations on the way out.\n */\nclass ExternalStackingVersionConverter {\n /**\n * Creates a new instance of the StackingVersionConverter\n *\n * @param _externalVersion The version of the internal contract api-external-js is using\n * @param _platformVersion The version of the internal contract the api-platform-js is using\n * @param _downgradeExecuteCallTranslations Ordered list of the translations to perform when downgrading cmd parameters\n * @param _upgradeExecuteReturnTranslations Ordered list of upgrade translations to perform after a cmd is executed\n * @param _upgradeNotificationTranslations Ordered list of upgrade notfications to perform on events\n */\n constructor(_externalVersion, _platformVersion, _downgradeExecuteCallTranslations, _upgradeExecuteReturnTranslations, _upgradeNotificationTranslations) {\n this._externalVersion = _externalVersion;\n this._platformVersion = _platformVersion;\n this._downgradeExecuteCallTranslations = _downgradeExecuteCallTranslations;\n this._upgradeExecuteReturnTranslations = _upgradeExecuteReturnTranslations;\n this._upgradeNotificationTranslations = _upgradeNotificationTranslations;\n if (this._externalVersion.major > this._platformVersion.major) {\n throw new Error(`Cannot convert between external version ${this._externalVersion.major}\n and ${this._platformVersion.major}`);\n }\n }\n downgradeExecuteCall(verb, parameters) {\n // Perform the downgrade of the verb and parameters to the level that platform is using\n let downgraded = { verb: verb, parameters: parameters };\n for (const downgradeTranslation of this._downgradeExecuteCallTranslations) {\n downgraded = downgradeTranslation(downgraded.verb, downgraded.parameters);\n }\n return downgraded;\n }\n upgradeExecuteReturn(executeResponse, verb, parameters) {\n // Perform the upgrade of the response to what the external module is expecting\n let upgraded = executeResponse;\n for (const upgradeTranslation of this._upgradeExecuteReturnTranslations) {\n upgraded = upgradeTranslation(upgraded, verb, parameters);\n }\n return upgraded;\n }\n upgradeNotification(notification) {\n // Perform the upgrade of notification to what the external module is expecting\n let upgraded = notification;\n for (const upgradeNotification of this._upgradeNotificationTranslations) {\n upgraded = upgradeNotification(upgraded);\n }\n return upgraded;\n }\n}\nexports.ExternalStackingVersionConverter = ExternalStackingVersionConverter;\n//# sourceMappingURL=ExternalStackingVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SettingsServiceImpl = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nclass SettingsServiceImpl extends api_shared_js_1.ServiceImplBase {\n get serviceName() {\n return \"SettingsService\" /* ExtensionsServiceNames.SettingsService */;\n }\n saveSettingsAsync(settings) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveSettingsAsync',\n [api_internal_contract_js_1.ParameterId.SettingsValues]: settings,\n };\n return this.execute(api_internal_contract_js_1.VerbId.SaveExtensionSettings, parameters).then((value) => {\n const result = value.result;\n if (!result || !result.settingsValues) {\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Unexpected error savings settings.');\n }\n return result.settingsValues;\n });\n }\n}\nexports.SettingsServiceImpl = SettingsServiceImpl;\n//# sourceMappingURL=SettingsServiceImpl.js.map","\"use strict\";\n// This file re-exports everything which is part of the extensions api public interface\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Toolbar = exports.TableauDialogType = exports.SheetSizeBehavior = exports.PulseTimeDimension = exports.PulseLayout = exports.PulseErrorMessageVisibility = exports.PrintScaling = exports.PrintPageSize = exports.PrintOrientation = exports.EmbeddingTableauEventType = exports.EmbeddingErrorCodes = exports.DeviceType = exports.CrosstabFileFormat = exports.ApiMenuType = void 0;\n__exportStar(require(\"./ExternalContract/Embedding/AskDataInterfaces\"), exports);\nvar Enums_1 = require(\"./ExternalContract/Embedding/Enums\");\nObject.defineProperty(exports, \"ApiMenuType\", { enumerable: true, get: function () { return Enums_1.ApiMenuType; } });\nObject.defineProperty(exports, \"CrosstabFileFormat\", { enumerable: true, get: function () { return Enums_1.CrosstabFileFormat; } });\nObject.defineProperty(exports, \"DeviceType\", { enumerable: true, get: function () { return Enums_1.DeviceType; } });\nObject.defineProperty(exports, \"EmbeddingErrorCodes\", { enumerable: true, get: function () { return Enums_1.EmbeddingErrorCodes; } });\nObject.defineProperty(exports, \"EmbeddingTableauEventType\", { enumerable: true, get: function () { return Enums_1.TableauEventType; } });\nObject.defineProperty(exports, \"PrintOrientation\", { enumerable: true, get: function () { return Enums_1.PrintOrientation; } });\nObject.defineProperty(exports, \"PrintPageSize\", { enumerable: true, get: function () { return Enums_1.PrintPageSize; } });\nObject.defineProperty(exports, \"PrintScaling\", { enumerable: true, get: function () { return Enums_1.PrintScaling; } });\nObject.defineProperty(exports, \"PulseErrorMessageVisibility\", { enumerable: true, get: function () { return Enums_1.PulseErrorMessageVisibility; } });\nObject.defineProperty(exports, \"PulseLayout\", { enumerable: true, get: function () { return Enums_1.PulseLayout; } });\nObject.defineProperty(exports, \"PulseTimeDimension\", { enumerable: true, get: function () { return Enums_1.PulseTimeDimension; } });\nObject.defineProperty(exports, \"SheetSizeBehavior\", { enumerable: true, get: function () { return Enums_1.SheetSizeBehavior; } });\nObject.defineProperty(exports, \"TableauDialogType\", { enumerable: true, get: function () { return Enums_1.TableauDialogType; } });\nObject.defineProperty(exports, \"Toolbar\", { enumerable: true, get: function () { return Enums_1.Toolbar; } });\n__exportStar(require(\"./ExternalContract/Embedding/PulseInterfaces\"), exports);\n__exportStar(require(\"./ExternalContract/Embedding/TableauError\"), exports);\n__exportStar(require(\"./ExternalContract/Embedding/VizInterfaces\"), exports);\n__exportStar(require(\"./ExternalContract/Embedding/VizQLDataServiceInterfaces\"), exports);\n__exportStar(require(\"./ExternalContract/Embedding/WebComponentInterfaces\"), exports);\n__exportStar(require(\"./SharedApiExternalContract\"), exports);\n//# sourceMappingURL=EmbeddingApiExternalContract.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Workbook = void 0;\nclass Workbook {\n constructor(_workbookImpl) {\n this._workbookImpl = _workbookImpl;\n }\n getAllDataSourcesAsync() {\n return this._workbookImpl.getAllDataSourcesAsync();\n }\n}\nexports.Workbook = Workbook;\n//# sourceMappingURL=Workbook.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CrossFramePreparedMessage = void 0;\n/**\n * Implementation of the PreparedMessage interface used to post messages between\n * two frames using window.postMessage\n */\nclass CrossFramePreparedMessage {\n /**\n * Creates an instance of CrossFramePreparedMessage.\n * @param _message The message to be sent\n * @param _target The target window where the message will be sent\n * @param _origin The targetOrigin where this message can be received\n */\n constructor(_message, _target, _origin) {\n this._message = _message;\n this._target = _target;\n this._origin = _origin;\n }\n get messageGuid() {\n return this._message.msgGuid;\n }\n send() {\n this._target.postMessage(this._message, this._origin);\n return this;\n }\n}\nexports.CrossFramePreparedMessage = CrossFramePreparedMessage;\n//# sourceMappingURL=CrossFramePreparedMessage.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DataValue = exports.Column = exports.MarkInfo = exports.DataTable = void 0;\nclass DataTable {\n constructor(_data, _columns, _totalRowCount, _isTotalRowCountLimited, _isSummaryData, _marksInfo) {\n this._data = _data;\n this._columns = _columns;\n this._totalRowCount = _totalRowCount;\n this._isTotalRowCountLimited = _isTotalRowCountLimited;\n this._isSummaryData = _isSummaryData;\n this._marksInfo = _marksInfo;\n this._name = _isSummaryData ? 'Summary Data Table' : 'Underlying Data Table';\n }\n get name() {\n return this._name;\n }\n get data() {\n return this._data;\n }\n get columns() {\n return this._columns;\n }\n get marksInfo() {\n return this._marksInfo;\n }\n get totalRowCount() {\n return this._totalRowCount;\n }\n get isTotalRowCountLimited() {\n return this._isTotalRowCountLimited;\n }\n get isSummaryData() {\n return this._isSummaryData;\n }\n}\nexports.DataTable = DataTable;\nclass MarkInfo {\n constructor(_type, _color, _tupleId) {\n this._type = _type;\n this._color = _color;\n this._tupleId = _tupleId;\n }\n get type() {\n return this._type;\n }\n get color() {\n return this._color;\n }\n get tupleId() {\n return this._tupleId;\n }\n}\nexports.MarkInfo = MarkInfo;\nclass Column {\n constructor(_fieldName, _fieldId, _dataType, _isReferenced, _index) {\n this._fieldName = _fieldName;\n this._fieldId = _fieldId;\n this._dataType = _dataType;\n this._isReferenced = _isReferenced;\n this._index = _index;\n }\n get fieldName() {\n return this._fieldName;\n }\n get fieldId() {\n return this._fieldId;\n }\n get dataType() {\n return this._dataType;\n }\n get isReferenced() {\n return this._isReferenced;\n }\n get index() {\n return this._index;\n }\n}\nexports.Column = Column;\nclass DataValue {\n /* tslint:disable:no-any */\n constructor(_value, _nativeValue, _formattedValue, _aliasValue, _hasAlias) {\n this._value = _value;\n this._nativeValue = _nativeValue;\n this._formattedValue = _formattedValue;\n this._aliasValue = _aliasValue;\n this._hasAlias = _hasAlias;\n }\n get value() {\n return this._value;\n }\n get nativeValue() {\n return this._nativeValue;\n }\n get formattedValue() {\n return this._formattedValue;\n }\n get aliasValue() {\n return this._aliasValue;\n }\n get hasAlias() {\n return this._hasAlias;\n }\n}\nexports.DataValue = DataValue;\n//# sourceMappingURL=GetDataModels.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SheetUtils = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst TableauError_1 = require(\"../TableauError\");\nclass SheetUtils {\n // This is a direct port from SheetSize.cs - SheetSizeFactory\n static getSheetSizeFromSizeConstraints(sizeConstraint) {\n const { minWidth, minHeight, maxWidth, maxHeight } = sizeConstraint;\n if (minHeight === 0 && minWidth === 0) {\n if (maxHeight === 0 && maxWidth === 0) {\n return {\n behavior: Contract.SheetSizeBehavior.Automatic,\n };\n }\n return {\n behavior: Contract.SheetSizeBehavior.AtMost,\n maxSize: { width: maxWidth, height: maxHeight },\n };\n }\n if (maxHeight === 0 && maxWidth === 0) {\n return {\n behavior: Contract.SheetSizeBehavior.AtLeast,\n minSize: { width: minWidth, height: minHeight },\n };\n }\n if (maxHeight === minHeight && maxWidth === minWidth && minWidth > 0) {\n return {\n behavior: Contract.SheetSizeBehavior.Exactly,\n minSize: { width: minWidth, height: minHeight },\n maxSize: { width: minWidth, height: minHeight },\n };\n }\n // 'Fit Width' for a DSD layout\n const isDsdLayout = minWidth === 0 && maxWidth === 0;\n return {\n behavior: Contract.SheetSizeBehavior.Range,\n minSize: { width: minWidth, height: minHeight },\n maxSize: { width: isDsdLayout ? 2147483647 : maxWidth, height: maxHeight },\n };\n }\n static createAutomaticSize() {\n let behavior = Contract.SheetSizeBehavior.Automatic;\n let minSize = { width: 0, height: 0 };\n let maxSize = { width: 0, height: 0 };\n return { behavior, minSize, maxSize };\n }\n static getPublishedSheetInfoByName(name, sheetInfos) {\n const sheetInfo = sheetInfos.find((sheet) => sheet.name === name);\n return sheetInfo;\n }\n static getSheetTypeEnum(internalSheetType) {\n let sheetType;\n switch (internalSheetType) {\n case api_internal_contract_js_1.SheetType.Worksheet: {\n sheetType = Contract.SheetType.Worksheet;\n break;\n }\n case api_internal_contract_js_1.SheetType.Dashboard: {\n sheetType = Contract.SheetType.Dashboard;\n break;\n }\n case api_internal_contract_js_1.SheetType.Story: {\n sheetType = Contract.SheetType.Story;\n break;\n }\n default: {\n throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ServerError, 'Invalid SheetType');\n }\n }\n return sheetType;\n }\n static isValidSheetSize(sizeObject) {\n return sizeObject.behavior !== undefined;\n }\n}\nexports.SheetUtils = SheetUtils;\n//# sourceMappingURL=SheetUtils.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WorkbookFormattingChangedEvent = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst TableauEvent_1 = require(\"./TableauEvent\");\nclass WorkbookFormattingChangedEvent extends TableauEvent_1.TableauEvent {\n constructor(_formatting) {\n super(Contract.TableauEventType.WorkbookFormattingChanged);\n this._formatting = _formatting;\n }\n get formatting() {\n return this._formatting;\n }\n}\nexports.WorkbookFormattingChangedEvent = WorkbookFormattingChangedEvent;\n//# sourceMappingURL=WorkbookFormattingChangedEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExternalContextMenuServiceImpl = void 0;\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass ExternalContextMenuServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"external-context-menu-service\" /* ServiceNames.ExternalContextMenu */;\n }\n appendContextMenuAsync(sheetName, targetMenu, config) {\n const verb = api_internal_contract_js_1.VerbId.AppendExternalMenuItem;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'appendContextMenuAsync',\n [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName,\n [api_internal_contract_js_1.ParameterId.ExternalMenuItemDisplayName]: config.displayName,\n };\n return this.execute(verb, parameters).then((response) => {\n const newMenuItemId = response.result;\n return newMenuItemId;\n });\n }\n removeContextMenuAsync(sheetName, targetMenu, menuItemId) {\n const verb = api_internal_contract_js_1.VerbId.RemoveExternalMenuItem;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeContextMenuAsync',\n [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName,\n [api_internal_contract_js_1.ParameterId.ExternalMenuItemId]: menuItemId,\n };\n return this.execute(verb, parameters).then((response) => {\n return;\n });\n }\n executeContextMenuAsync(sheetName, targetMenu, menuItemId) {\n const verb = api_internal_contract_js_1.VerbId.ExecuteExternalMenuItem;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'executeContextMenuAsync',\n [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName,\n [api_internal_contract_js_1.ParameterId.ExternalMenuItemId]: menuItemId,\n };\n return this.execute(verb, parameters).then((response) => {\n return;\n });\n }\n renameContextMenuAsync(sheetName, targetMenu, menuHeader, menuDescription) {\n const verb = api_internal_contract_js_1.VerbId.RenameExternalMenu;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'renameContextMenuAsync',\n [api_internal_contract_js_1.ParameterId.WorksheetName]: sheetName,\n [api_internal_contract_js_1.ParameterId.ExternalMenuHeader]: menuHeader,\n [api_internal_contract_js_1.ParameterId.ExternalMenuDescription]: menuDescription,\n };\n return this.execute(verb, parameters).then((response) => {\n return;\n });\n }\n}\nexports.ExternalContextMenuServiceImpl = ExternalContextMenuServiceImpl;\n//# sourceMappingURL=ExternalContextMenuServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Param = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst TableauError_1 = require(\"../TableauError\");\nconst ErrorHelpers_1 = require(\"./ErrorHelpers\");\nclass Param {\n /**\n * serializes the date into the format that the server expects.\n * @param date the date to serialize\n */\n static serializeDateForPlatform(date) {\n const year = date.getUTCFullYear();\n const month = date.getUTCMonth() + 1;\n const day = date.getUTCDate();\n const hh = date.getUTCHours();\n const mm = date.getUTCMinutes();\n const sec = date.getUTCSeconds();\n return `${year}-${month}-${day} ${hh}:${mm}:${sec}`;\n }\n static serializeBooleanForPlatform(bool) {\n return bool ? 'true' : 'false';\n }\n static serializeNumberForPlatform(num) {\n return num.toString(10);\n }\n /**\n * Verifies the input is a number\n */\n /* tslint:disable-next-line:no-any */\n static isTypeNumber(input) {\n return typeof input === 'number' || input instanceof Number;\n }\n /**\n * Verifies the input is a Date\n */\n /* tslint:disable-next-line:no-any */\n static isTypeDate(input) {\n return input instanceof Date;\n }\n /* tslint:disable-next-line:no-any */\n static isTypeString(input) {\n return typeof input === 'string' || input instanceof String;\n }\n /* tslint:disable-next-line:no-any */\n static isTypeBool(input) {\n return typeof input === 'boolean' || input instanceof Boolean;\n }\n /**\n * Determines if the input is null or undefined\n */\n /* tslint:disable-next-line:no-any */\n static isNullOrUndefined(input) {\n return input === null || input === undefined;\n }\n /* tslint:disable-next-line:no-any */\n static serializeParameterValue(value) {\n if (Param.isTypeNumber(value)) {\n return Param.serializeNumberForPlatform(value);\n }\n else if (Param.isTypeDate(value)) {\n return Param.serializeDateForPlatform(value);\n }\n else if (Param.isTypeBool(value)) {\n return Param.serializeBooleanForPlatform(value);\n }\n else if (Param.isTypeString(value)) {\n return value;\n }\n else {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Unexpected invalid value for: ${value}`);\n }\n }\n /**\n * Verifies that the parameter is already a Map, or converts an object to a Map.\n * If the parameter is an object, we convert it to a Map using Object.entries.\n * @throws if the parameter is not an object or Map\n */\n // tslint:disable-next-line:no-any\n static convertParameterToMap(param, paramName) {\n ErrorHelpers_1.ErrorHelpers.verifyParameterType(param, 'object', paramName);\n if (Array.isArray(param)) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, `Expecting object or Map for: ${paramName}.`);\n }\n return param instanceof Map ? param : new Map(Object.entries(param));\n }\n /* tslint:disable-next-line:no-any */\n static tryParseNumber(value) {\n if (Param.isNullOrUndefined(value)) {\n return { success: false };\n }\n if (Param.isTypeNumber(value)) {\n return { parsed: value, success: true };\n }\n const valueString = value.toString();\n if (valueString === 'NaN') {\n // 'NaN' parses as NaN which is indistinguishable from a failed parse.\n return { parsed: NaN, success: true };\n }\n const parsed = parseFloat(valueString);\n if (isNaN(parsed)) {\n return { success: false };\n }\n return { parsed, success: true };\n }\n}\nexports.Param = Param;\n//# sourceMappingURL=Param.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=ExternalContractVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Sheet = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst Parameter_1 = require(\"./Parameter\");\nclass Sheet extends api_shared_js_1.EventListenerManager {\n constructor(_sheetImpl) {\n super();\n this._sheetImpl = _sheetImpl;\n }\n get name() {\n return this._sheetImpl.name;\n }\n get sheetType() {\n return this._sheetImpl.sheetType;\n }\n get size() {\n if (this.isValidSize(this._sheetImpl.size)) {\n return this._sheetImpl.size;\n }\n throw new api_shared_js_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, 'Size not implemented');\n }\n isValidSize(size) {\n const testSize = size;\n if (testSize.width !== undefined && testSize.height !== undefined) {\n return true;\n }\n return false;\n }\n findParameterAsync(parameterName) {\n return this._sheetImpl.findParameterAsync(parameterName).then((parameterImpl) => {\n if (parameterImpl) {\n return new Promise((resolve) => resolve(new Parameter_1.Parameter(parameterImpl, this)));\n }\n else {\n return new Promise((resolve) => resolve(undefined));\n }\n });\n }\n getParametersAsync() {\n return this._sheetImpl.getParametersAsync().then((parametersImpl) => {\n return parametersImpl.map((parameterImpl) => {\n return new Parameter_1.Parameter(parameterImpl, this);\n });\n });\n }\n}\nexports.Sheet = Sheet;\n//# sourceMappingURL=Sheet.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TableauWorksheetEvent = void 0;\nconst TableauSheetEvent_1 = require(\"./TableauSheetEvent\");\nclass TableauWorksheetEvent extends TableauSheetEvent_1.TableauSheetEvent {\n get worksheet() {\n return this._worksheet;\n }\n constructor(type, _worksheet) {\n super(type, _worksheet);\n this._worksheet = _worksheet;\n }\n}\nexports.TableauWorksheetEvent = TableauWorksheetEvent;\n//# sourceMappingURL=TableauWorksheetEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WorkbookImpl = void 0;\nclass WorkbookImpl {\n}\nexports.WorkbookImpl = WorkbookImpl;\n//# sourceMappingURL=WorkbookImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VizOptionNames = void 0;\n/**\n * These strings were *manually copied* from the server,\n * workgroup/src/silos/tableau-server/libraries/tab-controller-vizql/src/com/tableausoftware/\n * controller/vizql/constants/ParameterKeys.java#L9\n * should be exported instead\n * parameters that vizql will accept in an embedding URL\n **/\nvar VqlParameterNames;\n(function (VqlParameterNames) {\n VqlParameterNames[\"ONE\"] = \"1\";\n VqlParameterNames[\"ALERTS\"] = \":alerts\";\n VqlParameterNames[\"ALIAS\"] = \"alias\";\n VqlParameterNames[\"ALLOW_DEFERRED_BOOTSTRAP\"] = \":allowDeferredBootstrap\";\n VqlParameterNames[\"ALLOW_AUTOGEN_WORKSHEET_PHONE_LAYOUTS\"] = \"allowAutogenWorksheetPhoneLayouts\";\n VqlParameterNames[\"API_ID\"] = \":apiID\";\n VqlParameterNames[\"APP\"] = \":app\";\n VqlParameterNames[\"ATTACHMENT\"] = \"attachment\";\n VqlParameterNames[\"IS_IPAD_APP\"] = \"app\";\n VqlParameterNames[\"ANIMATE_TRANSITION\"] = \":animate_transition\";\n VqlParameterNames[\"ASCENDING\"] = \"ascending\";\n VqlParameterNames[\"AUTHENTICATION\"] = \"authentication\";\n VqlParameterNames[\"ATTRIBUTES\"] = \"attributes\";\n VqlParameterNames[\"AUTHORING_SHEET\"] = \":authSheet\";\n VqlParameterNames[\"AXIS\"] = \"axis\";\n VqlParameterNames[\"BOOTSTRAP_WHEN_NOTIFIED\"] = \":bootstrapWhenNotified\";\n VqlParameterNames[\"BROWSER_BACK_BUTTON_UNDO\"] = \":browserBackButtonUndo\";\n VqlParameterNames[\"BROWSER_RENDERING_ON\"] = \"isBrowserRendering\";\n VqlParameterNames[\"BROWSER_RENDERING_THRESHOLD\"] = \"browserRenderingThreshold\";\n VqlParameterNames[\"CHARSET\"] = \"charset\";\n VqlParameterNames[\"CLIENT_DIMENSION\"] = \"clientDimension\";\n VqlParameterNames[\"CLIENT_IP\"] = \"client_ip\";\n VqlParameterNames[\"CLIENT_NUM\"] = \"clientNum\";\n VqlParameterNames[\"COLON_EMBEDDED\"] = \":embedded\";\n VqlParameterNames[\"COLON_MOBILE\"] = \":mobile\";\n VqlParameterNames[\"COLON_DEEP_LINKING_DISABLED\"] = \":deepLinkingDisabled\";\n VqlParameterNames[\"COLON_WATERMARK\"] = \":watermark\";\n VqlParameterNames[\"COMMENTS\"] = \":comments\";\n VqlParameterNames[\"COMMENTING_ENABLED\"] = \":commentingEnabled\";\n VqlParameterNames[\"COMMENTING_MENTIONS_ENABLED\"] = \":commentingMentions\";\n VqlParameterNames[\"CONNECTION\"] = \"connection\";\n VqlParameterNames[\"CREATED_BY_FEATURE\"] = \"createdByFeature\";\n VqlParameterNames[\"CRYPTED_PASSWORD\"] = \"crypted\";\n VqlParameterNames[\"CSSDEBUG\"] = \":cssdebug\";\n VqlParameterNames[\"CSV\"] = \"csv\";\n VqlParameterNames[\"CUSTOM_VIEWS\"] = \":customViews\";\n VqlParameterNames[\"CV\"] = \":cv\";\n VqlParameterNames[\"CV_ID\"] = \"cvId\";\n VqlParameterNames[\"DASHBOARD_PORT_SIZE\"] = \"dashboardPortSize\";\n VqlParameterNames[\"DATA_DETAILS\"] = \":dataDetails\";\n VqlParameterNames[\"DATASOURCE\"] = \"datasource\";\n VqlParameterNames[\"DEBUG\"] = \":debug\";\n VqlParameterNames[\"DELAY\"] = \":delay\";\n VqlParameterNames[\"DEPTH\"] = \"depth\";\n VqlParameterNames[\"DEVICE_TYPE\"] = \":device\";\n VqlParameterNames[\"DEVICE_PIXEL_RATIO\"] = \"devicePixelRatio\";\n VqlParameterNames[\"DEVICE_PREVIEW_MODE\"] = \":devicepreviewmode\";\n VqlParameterNames[\"DIMENSIONS\"] = \":dimensions\";\n VqlParameterNames[\"DISABLE_SHARED_SESSIONS\"] = \":disable_shared_sessions\";\n VqlParameterNames[\"DISABLE_URL_ACTIONS_POPUPS\"] = \":disableUrlActionsPopups\";\n VqlParameterNames[\"DIRECTION\"] = \"direction\";\n VqlParameterNames[\"DISPLAY_OVERLAY\"] = \":display_overlay\";\n VqlParameterNames[\"DISPLAY_SHARE\"] = \":display_share\";\n VqlParameterNames[\"DISPLAY_SPINNER\"] = \":display_spinner\";\n VqlParameterNames[\"DISPLAY_STATIC_IMAGE\"] = \":display_static_image\";\n VqlParameterNames[\"DISPLAY_TABS\"] = \"display_tabs\";\n VqlParameterNames[\"DISPLAY_VIEW_COUNT\"] = \":display_count\";\n VqlParameterNames[\"IGNORE_STICKY_SESSION\"] = \":ignore_sticky_session\";\n VqlParameterNames[\"INCREMENT_VIEW_COUNT\"] = \":increment_view_count\";\n VqlParameterNames[\"DOCMODE\"] = \"docmode\";\n VqlParameterNames[\"DOMAIN\"] = \"domain\";\n VqlParameterNames[\"DO_WORK\"] = \"do_work\";\n VqlParameterNames[\"DX\"] = \"dx\";\n VqlParameterNames[\"DY\"] = \"dy\";\n VqlParameterNames[\"EDIT_DATA_ALERT\"] = \":editDataAlert\";\n VqlParameterNames[\"EMBED_COUNT\"] = \":embcount\";\n VqlParameterNames[\"EMBED\"] = \":embed\";\n VqlParameterNames[\"EMBEDDED\"] = \"embedded\";\n VqlParameterNames[\"ENCRYPTED\"] = \"encrypted\";\n VqlParameterNames[\"API_EXTERNAL_VERSION\"] = \":apiExternalVersion\";\n VqlParameterNames[\"API_INTERNAL_VERSION\"] = \":apiInternalVersion\";\n VqlParameterNames[\"EXCLUDE\"] = \"exclude\";\n VqlParameterNames[\"EXPORT_FORMAT\"] = \":export_format\";\n VqlParameterNames[\"FIELDNAME\"] = \"fieldname\";\n VqlParameterNames[\"FIELD_NAME\"] = \"field_name\";\n VqlParameterNames[\"FIELD_SEP\"] = \"field_sep\";\n VqlParameterNames[\"FILE\"] = \"file\";\n VqlParameterNames[\"FILTER_TILE_SIZE\"] = \"filterTileSize\";\n VqlParameterNames[\"FN\"] = \"fn\";\n VqlParameterNames[\"FOCUS\"] = \"focus\";\n VqlParameterNames[\"FORCE_CACHE\"] = \"force_cache\";\n VqlParameterNames[\"FORMAT\"] = \"format\";\n VqlParameterNames[\"FORMAT_DATA_VALUE_LOCALLY\"] = \"formatDataValueLocally\";\n VqlParameterNames[\"FROM_WG\"] = \":from_wg\";\n VqlParameterNames[\"GRAPHQL_DATABASE_ID\"] = \":graphQLDatabaseId\";\n VqlParameterNames[\"GRAPHQL_TABLE_ID\"] = \":graphQLTableId\";\n VqlParameterNames[\"GUID\"] = \":guid\";\n VqlParameterNames[\"H\"] = \"h\";\n VqlParameterNames[\"HIDDEN\"] = \"hidden\";\n VqlParameterNames[\"HIDE_CLOSE_BUTTON\"] = \":hideCloseButton\";\n VqlParameterNames[\"HIDE_EDIT_BUTTON\"] = \":hideEditButton\";\n VqlParameterNames[\"HIDE_EDIT_IN_DESKTOP_BUTTON\"] = \":hideEditInDesktopButton\";\n VqlParameterNames[\"HIGH_DPI\"] = \":highdpi\";\n VqlParameterNames[\"IMAGE_SIZE_LIMIT\"] = \"imageSizeLimit\";\n VqlParameterNames[\"TRANSPARENT_LINE_MARKS_LIMIT\"] = \"transparentLineMarkLimit\";\n VqlParameterNames[\"CLIENT_RENDER_PIXEL_LIMIT\"] = \"clientRenderPixelLimit\";\n VqlParameterNames[\"IN\"] = \"in\";\n VqlParameterNames[\"INSTANCE_ID\"] = \":iid\";\n VqlParameterNames[\"IS_GUEST_REDIRECT_FROM_VIZPORTAL\"] = \":isGuestRedirectFromVizportal\";\n VqlParameterNames[\"IS_MARK_ANIMATION_ENABLED\"] = \"isMarkAnimationEnabled\";\n VqlParameterNames[\"IS_VIZPORTAL\"] = \":isVizPortal\";\n VqlParameterNames[\"INPUT_\"] = \"input_string\";\n VqlParameterNames[\"JSDEBUG\"] = \":jsdebug\";\n VqlParameterNames[\"JSON\"] = \"json\";\n VqlParameterNames[\"JSON_ONLY\"] = \":jsonOnly\";\n VqlParameterNames[\"KEEPFILE\"] = \"keepfile\";\n VqlParameterNames[\"KEY\"] = \"key\";\n VqlParameterNames[\"LANGUAGE\"] = \"language\";\n VqlParameterNames[\"LANGUAGE_REQUESTED\"] = \":language\";\n VqlParameterNames[\"LINKTARGET\"] = \":linktarget\";\n VqlParameterNames[\"LOAD_ORDER_ID\"] = \":loadOrderID\";\n VqlParameterNames[\"LOAD_NEWEST_REVISION\"] = \":loadNewestRevision\";\n VqlParameterNames[\"LOCAL_PATHS\"] = \":localPaths\";\n VqlParameterNames[\"LOCALE\"] = \"locale\";\n VqlParameterNames[\"LOCATION_ID\"] = \"locationid\";\n VqlParameterNames[\"LOCATION_TYPE\"] = \"locationtype\";\n VqlParameterNames[\"WORKBOOK_LOCALE\"] = \"workbookLocale\";\n VqlParameterNames[\"MAXROWS\"] = \"maxrows\";\n VqlParameterNames[\"MAX_AGE\"] = \"maxAge\";\n VqlParameterNames[\"MAX_ROWS\"] = \"maxRows\";\n VqlParameterNames[\"METHOD\"] = \"method\";\n VqlParameterNames[\"MOBILE\"] = \"mobile\";\n VqlParameterNames[\"MODIFIER\"] = \"modifier\";\n VqlParameterNames[\"NAME\"] = \"name\";\n VqlParameterNames[\"NAV_TYPE\"] = \"navType\";\n VqlParameterNames[\"NAV_SRC\"] = \"navSrc\";\n VqlParameterNames[\"NOATTACHMENT\"] = \"no-attachment\";\n VqlParameterNames[\"NO_OVERWRITE\"] = \"no_overwrite\";\n VqlParameterNames[\"OPEN_AUTHORING_IN_TOP_WINDOW\"] = \":openAuthoringInTopWindow\";\n VqlParameterNames[\"OPENID_HD\"] = \":openid_hd\";\n VqlParameterNames[\"OPENID_LOGIN_HINT\"] = \":openid_login_hint\";\n VqlParameterNames[\"OAUTHREQUEST\"] = \"oauthrequest\";\n VqlParameterNames[\"OAUTH_CREDENTIAL_IDS\"] = \"oauth_credential_ids\";\n VqlParameterNames[\"OFFLINE_MODE\"] = \":offlinemode\";\n VqlParameterNames[\"ORIGIN\"] = \":origin\";\n VqlParameterNames[\"OVERLAY\"] = \":overlay\";\n VqlParameterNames[\"P\"] = \"p\";\n VqlParameterNames[\"PATH\"] = \"path\";\n VqlParameterNames[\"PANE_RESOLVER_X\"] = \"paneResolverX\";\n VqlParameterNames[\"PANE_RESOLVER_Y\"] = \"paneResolverY\";\n VqlParameterNames[\"PARAM\"] = \"param\";\n VqlParameterNames[\"PARENT_ID\"] = \"parent_id\";\n VqlParameterNames[\"PASSWORD\"] = \"password\";\n VqlParameterNames[\"PATTERN\"] = \"pattern\";\n VqlParameterNames[\"PIXEL_RATIO\"] = \":pixelratio\";\n VqlParameterNames[\"PREFIX\"] = \":prefix\";\n VqlParameterNames[\"PREVIEW\"] = \":preview\";\n VqlParameterNames[\"PRIMARY_CONTENT_URL\"] = \"primary_content_url\";\n VqlParameterNames[\"PROJECT\"] = \"project\";\n VqlParameterNames[\"PROTOCOL\"] = \"protocol\";\n VqlParameterNames[\"PSEUDO\"] = \":pseudo\";\n VqlParameterNames[\"QUERY\"] = \"query\";\n VqlParameterNames[\"R\"] = \"r\";\n VqlParameterNames[\"RANGE_TYPE\"] = \"range_type\";\n VqlParameterNames[\"RECORD_SEP\"] = \"record_sep\";\n VqlParameterNames[\"RECORD_CLIENT_PERFORMANCE\"] = \":record_client_performance\";\n VqlParameterNames[\"RECORD_PERFORMANCE\"] = \":record_performance\";\n VqlParameterNames[\"RECOVER_OLD_SESSION_ID\"] = \":recover_old_session_id\";\n VqlParameterNames[\"RECOVER_SESSION_STATE_TICKETS\"] = \":recover_session_state_tickets\";\n VqlParameterNames[\"REFRESH\"] = \":refresh\";\n VqlParameterNames[\"REFRESHUNMODIFIED\"] = \":refreshunmodified\";\n VqlParameterNames[\"REGION\"] = \"region\";\n VqlParameterNames[\"RELOAD_ON_CUSTOM_VIEW_SAVE\"] = \":reloadOnCustomViewSave\";\n VqlParameterNames[\"RENDER\"] = \":render\";\n VqlParameterNames[\"RENDER_MAPS_CLIENT_SIDE\"] = \"renderMapsClientSide\";\n VqlParameterNames[\"RETRY\"] = \":retry\";\n VqlParameterNames[\"REUSE\"] = \"reuse\";\n VqlParameterNames[\"REUSE_FOREVER\"] = \"reuse_forever\";\n VqlParameterNames[\"REVERT\"] = \":revert\";\n VqlParameterNames[\"SAVE_DB_PASSWORDS\"] = \"save_db_passwords\";\n VqlParameterNames[\"SELECT_X\"] = \"select_x\";\n VqlParameterNames[\"SELECT_Y\"] = \"select_y\";\n VqlParameterNames[\"SESSION_FEATURE_PREFIX\"] = \":ff_\";\n VqlParameterNames[\"SESSION_FLAGS\"] = \":session_feature_flags\";\n VqlParameterNames[\"SHARE_BUTTON\"] = \"share_button\";\n VqlParameterNames[\"SHEET_ID\"] = \"sheet_id\";\n VqlParameterNames[\"SHARED\"] = \"shared\";\n VqlParameterNames[\"SHOWALL\"] = \"showall\";\n VqlParameterNames[\"SHOW_APP_BANNER\"] = \":showAppBanner\";\n VqlParameterNames[\"SHOW_ASK_DATA\"] = \":showAskData\";\n VqlParameterNames[\"SHOW_PARAMS\"] = \"showParams\";\n VqlParameterNames[\"SHOW_SHARE_OPTIONS\"] = \":showShareOptions\";\n VqlParameterNames[\"SIZE\"] = \":size\";\n VqlParameterNames[\"SOURCE\"] = \"source\";\n VqlParameterNames[\"STATE\"] = \"state\";\n VqlParameterNames[\"STICKY_SESSION_KEY\"] = \"stickySessionKey\";\n VqlParameterNames[\"SUBSCRIPTIONS\"] = \":subscriptions\";\n VqlParameterNames[\"SUMMARY\"] = \"summary\";\n VqlParameterNames[\"SUPPRESS_DEFAULT_EDIT_BEHAVIOR\"] = \":suppressDefaultEditBehavior\";\n VqlParameterNames[\"SYNC_SESSION\"] = \":sync_session\";\n VqlParameterNames[\"SYNC_SESSION_STATE\"] = \"sync_session_state\";\n VqlParameterNames[\"TABS\"] = \":tabs\";\n VqlParameterNames[\"TARGET\"] = \"target\";\n VqlParameterNames[\"TARGET_SITE\"] = \"target_site\";\n VqlParameterNames[\"TOOLBAR\"] = \":toolbar\";\n VqlParameterNames[\"TOOLTIP\"] = \":tooltip\";\n VqlParameterNames[\"TS\"] = \"ts\";\n VqlParameterNames[\"UNDERLYING_TABLE_ID\"] = \"underlying_table_id\";\n VqlParameterNames[\"UNDERLYING_TABLE_CAPTION\"] = \"underlying_table_caption\";\n VqlParameterNames[\"UPDATE_TYPE\"] = \"update_type\";\n VqlParameterNames[\"USE_GUEST\"] = \":useGuest\";\n VqlParameterNames[\"USE_INLINE_IMAGES\"] = \"use_inline_images\";\n VqlParameterNames[\"USERAGENT\"] = \"useragent\";\n VqlParameterNames[\"USERNAME\"] = \"username\";\n VqlParameterNames[\"VALUE\"] = \"value\";\n VqlParameterNames[\"VERBOSE_MODE\"] = \"verboseMode\";\n VqlParameterNames[\"VIEW_ID\"] = \"views_id\";\n VqlParameterNames[\"VIZ_SNAPSHOT_ID\"] = \"viz_snapshot_id\";\n VqlParameterNames[\"VW\"] = \":vw\";\n VqlParameterNames[\"W\"] = \"w\";\n VqlParameterNames[\"WORKSHEET_PORT_SIZE\"] = \"worksheetPortSize\";\n VqlParameterNames[\"WATERMARK\"] = \"watermark\";\n VqlParameterNames[\"WATERMARK_MARGIN\"] = \":watermark_margin\";\n VqlParameterNames[\"WB\"] = \":wb\";\n VqlParameterNames[\"WHICH\"] = \"which\";\n VqlParameterNames[\"X\"] = \"x\";\n VqlParameterNames[\"Y\"] = \"y\";\n VqlParameterNames[\"ZID\"] = \"zid\";\n VqlParameterNames[\"ZONE_ID\"] = \"zone_id\";\n VqlParameterNames[\"KEYCHAIN_VERSION\"] = \"keychain_version\";\n VqlParameterNames[\"DATASOURCE_ID\"] = \"datasource_id\";\n VqlParameterNames[\"DATASOURCE_NAME\"] = \"datasource_name\";\n VqlParameterNames[\"LENS_ID\"] = \"lens_id\";\n VqlParameterNames[\"WIDTH\"] = \"width\";\n VqlParameterNames[\"HEIGHT\"] = \"height\";\n // Default Layout params\n VqlParameterNames[\"LAYOUT_VIEWS\"] = \"views\";\n VqlParameterNames[\"LAYOUT_MENUS\"] = \"menus\";\n VqlParameterNames[\"LAYOUT_GEOMETRY\"] = \"geometry\";\n VqlParameterNames[\"LAYOUT_PAGES\"] = \"pages\";\n VqlParameterNames[\"LAYOUT_CACHEURL\"] = \"cacheurl\";\n VqlParameterNames[\"LAYOUT_SHEET\"] = \"sheet\";\n VqlParameterNames[\"LAYOUT_DEPTH\"] = \"depth\";\n})(VqlParameterNames || (VqlParameterNames = {}));\n/**\n * parameters that are only relevant when working with Tableau Public\n * maybe not really necessry to split them out\n */\nvar PublicParameterNames;\n(function (PublicParameterNames) {\n PublicParameterNames[\"SHOW_VIZ_HOME\"] = \":showVizHome\";\n // display view count\n})(PublicParameterNames || (PublicParameterNames = {}));\n/**\n * Map the parameter names as used in the url to what we call them publicly in the embedding library.\n * The only parameters listed here should be the ones that get sent to vizql\n * - this should match the interface at external-contract:VizInterfaces:VizSettings\n */\nvar VizOptionNames;\n(function (VizOptionNames) {\n // publicName = internalStringValue\n VizOptionNames[\"Size\"] = \":size\";\n VizOptionNames[\"Embed\"] = \":embed\";\n VizOptionNames[\"EmbedCount\"] = \":embcount\";\n VizOptionNames[\"ApiInternalVersion\"] = \":apiInternalVersion\";\n VizOptionNames[\"ApiExternalVersion\"] = \":apiExternalVersion\";\n VizOptionNames[\"ShowVizHome\"] = \":showVizHome\";\n VizOptionNames[\"Jsdebug\"] = \":jsdebug\";\n VizOptionNames[\"BootstrapWhenNotified\"] = \":bootstrapWhenNotified\";\n VizOptionNames[\"NavType\"] = \"navType\";\n VizOptionNames[\"NavSrc\"] = \"navSrc\";\n VizOptionNames[\"debug\"] = \":jsdebug\";\n VizOptionNames[\"ApiID\"] = \":apiID\";\n VizOptionNames[\"disableUrlActionsPopups\"] = \":disableUrlActionsPopups\";\n VizOptionNames[\"hideTabs\"] = \":tabs\";\n VizOptionNames[\"toolbar\"] = \":toolbar\";\n VizOptionNames[\"device\"] = \":device\";\n VizOptionNames[\"instanceIdToClone\"] = \":iid\";\n VizOptionNames[\"touchOptimize\"] = \"mobile\";\n VizOptionNames[\"hideEditButton\"] = \":hideEditButton\";\n VizOptionNames[\"hideEditInDesktopButton\"] = \":hideEditInDesktopButton\";\n VizOptionNames[\"suppressDefaultEditBehavior\"] = \":suppressDefaultEditBehavior\";\n VizOptionNames[\"hideCloseButton\"] = \":hideCloseButton\";\n})(VizOptionNames || (exports.VizOptionNames = VizOptionNames = {}));\n//# sourceMappingURL=VqlInterface.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DashboardObject = void 0;\nconst Dashboard_1 = require(\"./Dashboard\");\nconst Worksheet_1 = require(\"./Worksheet\");\n/**\n * Implementation of the dashboard objects - the zones in a dashboard.\n */\nclass DashboardObject {\n constructor(_dashboardObjectImpl) {\n this._dashboardObjectImpl = _dashboardObjectImpl;\n }\n get dashboard() {\n return new Dashboard_1.Dashboard(this._dashboardObjectImpl.dashboardImpl);\n }\n get type() {\n return this._dashboardObjectImpl.type;\n }\n get position() {\n return this._dashboardObjectImpl.position;\n }\n get size() {\n return this._dashboardObjectImpl.size;\n }\n get worksheet() {\n if (this._dashboardObjectImpl.worksheetImpl) {\n return new Worksheet_1.Worksheet(this._dashboardObjectImpl.worksheetImpl);\n }\n return undefined;\n }\n get name() {\n return this._dashboardObjectImpl.name;\n }\n get isFloating() {\n return this._dashboardObjectImpl.isFloating;\n }\n get isVisible() {\n return this._dashboardObjectImpl.isVisible;\n }\n get id() {\n return this._dashboardObjectImpl.id;\n }\n get fieldId() {\n return this._dashboardObjectImpl.fieldId;\n }\n}\nexports.DashboardObject = DashboardObject;\n//# sourceMappingURL=DashboardObject.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TableauSheetEvent = void 0;\nconst TableauEvent_1 = require(\"./TableauEvent\");\nclass TableauSheetEvent extends TableauEvent_1.TableauEvent {\n get sheet() {\n return this._sheet;\n }\n constructor(type, sheet) {\n super(type);\n this._sheet = sheet;\n }\n}\nexports.TableauSheetEvent = TableauSheetEvent;\n//# sourceMappingURL=TableauSheetEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExternalIdentityVersionConverter = void 0;\n// tslint:disable:no-any\n/**\n * This version converter doesn't actually do anything but is useful for testing or when we have\n * a matching platform and external version number\n */\nclass ExternalIdentityVersionConverter {\n downgradeExecuteCall(verb, parameters) {\n return {\n verb: verb,\n parameters: parameters,\n };\n }\n upgradeExecuteReturn(executeResponse, verb, parameters) {\n return executeResponse;\n }\n upgradeNotification(notification) {\n return notification;\n }\n}\nexports.ExternalIdentityVersionConverter = ExternalIdentityVersionConverter;\n//# sourceMappingURL=ExternalIdentityVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.GetDataType = void 0;\n/**\n * Defines which type of getData call to make.\n */\nvar GetDataType;\n(function (GetDataType) {\n GetDataType[\"Summary\"] = \"summary\";\n GetDataType[\"Underlying\"] = \"underlying\";\n})(GetDataType || (exports.GetDataType = GetDataType = {}));\n//# sourceMappingURL=GetDataService.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DataSourceServiceImpl = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst DataSource_1 = require(\"../../DataSource\");\nconst Field_1 = require(\"../../Field\");\nconst DataSourceImpl_1 = require(\"../../Impl/DataSourceImpl\");\nconst FieldImpl_1 = require(\"../../Impl/FieldImpl\");\nconst TableauError_1 = require(\"../../TableauError\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass DataSourceServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n // Since Object Model is supported since Tableau 2020.2, DataSourceServiceImpl can be initialized with the\n // platform version when OM was supported. Once we drop support for Tableau versions <= 2020.1, all additional\n // code in here for Object Model can be removed.\n constructor(dispatcher, registryId) {\n super(dispatcher, registryId);\n }\n get serviceName() {\n return \"data-source-service\" /* ServiceNames.DataSourceService */;\n }\n refreshAsync(dataSourceId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'refreshAsync',\n [api_internal_contract_js_1.ParameterId.DeltaTimeMs]: 0,\n [api_internal_contract_js_1.ParameterId.ShouldRefreshDS]: true,\n };\n // On server: Not passing the datasource id will refresh all datasources.\n if (dataSourceId) {\n parameters[api_internal_contract_js_1.ParameterId.DataSourceId] = dataSourceId;\n }\n return this.execute(api_internal_contract_js_1.VerbId.RefreshDataSource, parameters).then((response) => {\n return;\n });\n }\n getActiveTablesAsync(dataSourceId) {\n const joinParameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getActiveTablesAsync',\n [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId,\n };\n // Get the description of the tables used by this connection\n return this.execute(api_internal_contract_js_1.VerbId.GetActiveTables, joinParameters).then((joinResponse) => {\n const tableInfos = joinResponse.result;\n // getActiveTables is unsupported for cubes and GA. We do not have a connection type property\n // available from the platform (intentionally, to reduce code churn as new connections are added).\n // Instead,just check if any tables are returned. This array will be empty for any non-table based datasource.\n if (tableInfos.tables.length === 0) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedMethodForDataSourceType, `getActiveTables is not supported for: ${dataSourceId}`);\n }\n return tableInfos.tables;\n });\n }\n getDataSourcesAsync(visualId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDataSourcesAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetDataSources, parameters).then((response) => {\n const dataSchema = response.result;\n return dataSchema;\n });\n }\n getAllDataSourcesAsync() {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getAllDataSourcesAsync',\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetAllDataSources, parameters).then((response) => {\n const dataSchema = response.result;\n return dataSchema;\n });\n }\n getConnectionSummariesAsync(dataSourceId) {\n const params = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getConnectionSummariesAsync',\n [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId,\n };\n // Get the description of the tables used by this connection\n return this.execute(api_internal_contract_js_1.VerbId.GetConnectionDescriptionSummaries, params).then((response) => {\n const descriptionSummaries = response.result;\n return descriptionSummaries;\n });\n }\n getFieldAsync(globalfieldName) {\n const verb = api_internal_contract_js_1.VerbId.GetFieldAndDataSource;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getFieldAsync',\n [api_internal_contract_js_1.ParameterId.FieldId]: globalfieldName,\n };\n return this.execute(verb, parameters).then((response) => {\n const dataSource = response.result[api_internal_contract_js_1.ParameterId.DataSource];\n const field = response.result[api_internal_contract_js_1.ParameterId.Field];\n return this.convertField(field, this.convertDataSource(dataSource));\n });\n }\n getLogicalTablesAsync(dataSourceId) {\n const params = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTablesAsync',\n [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTables, params).then((response) => {\n return response.result;\n });\n }\n getUnderlyingTablesAsync(visualId) {\n const params = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTablesAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTables, params).then((response) => {\n return response.result;\n });\n }\n convertField(field, dataSource) {\n return new Field_1.Field(new FieldImpl_1.FieldImpl(field, dataSource));\n }\n convertDataSource(dataSource) {\n return new DataSource_1.DataSource(new DataSourceImpl_1.DataSourceImpl(dataSource, this._registryId));\n }\n}\nexports.DataSourceServiceImpl = DataSourceServiceImpl;\n//# sourceMappingURL=DataSourceServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StoryPointInfoImpl = void 0;\nclass StoryPointInfoImpl {\n constructor(_caption, _index, _storyPointId, _active, _updated, _parentStoryImpl) {\n this._caption = _caption;\n this._index = _index;\n this._storyPointId = _storyPointId;\n this._active = _active;\n this._updated = _updated;\n this._parentStoryImpl = _parentStoryImpl;\n }\n get caption() {\n return this._caption;\n }\n set caption(caption) {\n this._caption = caption;\n }\n get index() {\n return this._index;\n }\n set index(index) {\n this._index = index;\n }\n get storyPointId() {\n return this._storyPointId;\n }\n get active() {\n return this._active;\n }\n set active(isActive) {\n this._active = isActive;\n }\n get updated() {\n return this._updated;\n }\n set updated(isUpdated) {\n this._updated = isUpdated;\n }\n get parentStory() {\n return this._parentStoryImpl;\n }\n}\nexports.StoryPointInfoImpl = StoryPointInfoImpl;\n//# sourceMappingURL=StoryPointInfoImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TooltipTextRequestModel = void 0;\nclass TooltipTextRequestModel {\n constructor(visualIdPresModel, tupleId) {\n this.visualIdPresModel = visualIdPresModel;\n this.tupleId = tupleId;\n }\n}\nexports.TooltipTextRequestModel = TooltipTextRequestModel;\n//# sourceMappingURL=AccessibilityModels.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=InitializationOptions.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NotificationServiceImpl = void 0;\nconst NotificationServiceImplBase_1 = require(\"./NotificationServiceImplBase\");\nclass NotificationServiceImpl extends NotificationServiceImplBase_1.NotificationServiceImplBase {\n get serviceName() {\n return \"notification-service\" /* ServiceNames.Notification */;\n }\n}\nexports.NotificationServiceImpl = NotificationServiceImpl;\n//# sourceMappingURL=NotificationServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ClientInfoServiceImpl = void 0;\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass ClientInfoServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"client-info-service\" /* ServiceNames.ClientInfo */;\n }\n getClientInfoAsync() {\n const verb = api_internal_contract_js_1.VerbId.GetEmbeddingClientInfo;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getClientInfoAsync',\n };\n return this.execute(verb, parameters).then((response) => {\n const clientInfo = response.result;\n return clientInfo;\n });\n }\n}\nexports.ClientInfoServiceImpl = ClientInfoServiceImpl;\n//# sourceMappingURL=ClientInfoServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=Models.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AskDataOptionNames = void 0;\nvar AskDataOptionNames;\n(function (AskDataOptionNames) {\n AskDataOptionNames[\"token\"] = \"token\";\n AskDataOptionNames[\"origin\"] = \"origin\";\n AskDataOptionNames[\"showEmbed\"] = \"showEmbed\";\n AskDataOptionNames[\"showPin\"] = \"showPin\";\n AskDataOptionNames[\"showSave\"] = \"showSave\";\n AskDataOptionNames[\"showShare\"] = \"showShare\";\n AskDataOptionNames[\"debug\"] = \":jsdebug\";\n AskDataOptionNames[\"ApiID\"] = \":apiID\";\n AskDataOptionNames[\"ApiExternalVersion\"] = \":apiExternalVersion\";\n AskDataOptionNames[\"ApiInternalVersion\"] = \":apiInternalVersion\";\n AskDataOptionNames[\"AskDataWebComponent\"] = \":askDataWebComponent\";\n})(AskDataOptionNames || (exports.AskDataOptionNames = AskDataOptionNames = {}));\n//# sourceMappingURL=AskDataInterface.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TableSummary = void 0;\n/**\n * Implementation of a table summary.\n * This does not follow the Impl pattern as it is just a property bag.\n */\nclass TableSummary {\n constructor(_tableInfo) {\n this._tableInfo = _tableInfo;\n }\n get name() {\n return this._tableInfo.name;\n }\n get id() {\n return this._tableInfo.id;\n }\n get connectionId() {\n return this._tableInfo.connectionId;\n }\n get customSQL() {\n return this._tableInfo.customSQL;\n }\n}\nexports.TableSummary = TableSummary;\n//# sourceMappingURL=TableSummary.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ServiceImplBase = void 0;\nconst InternalToExternalEnumMappings_1 = require(\"../../EnumMappings/InternalToExternalEnumMappings\");\nconst TableauError_1 = require(\"../../TableauError\");\nconst EnumConverter_1 = require(\"../../Utils/EnumConverter\");\n/**\n * Each ServceImpl should extend this base class for the sake of\n * proper error handling. This base handles the conversion\n * from internal errors to external errors that we throw to developers\n */\nclass ServiceImplBase {\n constructor(_dispatcher, _registryId) {\n this._dispatcher = _dispatcher;\n this._registryId = _registryId;\n }\n execute(verb, params) {\n return this._dispatcher.execute(verb, params).catch((error) => {\n // Any internal error that comes from the dispatcher should be converted\n // to an external error using the enum mapper for error codes.\n const internalError = error;\n const externalErrorCode = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.errorCode.convert(internalError.errorCode, EnumConverter_1.ShouldThrow.No);\n throw new TableauError_1.TableauError(externalErrorCode, internalError.message);\n });\n }\n}\nexports.ServiceImplBase = ServiceImplBase;\n//# sourceMappingURL=ServiceImplBase.js.map","(function () {\n 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\");\n\n function gen(count) {\n var out = \"\";\n for (var i=0; i 0 && requestedRows < rowCountLimit ? requestedRows : rowCountLimit;\n }\n getUnderlyingDataAsync(visualId, getType, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption, applyWorksheetFormatting) {\n // Create all of our parameters\n const summaryData = getType === GetDataService_1.GetDataType.Summary;\n const functionName = summaryData ? 'getSummaryDataAsync' : 'getUnderlyingDataAsync';\n const verb = summaryData ? api_internal_contract_js_1.VerbId.GetDataSummaryData : api_internal_contract_js_1.VerbId.GetUnderlyingData;\n const requestMaxRows = verb === api_internal_contract_js_1.VerbId.GetUnderlyingData ? this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1) : maxRows;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: functionName,\n };\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n parameters[api_internal_contract_js_1.ParameterId.IgnoreAliases] = ignoreAliases;\n parameters[api_internal_contract_js_1.ParameterId.IgnoreSelection] = ignoreSelection;\n parameters[api_internal_contract_js_1.ParameterId.IncludeAllColumns] = includeAllColumns;\n parameters[api_internal_contract_js_1.ParameterId.ColumnsToIncludeById] = this.verifyIncludeColumnArray(columnsToIncludeById);\n parameters[api_internal_contract_js_1.ParameterId.MaxRows] = requestMaxRows;\n parameters[api_internal_contract_js_1.ParameterId.ShowDataTableFormat] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption);\n parameters[api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting] = applyWorksheetFormatting;\n return this.execute(verb, parameters).then((response) => {\n const responseData = response.result;\n return this.processResultsTable(responseData.data, responseData.isSummary);\n });\n }\n getSummaryDataReaderAsync(visualId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption, applyWorksheetFormatting) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSummaryDataReaderAsync',\n [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(),\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount,\n [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases,\n [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection,\n [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns,\n [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById),\n [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetDataSummaryDataReader, parameters).then((response) => {\n const responseData = response.result;\n return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId);\n });\n }\n getSummaryColumnsInfoAsync(visualId) {\n // Create all the parameters for GetDataType of Summary with 1 row, and only native values\n // Then return just the columns\n const verb = api_internal_contract_js_1.VerbId.GetDataSummaryData;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSummaryColumnsInfoAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.IgnoreAliases]: true,\n [api_internal_contract_js_1.ParameterId.IgnoreSelection]: true,\n [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: true,\n [api_internal_contract_js_1.ParameterId.MaxRows]: 1,\n [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly,\n };\n return this.execute(verb, parameters).then((response) => {\n const underlyingDataTable = response.result;\n const dataTable = underlyingDataTable.data;\n const columns = dataTable.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index));\n return columns;\n });\n }\n getSelectedMarksAsync(visualId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSelectedMarksAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetSelectedMarks, parameters).then((response) => {\n const responseData = response.result;\n return {\n data: responseData.data.map((table) => this.processResultsTable(table, true)),\n };\n });\n }\n getHighlightedMarksAsync(visualId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getHighlightedMarksAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetHighlightedMarks, parameters).then((response) => {\n const responseData = response.result;\n return {\n data: responseData.data.map((table) => this.processResultsTable(table, true)),\n };\n });\n }\n getDataSourceDataAsync(dataSourceId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDataSourceDataAsync',\n [api_internal_contract_js_1.ParameterId.DataSourceId]: dataSourceId,\n [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases,\n [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1),\n [api_internal_contract_js_1.ParameterId.ColumnsToInclude]: this.verifyIncludeColumnArray(columnsToInclude),\n [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById),\n [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetDataSourceData, parameters).then((response) => {\n const responseData = response.result;\n return this.processResultsTable(responseData.data, false);\n });\n }\n getLogicalTableDataAsync(datasourceId, logicalTableId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTableDataAsync',\n [api_internal_contract_js_1.ParameterId.ColumnsToInclude]: columnsToInclude,\n [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById),\n [api_internal_contract_js_1.ParameterId.DataSourceId]: datasourceId,\n [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases,\n [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId,\n [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1),\n [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableData, parameters).then((response) => {\n const responseData = response.result;\n return this.processResultsTable(responseData.data, false);\n });\n }\n getLogicalTableDataReaderAsync(datasourceId, logicalTableId, pageRowCount, ignoreAliases, columnsToIncludeById, includeDataValuesOption) {\n pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit());\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getLogicalTableDataReaderAsync',\n [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(),\n [api_internal_contract_js_1.ParameterId.DataSourceId]: datasourceId,\n [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId,\n [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount,\n [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases,\n [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById),\n [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableDataReader, parameters).then((response) => {\n const responseData = response.result;\n return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId);\n });\n }\n getUnderlyingTableDataAsync(visualId, logicalTableId, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption, applyWorksheetFormatting) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTableDataAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId,\n [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases,\n [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection,\n [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns,\n [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById),\n [api_internal_contract_js_1.ParameterId.MaxRows]: this.getLimitedMaxRows(maxRows, this.getMaxRowLimit() + 1),\n [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableData, parameters).then((response) => {\n const responseData = response.result;\n return this.processResultsTable(responseData.data, false);\n });\n }\n getUnderlyingTableDataReaderAsync(visualId, logicalTableId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption, applyWorksheetFormatting) {\n pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit());\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getUnderlyingTableDataReaderAsync',\n [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(),\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.LogicalTableId]: logicalTableId,\n [api_internal_contract_js_1.ParameterId.IgnoreAliases]: ignoreAliases,\n [api_internal_contract_js_1.ParameterId.IgnoreSelection]: ignoreSelection,\n [api_internal_contract_js_1.ParameterId.IncludeAllColumns]: includeAllColumns,\n [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: this.verifyIncludeColumnArray(columnsToIncludeById),\n [api_internal_contract_js_1.ParameterId.ShowDataTableFormat]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.showDataTableFormatType.convert(includeDataValuesOption),\n [api_internal_contract_js_1.ParameterId.PageRowCount]: pageRowCount,\n [api_internal_contract_js_1.ParameterId.ApplyWorksheetFormatting]: applyWorksheetFormatting,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableDataReader, parameters).then((response) => {\n const responseData = response.result;\n return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId);\n });\n }\n getPageAsync(tableId, pageNumber, pageSize) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getPageAsync',\n [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(),\n [api_internal_contract_js_1.ParameterId.ViewDataTableId]: tableId,\n [api_internal_contract_js_1.ParameterId.DataRowIndex]: pageNumber * pageSize,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetDataTableReaderPage, parameters).then((response) => {\n const responseData = response.result;\n return this.processResultsPage(responseData, tableId === GetDataServiceImpl.summaryTableId ? true : false);\n });\n }\n releaseAsync(tableId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'release',\n [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(),\n [api_internal_contract_js_1.ParameterId.ViewDataTableId]: tableId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.ReleaseDataTableReader, parameters).then((response) => {\n return;\n });\n }\n verifyIncludeColumnArray(columns) {\n // columns must be a valid array\n if (!Array.isArray(columns)) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'columnsToInclude and columnsToIncludeById must be valid arrays');\n }\n // Remove any duplicates from the input array\n const columnsAsSet = new Set(columns);\n return Array.from(columnsAsSet);\n }\n processResultsTable(responseData, isSummary) {\n const headers = responseData.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index));\n // TODO This should be controlled by a flag indicating whether this api will respond marks info or not\n let marks;\n if (responseData.marks) {\n marks = responseData.marks.map((h) => new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId));\n }\n // Limit+1 is our sentinal that underlying data contains more rows than user is allowed to fetch.\n // Remove the last element so we always return MaxRowLimit\n const isTotalRowCountLimited = isSummary === false && responseData.dataTable.length === this.getMaxRowLimit() + 1;\n if (isTotalRowCountLimited) {\n responseData.dataTable.length -= 1;\n }\n const table = responseData.dataTable.map((row) => {\n return row.map((cell, index) => {\n return DataValueFactory_1.DataValueFactory.MakeTableDataValue(cell, headers[index].dataType);\n });\n });\n if (marks) {\n return new GetDataModels_1.DataTable(table, headers, table.length, isTotalRowCountLimited, isSummary, marks);\n }\n return new GetDataModels_1.DataTable(table, headers, table.length, isTotalRowCountLimited, isSummary);\n }\n processResultsPage(responseData, isSummary) {\n const headers = responseData.headers.map((h) => new GetDataModels_1.Column(h.fieldCaption, h.fieldName, h.dataType, h.isReferenced, h.index));\n let marks;\n if (responseData.marks) {\n marks = responseData.marks.map((h) => new GetDataModels_1.MarkInfo(h.type, h.color, h.tupleId));\n }\n const table = responseData.dataTable.map((row) => {\n return row.map((cell, index) => {\n return DataValueFactory_1.DataValueFactory.MakeTableDataValue(cell, headers[index].dataType);\n });\n });\n if (marks) {\n return new GetDataModels_1.DataTable(table, headers, table.length, false, isSummary, marks);\n }\n return new GetDataModels_1.DataTable(table, headers, table.length, false, isSummary);\n }\n}\nexports.GetDataServiceImpl = GetDataServiceImpl;\nGetDataServiceImpl.summaryTableId = '';\n//# sourceMappingURL=GetDataServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VersionNumber = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst TableauError_1 = require(\"./TableauError\");\n/**\n * Represents the current version of the extensions, embedding\n * and extensions-api-types library\n */\nclass VersionNumber {\n // private constructor so everyone uses the singleton instance\n // build numbers have this form: M.m.f-pre.N\n constructor(versionString, isAlpha) {\n const partStr = versionString.split('-');\n this.build = this.getBuildNumber(partStr[1]);\n versionString = partStr[0];\n const parts = versionString.split('.').map((p) => parseInt(p, 10));\n if (parts.length !== 3) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, `Invalid version number: ${versionString}`);\n }\n this.major = parts[0];\n this.minor = parts[1];\n this.fix = parts[2];\n this.isAlpha = isAlpha;\n }\n getBuildNumber(preReleaseString) {\n const noBuildNumber = -1;\n if (!preReleaseString) {\n return noBuildNumber;\n }\n // The preRelease string has this form: pre.N, but we don't depend on the actual string being 'pre'\n const partStr = preReleaseString.split('.');\n return partStr[1] ? parseInt(partStr[1], 10) : noBuildNumber;\n }\n get formattedValue() {\n return `${this.major}.${this.minor}.${this.fix}`;\n }\n get fullFormattedValue() {\n return `${this.major}.${this.minor}.${this.fix}-pre.${this.build}`;\n }\n}\nexports.VersionNumber = VersionNumber;\n//# sourceMappingURL=VersionNumber.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UIServiceImpl = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst DEFAULT_DIALOG_HEIGHT = 400; // in pixels\nconst DEFAULT_DIALOG_WIDTH = 600; // in pixels\nconst DEFAULT_DIALOG_STYLE = api_external_contract_js_1.DialogStyle.Window;\nclass UIServiceImpl extends api_shared_js_1.ServiceImplBase {\n get serviceName() {\n return \"UIService\" /* ExtensionsServiceNames.UIService */;\n }\n displayDialogAsync(url, payload, isExtensionDialog, options) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'displayDialogAsync',\n [api_internal_contract_js_1.ParameterId.ExtensionDialogUrl]: url,\n [api_internal_contract_js_1.ParameterId.ExtensionDialogPayload]: payload,\n };\n // The dialog url source refers to who is opening a new dialog (i.e. the dialog's parent).\n // If the host extension is opening a dialog we leave the source url as undefined to help us differentiate from other dialogs.\n if (isExtensionDialog) {\n parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogUrlSource] = window.location.href;\n }\n const h = options && options.height ? options.height : DEFAULT_DIALOG_HEIGHT;\n const w = options && options.width ? options.width : DEFAULT_DIALOG_WIDTH;\n const dialogStyle = options && options.dialogStyle ? options.dialogStyle : DEFAULT_DIALOG_STYLE;\n // On the platform side, we do something reasonable regardess of whether the passed\n // height and width are too large or too small. But this likely indicates a developer error,\n // so we throw an error here to help with debugging.\n if (h <= 0 || w <= 0) {\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'Size parameters for displayDialogAsync must be positive');\n }\n parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogH] = h;\n parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogW] = w;\n api_shared_js_1.ErrorHelpers.verifyEnumValue(dialogStyle, api_external_contract_js_1.DialogStyle, 'DialogStyle');\n parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogStyle] = api_shared_js_1.ExternalToInternalEnumMappings.dialogStyles.convert(dialogStyle);\n return this.execute(api_internal_contract_js_1.VerbId.DisplayDialog, parameters).then((response) => {\n const dialogResult = response.result;\n switch (dialogResult) {\n case api_internal_contract_js_1.ExtensionDialogResult.DialogAlreadyOpen:\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.DialogAlreadyOpen, 'There already exists an open dialog for this extension.');\n case api_internal_contract_js_1.ExtensionDialogResult.InvalidDomain:\n 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.');\n default:\n // Success case\n return;\n }\n });\n }\n closeDialog(payload, dialogUrl) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'closeDialog',\n [api_internal_contract_js_1.ParameterId.ExtensionDialogUrlSource]: window.location.href,\n };\n if (payload) {\n parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload;\n }\n if (dialogUrl) {\n parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = dialogUrl;\n }\n return this.execute(api_internal_contract_js_1.VerbId.CloseDialog, parameters).then(() => {\n return;\n });\n }\n sendDialogMessageAsync(message, targetDialogUrl) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'sendDialogMessage',\n [api_internal_contract_js_1.ParameterId.ExtensionDialogMessage]: message,\n [api_internal_contract_js_1.ParameterId.ExtensionDialogUrlSource]: window.location.href,\n };\n if (targetDialogUrl) {\n parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = targetDialogUrl;\n }\n return this.execute(api_internal_contract_js_1.VerbId.SendDialogMessage, parameters).then(() => {\n return;\n });\n }\n sendDialogMessageToParentAsync(message) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'sendMessageToParent',\n [api_internal_contract_js_1.ParameterId.ExtensionDialogMessage]: message,\n [api_internal_contract_js_1.ParameterId.ExtensionDialogUrlSource]: window.location.href,\n };\n return this.execute(api_internal_contract_js_1.VerbId.SendMessageToParent, parameters).then(() => {\n return;\n });\n }\n setClickThroughAsync(clickThroughEnabled, extensionZoneId) {\n api_shared_js_1.ErrorHelpers.verifyParameterType(clickThroughEnabled, 'boolean', 'clickThroughEnabled');\n if (extensionZoneId === undefined || extensionZoneId <= 0) {\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'Extension Id is invalid.');\n }\n const parameters = {\n [api_internal_contract_js_1.ParameterId.ExtensionZoneId]: extensionZoneId,\n [api_internal_contract_js_1.ParameterId.ClickThroughEnabled]: clickThroughEnabled,\n };\n return this.execute(api_internal_contract_js_1.VerbId.SetClickThrough, parameters).then(() => {\n return;\n });\n }\n}\nexports.UIServiceImpl = UIServiceImpl;\n//# sourceMappingURL=UIServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=InternalApiDispatcher.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DashboardImpl = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst InternalToExternalEnumMappings_1 = require(\"../EnumMappings/InternalToExternalEnumMappings\");\nconst Point_1 = require(\"../Point\");\nconst ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nconst TableauError_1 = require(\"../TableauError\");\nconst ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nconst DashboardObjectImpl_1 = require(\"./DashboardObjectImpl\");\nconst SheetImpl_1 = require(\"./SheetImpl\");\nconst SheetInfoImpl_1 = require(\"./SheetInfoImpl\");\nconst WorksheetImpl_1 = require(\"./WorksheetImpl\");\nclass DashboardImpl extends SheetImpl_1.SheetImpl {\n constructor(_sheetInfo, _zones, _sheetPath, _registryId, _parentStoryPointImpl, _activeDashboardObjectId = 0) {\n super(_sheetInfo, _registryId);\n this._zones = _zones;\n this._sheetPath = _sheetPath;\n this._parentStoryPointImpl = _parentStoryPointImpl;\n this._activeDashboardObjectId = _activeDashboardObjectId;\n }\n get worksheetsImpl() {\n return this._worksheetsImpl;\n }\n get objects() {\n return this._objects;\n }\n get parentStoryPoint() {\n return this._parentStoryPointImpl;\n }\n get activeDashboardObjectId() {\n return this._activeDashboardObjectId;\n }\n get activeDashboardName() {\n return this._sheetPath.sheetName;\n }\n initializeWithPublicInterfaces() {\n this._worksheetsImpl = new Array();\n this._objects = new Array();\n this.zoneMap = new Map();\n // Process all the zones which are contained in this dashboard\n for (const zone of this._zones) {\n let worksheetImpl = undefined;\n const zoneSize = { width: zone.width, height: zone.height };\n // As the dashboard is active, all other zones in the dashboard are inactive.\n const isActive = false;\n if (zone.zoneType === api_internal_contract_js_1.DashboardObjectType.Worksheet || zone.zoneType === api_internal_contract_js_1.DashboardObjectType.QuickFilter) {\n let worksheetName = '';\n let worksheetUrl = '';\n let isHidden = false;\n if (zone.sheetInfo) {\n // zone.sheetInfo was not initialized prior to internal-contract 1.6.0\n worksheetName = zone.sheetInfo.name;\n // worksheetUrl & isHidden is for Embedding only\n worksheetUrl = zone.sheetInfo.url || '';\n // If there's a url, then it's not hidden\n isHidden = worksheetUrl === '';\n }\n else {\n worksheetName = zone.name;\n }\n // Indexes, isActive and some more properties in sheetInfoImpl are embedding specific.\n // But we init them for both extensions and embedding as the Models will only use what is relevant.\n const sheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(worksheetName, api_external_contract_js_1.SheetType.Worksheet, zoneSize, this._worksheetsImpl.length, isActive, isHidden, worksheetUrl);\n const vizId = {\n worksheet: worksheetName,\n dashboard: this._sheetInfoImpl.name,\n storyboard: this._sheetPath.storyboard,\n flipboardZoneID: this._sheetPath.flipboardZoneID,\n storyPointID: this._sheetPath.storyPointID,\n };\n worksheetImpl = new WorksheetImpl_1.WorksheetImpl(sheetInfoImpl, this._registryId, vizId, this, this._parentStoryPointImpl);\n if (zone.zoneType === api_internal_contract_js_1.DashboardObjectType.Worksheet) {\n this._worksheetsImpl.push(worksheetImpl);\n }\n }\n const zonePoint = new Point_1.Point(zone.x, zone.y);\n 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\n zone.isVisible !== undefined ? zone.isVisible : true, // before 1.6.0 we didn't have isVisible, so we assume true\n zone.zoneId, zone.fieldId);\n this._objects.push(dashboardObjectImpl);\n this.zoneMap.set(zone.zoneId, dashboardObjectImpl);\n }\n }\n setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap) {\n const zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"zone-service\" /* ServiceNames.Zone */);\n return zoneService.setVisibilityAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectVisibilityMap);\n }\n getDashboardObjectById(dashboardObjectId) {\n return this.zoneMap.get(dashboardObjectId);\n }\n updateZones(newZones, newActiveZoneId = 0, newActiveDashboardName = '') {\n // getting previous dashboard objects, active zone ID and active dashboard name\n const oldDashboardObjects = this._objects;\n const oldZoneMap = this.zoneMap;\n const oldActiveZoneId = this._activeDashboardObjectId;\n const oldActiveDashboardName = this._sheetPath.sheetName;\n // updating zones and reinitializing instance variables\n this._zones = newZones;\n this._activeDashboardObjectId = newActiveZoneId;\n if (newActiveDashboardName) {\n this._sheetPath.sheetName = newActiveDashboardName;\n this._sheetInfoImpl.name = newActiveDashboardName;\n }\n this.initializeWithPublicInterfaces();\n // getting new dashboard objects\n const newDashboardObjects = this._objects;\n const newZoneMap = this.zoneMap;\n // initializing map for changes\n const zoneChanges = new Map();\n // comparing old dashboard objects with new ones\n oldDashboardObjects.forEach((oldObject) => {\n const oldId = oldObject.id;\n // checking if zone was removed\n if (!newZoneMap.has(oldId)) {\n this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Removed);\n return;\n }\n const newObject = newZoneMap.get(oldId);\n if (oldObject.isFloating !== newObject.isFloating) {\n this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.IsFloatingChanged);\n }\n if (oldObject.isVisible !== newObject.isVisible) {\n this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.IsVisibleChanged);\n }\n if (oldObject.name !== newObject.name) {\n this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.NameChanged);\n }\n if (oldObject.position.x !== newObject.position.x || oldObject.position.y !== newObject.position.y) {\n this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.PositionChanged);\n }\n if (oldObject.size.width !== newObject.size.width || oldObject.size.height !== newObject.size.height) {\n this.addChange(oldId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.SizeChanged);\n }\n });\n // Checking for any added zones\n newDashboardObjects.forEach((newObject) => {\n if (!oldZoneMap.has(newObject.id)) {\n this.addChange(newObject.id, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Added);\n }\n });\n // Checking if zone selection has changed\n if (oldActiveZoneId !== newActiveZoneId) {\n if (newActiveZoneId !== 0) {\n this.addChange(newActiveZoneId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Selected);\n }\n if (oldActiveZoneId !== 0) {\n this.addChange(oldActiveZoneId, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.Deselected);\n }\n }\n // Checking if switched to another dashboard\n if (newActiveDashboardName && oldActiveDashboardName !== newActiveDashboardName) {\n this.addChange(0, zoneChanges, api_external_contract_js_1.DashboardLayoutChange.DashboardChanged);\n }\n return zoneChanges;\n }\n addChange(zoneId, zoneChanges, change) {\n if (!zoneChanges.has(zoneId)) {\n zoneChanges.set(zoneId, []);\n }\n zoneChanges.get(zoneId).push(change);\n }\n moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray) {\n const zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"zone-service\" /* ServiceNames.Zone */);\n return zoneService.moveAndResizeAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectPositionAndSizeUpdateArray);\n }\n replayAnimationAsync(replaySpeed) {\n const animationService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"animation-service\" /* ServiceNames.Animation */);\n return animationService.replayAsync(replaySpeed);\n }\n getFiltersAsync() {\n this.verifyActiveSheetOrEmbeddedInActiveStoryPoint();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* ServiceNames.Filter */);\n return service.getDashboardFiltersAsync();\n }\n applyFilterAsync(fieldName, values, updateType, options) {\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'FilterUpdateType');\n ErrorHelpers_1.ErrorHelpers.verifyStringParameter(fieldName, 'fieldName');\n if (!Array.isArray(values)) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyDashboardFilterAsync must be an array');\n }\n this.verifyActiveSheetOrEmbeddedInActiveStoryPoint();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* ServiceNames.Filter */);\n return service.applyDashboardFilterAsync(fieldName, values, updateType, options);\n }\n // @W-12986439: remove once initializeWithPublicInterfaces is moved to the constructor for this class\n // This method only exists since worksheetsImpl can be undefined, but we need the worksheet names in the Export APIs\n getWorksheetNamesFromZones() {\n const worksheetNames = [];\n for (const zone of this._zones) {\n if (zone.zoneType !== api_internal_contract_js_1.DashboardObjectType.Worksheet) {\n continue;\n }\n // zone.sheetInfo was not initialized prior to internal-contract 1.6.0\n const worksheetName = zone.sheetInfo ? zone.sheetInfo.name : zone.name;\n worksheetNames.push(worksheetName);\n }\n return worksheetNames;\n }\n verifyActiveSheetOrEmbeddedInActiveStoryPoint() {\n const isRootAndActiveDashboard = this.active;\n const isWithinActiveStoryPoint = this.parentStoryPoint != null && this.parentStoryPoint.active;\n if (!isRootAndActiveDashboard && !isWithinActiveStoryPoint) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.NotActiveSheet, 'Operation not allowed on non-active sheet');\n }\n }\n}\nexports.DashboardImpl = DashboardImpl;\n//# sourceMappingURL=DashboardImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=TableauError.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ErrorHelpers = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst TableauError_1 = require(\"../TableauError\");\nconst Param_1 = require(\"./Param\");\n/**\n * This class is used to construct common errors throughout the external\n * projects (api-shared, extensions-api, etc.). It has some duplication with\n * the ErrorHelpers class in api-core, but is separate due to the need to throw\n * an external TableauError vs. an InternalTableauError.\n */\nclass ErrorHelpers {\n /**\n * Throws with code InternalError.\n *\n * @param apiName name of api that was called.\n */\n static apiNotImplemented(apiName) {\n return new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${apiName} API not yet implemented.`);\n }\n /**\n * Throws an internal error if argument is null or undefined.\n *\n * @param argumentValue value to verify\n * @param argumentName name of argument to verify\n */\n /*tslint:disable-next-line */\n static verifyInternalValue(argumentValue, argumentName) {\n if (argumentValue === null || argumentValue === undefined) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${argumentValue} is invalid value for: ${argumentName}`);\n }\n }\n /**\n * Throws an InvalidParameter error if argument is null or undefined.\n *\n * @param argumentValue value to verify\n * @param argumentName name of argument to verify\n */\n /*tslint:disable-next-line */\n static verifyParameter(argumentValue, argumentName) {\n if (argumentValue === null || argumentValue === undefined) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} is invalid value for parameter: ${argumentName}`);\n }\n }\n /**\n * Throws an InvalidParameter error if argument is not the specified type.\n * For objects, it just tests that it is an object\n *\n * @param argumentValue value to verify\n * @param expectedType expected result of typeof\n * @param argumentName name of argument to verify\n */\n /*tslint:disable-next-line */\n static verifyParameterType(argumentValue, expectedType, argumentName) {\n if (typeof argumentValue !== expectedType) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} has invalid type for parameter: ${argumentName}.`);\n }\n }\n /**\n * Throws an InvalidParameter error if argument is empty string, null or undefined.\n *\n * @param argumentValue value to verify\n * @param argumentName name of argument to verify\n */\n /*tslint:disable-next-line */\n static verifyStringParameter(argumentValue, argumentName) {\n if (argumentValue === null || argumentValue === undefined || argumentValue === '') {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${argumentValue} is invalid value for paramter: ${argumentName}`);\n }\n }\n /**\n * Verifies passed value is a valid value for that enum.\n *\n * String enums are {string : string} dictionaries which are not reverse mappable\n * This is an ugly workaround\n *\n * @param enumValue value to verify\n * @param enumType enum to verify against\n */\n /*tslint:disable-next-line */\n static isValidEnumValue(enumValue, enumType) {\n let isValid = false;\n Object.keys(enumType).forEach((enumKey) => {\n if (enumType[enumKey] === enumValue.toString()) {\n isValid = true;\n }\n });\n return isValid;\n }\n /**\n * Verifies passed value is a valid value for that enum.\n * Throws an InvalidParameter error if the enum value is not valid.\n *\n * String enums are {string : string} dictionaries which are not reverse mappable\n * This is an ugly workaround\n *\n * @param enumValue value to verify\n * @param enumType enum to verify against\n * @param enumName enum name for clear error message\n */\n /*tslint:disable-next-line */\n static verifyEnumValue(enumValue, enumType, enumName) {\n if (!ErrorHelpers.isValidEnumValue(enumValue, enumType)) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${enumValue} is invalid value for enum: ${enumName}.`);\n }\n }\n /**\n * Verifies passed value is between [min, max) ... min <= value < max\n * Throws an InvalidParameter error if the value is not valid.\n *\n *\n * @param value value to verify\n * @param min value must be >= min\n * @param max value must be < max\n */\n static verifyRange(value, min, max) {\n let isValid = min <= value && value < max;\n if (!isValid) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `${value} is invalid value for range: [${min}..${max})`);\n }\n }\n /**\n * Verifies the params min and max for applying range filter.\n * Throws with error code InvalidParameter if range is invalid.\n *\n * @param min range min\n * @param max range max\n */\n static verifyRangeParamType(min, max) {\n const isMinDefined = min !== undefined;\n const isMaxDefined = max !== undefined;\n if (!isMinDefined && !isMaxDefined) {\n 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.');\n }\n if (isMinDefined && !Param_1.Param.isTypeNumber(min) && !Param_1.Param.isTypeDate(min)) {\n 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.');\n }\n if (isMaxDefined && !Param_1.Param.isTypeNumber(max) && !Param_1.Param.isTypeDate(max)) {\n 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.');\n }\n if (isMinDefined && isMaxDefined && typeof min !== typeof max) {\n 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.');\n }\n }\n /**\n * Verifies that the zoneId is present in the current dashboard.\n * Throws with error code InvalidParameter if either condition is false.\n *\n * @param dashboardZoneMap A map of zoneId's to the corresponding dashboard object.\n * @param zoneID ZoneId to be validated\n */\n static verifyZoneIsValid(dashboardZoneMap, zoneID) {\n if (dashboardZoneMap.has(zoneID)) {\n return;\n }\n 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.`);\n }\n /**\n * Verifies that the zone is present and floating in the current dashboard.\n * Throws with error code InvalidParameter if either condition is false.\n *\n * @param dashboardZoneMap A map of zoneId's to the corresponding dashboard object.\n * @param zoneID ZoneId to be validated\n */\n static verifyZoneIsValidAndFloating(dashboardZoneMap, zoneID) {\n if (dashboardZoneMap.has(zoneID) && dashboardZoneMap.get(zoneID).isFloating) {\n return;\n }\n 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.`);\n }\n /**\n * Verifies that width and height are > 0 for each DashboardObjectPositionAndSizeUpdate object.\n * Throws with error code InvalidParameter if either condition is false.\n *\n * @param dashboardObjectPositionAndSizeUpdate DashboardObjectPositionAndSizeUpdate object for which width and height will be validated\n */\n static verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(dashboardObjectPositionAndSizeUpdate) {\n if (dashboardObjectPositionAndSizeUpdate.width < 0 || dashboardObjectPositionAndSizeUpdate.height < 0) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, `Unexpected invalid param value for dashboard object ID ${dashboardObjectPositionAndSizeUpdate.dashboardObjectID}:` +\n ` negative widths and heights are not allowed.`);\n }\n }\n /**\n * Verifies is the given sheet name is in the list of sheets names allowed for exporting.\n * Throws with error code InvalidParameter if the condition above is false.\n *\n * @param exportableSheetNames A list of sheet names allowed for exporting\n * @param sheetName the name of the sheet selected for export\n */\n static verifySheetName(exportableSheetNames, sheetName) {\n if (!exportableSheetNames.includes(sheetName)) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidSelectionSheet, 'sheetName parameter must belong to a worksheet within the current view');\n }\n }\n /**\n * Verifies the ExportDataOptions object\n * Throws with error code InvalidParameter if the parameter is not of ExportDataOptions type.\n *\n * @param options The ExportDataOptions object used to configure the output CSV file for exportDataAsync.\n */\n static verifyExportDataOptions(options) {\n if ((!Param_1.Param.isNullOrUndefined(options.ignoreAliases) && !Param_1.Param.isTypeBool(options.ignoreAliases)) ||\n (!Param_1.Param.isNullOrUndefined(options.columnsToIncludeById) && !Array.isArray(options.columnsToIncludeById)))\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'options paramater must be of type ExportDataOptions');\n }\n /**\n * Verifies if the sheet names are included in any of the export scenarios.\n * Throws with error code InvalidParameter if the parameter is not an array.\n * 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.\n *\n * @param sheetNames List of sheet names selected for exporting.\n * @param exportScenarios an object containing the current sheet name, exportable sheets from the dashboard, and exportable sheets from the workbook.\n */\n static verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios) {\n if (!Array.isArray(sheetNames))\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'sheetNames parameter must be an array');\n if (sheetNames.length === 0)\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'sheetNames should not be empty');\n const isIncludedInDashboard = sheetNames.every((sheetName) => exportScenarios.exportableSheetNamesFromDashboard.includes(sheetName));\n if (isIncludedInDashboard) {\n return;\n }\n const isIncludedInWorkbook = sheetNames.every((sheetName) => exportScenarios.exportableSheetNamesFromWorkbook.includes(sheetName));\n if (isIncludedInWorkbook) {\n return;\n }\n const isCurrentSheet = sheetNames.length === 1 && sheetNames[0] === exportScenarios.currentSheetName;\n if (isCurrentSheet) {\n return;\n }\n // Export requirement: all sheet names must be included in the list of exportable sheets in the dashboard or\n // all sheet names must be included in the list of exportable sheets in the workbook, or the sheet name is the current sheet\n 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');\n }\n /**\n * Verifies the external ExportPDFOptions object's properties.\n * Throws with error code InvalidParameter if the parameter is not of external ExportPDFOptions type.\n *\n * @param options The external user-facing ExportPDFOptions object used to configure the output PDF file for exportPDFAsync.\n */\n static verifyExportPDFOptions(options) {\n try {\n this.verifyEnumValue(options.orientation, api_external_contract_js_1.PrintOrientation, 'PrintOrientation');\n this.verifyEnumValue(options.pageSize, api_external_contract_js_1.PrintPageSize, 'PrintPageSize');\n this.verifyEnumValue(options.scaling, api_external_contract_js_1.PrintScaling, 'PrintScaling');\n }\n catch (_a) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidParameter, 'options parameter must be of type ExportPDFOptions');\n }\n }\n}\nexports.ErrorHelpers = ErrorHelpers;\n//# sourceMappingURL=ErrorHelpers.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=WorkbookFormattingInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CustomViewImpl = void 0;\nconst ApiShared_1 = require(\"../../ApiShared\");\nclass CustomViewImpl {\n constructor(customViewModel, _registryId) {\n this._registryId = _registryId;\n this._luid = customViewModel.luid;\n this._name = customViewModel.name;\n this._shared = customViewModel.shared;\n this._isDefault = customViewModel.isDefault;\n this._ownerName = customViewModel.owner.userFriendlyName;\n this._url = customViewModel.url;\n }\n get luid() {\n return this._luid;\n }\n get name() {\n return this._name;\n }\n set name(name) {\n this._name = name;\n }\n get shared() {\n return this._shared;\n }\n set shared(shared) {\n this._shared = shared;\n }\n get isDefault() {\n return this._isDefault;\n }\n set isDefault(isDefault) {\n this._isDefault = isDefault;\n }\n get ownerName() {\n return this._ownerName;\n }\n get url() {\n return this._url;\n }\n saveAsync() {\n const service = ApiShared_1.ApiServiceRegistry.get(this._registryId).getService(\"viz-service\" /* ServiceNames.Viz */);\n return service.saveAsync(this);\n }\n}\nexports.CustomViewImpl = CustomViewImpl;\n//# sourceMappingURL=CustomViewImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DataTypeConverter = void 0;\nconst Enums_1 = require(\"./Enums\");\nclass DataTypeConverter {\n static isSpecial(valueAsString) {\n // Prior to ShowDataTablePresModel, special values come to us as\n // '%null%', '%all%', '%wildcard%', '%missing%'...\n // While this function will never return true for ShowDataTablePresModel conversion,\n // it is as cheap as passing around a version and checking that.\n // (See DataValueFormatter.cpp)\n if (valueAsString.length > 2 && valueAsString[0] === '%' && valueAsString[valueAsString.length - 1] === '%') {\n return true;\n }\n return false;\n }\n // tslint:disable-next-line:no-any\n static parseBoolean(booleanString) {\n // boolean values come to us as 'true'|'false'\n const normalizedBoolean = booleanString.toLowerCase();\n return normalizedBoolean !== 'true' && normalizedBoolean !== 'false' ? this.specialValueIndicator : normalizedBoolean === 'true';\n }\n // tslint:disable-next-line:no-any\n static parseNumber(valueAsString) {\n const value = Number(valueAsString);\n return isNaN(value) ? this.specialValueIndicator : value;\n }\n static parseDate(dateAsString) {\n // Note that without a time, the date is assumed to be UTC\n // Input of 2020-03-25 is printed as: Mar 24 2020 17:00:00 GMT-0700\n // This matches style used in existing convertFilterValuePresModel\n const value = new Date(dateAsString);\n return Number.isNaN(value.getTime()) ? null : value;\n }\n static parseDateTime(dateAsString) {\n // With a time, the date is assumed to be UTC.\n // Our date format is always: yyyy-mm-dd hh:mm:ss\n // Unfortunately, IE11 can't parse that format so we add a T between the day and time.\n // We also add a Z so that it is UTC. (Without the Z, some browsers assume local, and others UTC)\n // Even though we've dropped support for IE11, it's riskier/costlier to make updates here.\n const formattedDateString = dateAsString.replace(' ', 'T').concat('Z');\n const value = new Date(formattedDateString);\n return Number.isNaN(value.getTime()) ? null : value;\n }\n // It would be nice to merge this and the method FilterConverter::convertFilterValuePresModel in api-platform-js\n static convertValueAsStringToValue(valueAsString, type) {\n // This is both DataDictionary and ShowDataTablePresModel compatible.\n // In the DataDictionary, valueAsString can be '%null%' or '%missing%', while in\n // ShowDataTablePresModel, we can get 'null' or 'missing', or '%null%' for string special values.\n // For either of these cases, we return specialValueIndicator (or the original special string).\n // To maintain backwards compatibilty, this converter:\n // 1. returns a string for any special values\n // 2. returns a string for any date\n // Parameter min/max values can be undefined, so result is also undefined\n if (valueAsString === undefined || valueAsString === null) {\n return undefined;\n }\n if (this.isSpecial(valueAsString)) {\n return valueAsString;\n }\n switch (type) {\n case Enums_1.DataType.Bool:\n return this.parseBoolean(valueAsString);\n case Enums_1.DataType.Int:\n case Enums_1.DataType.Float:\n // Return special value '%null%' for any failure in parsing.\n // We need to do that because ShowDataTablePresModel will give us strings like 'null'\n // for special values.\n return this.parseNumber(valueAsString);\n case Enums_1.DataType.Date:\n // For ShowDataTablePresModel, special values will be \"null\" which will fail to parse.\n // In that case, we return '%null%'.\n return this.parseDate(valueAsString) === null ? this.specialValueIndicator : valueAsString;\n case Enums_1.DataType.DateTime:\n // For ShowDataTablePresModel, special values will be \"null\" which will fail to parse.\n // In that case, we return '%null%'\n return this.parseDateTime(valueAsString) === null ? this.specialValueIndicator : valueAsString;\n case Enums_1.DataType.Spatial:\n case Enums_1.DataType.String:\n default:\n return valueAsString;\n }\n }\n // tslint:disable-next-line:no-any\n static convertValueToNativeValue(value, type) {\n // This converts from our 1.2 API that returns strings for specials, and dates as strings.\n // It takes the special case of '%null%' and returns a null.\n // For dates, it returns a Date object rather than a string.\n // convertValueToNativeValue should be used to build a DataValue.nativeValue field.\n // Parameter min/max can be undefined. If that is the case, nativeValue is treated like a special\n if (value === undefined || value === null) {\n return null;\n }\n switch (type) {\n case Enums_1.DataType.Bool:\n return typeof value === 'string' ? null : value;\n case Enums_1.DataType.Int:\n case Enums_1.DataType.Float:\n return typeof value === 'string' ? null : value;\n case Enums_1.DataType.Date:\n // Convert the string to Date object (or null if parsing fails ... we assume special)\n return this.parseDate(value);\n case Enums_1.DataType.DateTime:\n // Convert the string to Date object (or null if parsing fails ... we assume special)\n return this.parseDateTime(value);\n case Enums_1.DataType.String:\n return this.isSpecial(value) ? null : value;\n case Enums_1.DataType.Spatial:\n default:\n return value;\n }\n }\n // tslint:disable-next-line:no-any\n static convertStringValueToNativeValue(value, type) {\n // This handles the conversion from string directly to native value for all types\n return this.convertValueToNativeValue(this.convertValueAsStringToValue(value, type), type);\n }\n}\nexports.DataTypeConverter = DataTypeConverter;\nDataTypeConverter.specialValueIndicator = '%null%';\n//# sourceMappingURL=DataTypeConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SupportedBentonSansFontFaces = exports.BentonSansMediumFontFaceName = exports.BentonSansLightFontFaceName = exports.BentonSansSemiDemiItalicFontFaceName = exports.BentonSansSemiDemiFontFaceName = exports.BentonSansBookItalicFontFaceName = exports.BentonSansBookFontFaceName = exports.BentonSansLowDPIFontFamilyName = exports.BentonSansFontFamilyName = void 0;\nexports.BentonSansFontFamilyName = 'Benton Sans';\nexports.BentonSansLowDPIFontFamilyName = 'Benton Sans Low-DPI';\nexports.BentonSansBookFontFaceName = 'Benton Sans Book';\nexports.BentonSansBookItalicFontFaceName = 'Benton Sans Book Italic';\nexports.BentonSansSemiDemiFontFaceName = 'Benton Sans SemiDemi';\nexports.BentonSansSemiDemiItalicFontFaceName = 'Benton Sans SemiDemi Italic';\nexports.BentonSansLightFontFaceName = 'Benton Sans Light';\nexports.BentonSansMediumFontFaceName = 'Benton Sans Medium';\nexports.SupportedBentonSansFontFaces = [\n exports.BentonSansBookFontFaceName,\n exports.BentonSansBookItalicFontFaceName,\n exports.BentonSansSemiDemiFontFaceName,\n exports.BentonSansSemiDemiItalicFontFaceName,\n exports.BentonSansLightFontFaceName,\n exports.BentonSansMediumFontFaceName,\n];\n//# sourceMappingURL=BentonSansFontNameConstants.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PulseChildElementAttributes = exports.PulseChildElements = exports.PulseAttributes = void 0;\n/**\n * The names of the string constants you can use as HTML attributes for the web component.\n * @ignore\n */\nvar PulseAttributes;\n(function (PulseAttributes) {\n PulseAttributes[\"DisableExploreFilter\"] = \"disable-explore-filter\";\n PulseAttributes[\"Layout\"] = \"layout\";\n PulseAttributes[\"OnFirstInteractive\"] = \"onFirstInteractive\";\n PulseAttributes[\"OnFirstPulseMetricSizeKnown\"] = \"onFirstPulseMetricSizeKnown\";\n PulseAttributes[\"OnPulseUrlError\"] = \"onPulseError\";\n PulseAttributes[\"OnPulseFiltersChanged\"] = \"onPulseFiltersChanged\";\n PulseAttributes[\"OnPulseInsightDiscovered\"] = \"onPulseInsightDiscovered\";\n PulseAttributes[\"OnPulseMetricSizeChanged\"] = \"onPulseMetricSizeChanged\";\n PulseAttributes[\"OnPulseTimeDimensionChanged\"] = \"onPulseTimeDimensionChanged\";\n PulseAttributes[\"OnPulseUrlChanged\"] = \"onPulseUrlChanged\";\n PulseAttributes[\"TimeDimension\"] = \"time-dimension\";\n PulseAttributes[\"TokenOptional\"] = \"token-optional\";\n})(PulseAttributes || (exports.PulseAttributes = PulseAttributes = {}));\n/**\n * The names of the string constants you can use as child tags for TableauPulse custom element.\n */\nvar PulseChildElements;\n(function (PulseChildElements) {\n /**\n * Custom styles applicable to the embedded iframe element itself (not inside it).\n */\n PulseChildElements[\"IframeStyle\"] = \"iframe-style\";\n /**\n * A parameter to be used in the Pulse theme.\n */\n PulseChildElements[\"ThemeParameter\"] = \"theme-parameter\";\n /**\n * Contains a list of filter parameters.\n */\n PulseChildElements[\"PulseFilter\"] = \"pulse-filter\";\n})(PulseChildElements || (exports.PulseChildElements = PulseChildElements = {}));\n/**\n * The attributes of the child elements of .\n */\nvar PulseChildElementAttributes;\n(function (PulseChildElementAttributes) {\n PulseChildElementAttributes[\"Name\"] = \"name\";\n PulseChildElementAttributes[\"Field\"] = \"field\";\n PulseChildElementAttributes[\"Value\"] = \"value\";\n PulseChildElementAttributes[\"Type\"] = \"type\";\n})(PulseChildElementAttributes || (exports.PulseChildElementAttributes = PulseChildElementAttributes = {}));\n//# sourceMappingURL=PulseInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TableauError = void 0;\n/**\n * Custom error class that extends the default JavaScript Error object.\n * This allows us to provide a field with a specific error code\n * so that developers can more easily programmatically respond\n * to error scenarios.\n */\nclass TableauError extends Error {\n constructor(_errorCode, message) {\n super(`${_errorCode}: ${message}`);\n this._errorCode = _errorCode;\n /*tslint:disable-next-line */\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n // Error inheritance does not work propertly when compiling to ES5, this is a workaround to force\n // the proto chain to be built correctly. See the github link above for details.\n Object.setPrototypeOf(this, TableauError.prototype);\n }\n get errorCode() {\n return this._errorCode;\n }\n}\nexports.TableauError = TableauError;\n//# sourceMappingURL=TableauError.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VisualModelServiceImpl = void 0;\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass VisualModelServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"visual-model-service\" /* ServiceNames.VisualModel */;\n }\n getVisualSpecificationAsync(visualId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getVisualSpecificationAsync',\n [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetVisualSpecification, parameters).then((response) => {\n const result = response.result;\n return result;\n });\n }\n addMarksCardFieldsAsync(visualId, marksCardIndex, encodingType, columns, startIndex) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'addMarksCardFieldsAsync',\n [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet,\n [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex,\n [api_internal_contract_js_1.ParameterId.EncodingType]: encodingType,\n [api_internal_contract_js_1.ParameterId.Columns]: columns,\n [api_internal_contract_js_1.ParameterId.StartIndex]: startIndex,\n };\n return this.execute(api_internal_contract_js_1.VerbId.AddMarksCardFields, parameters).then(() => {\n return;\n });\n }\n moveMarksCardFieldAsync(visualId, marksCardIndex, fromIndex, toIndex, fieldCount = 1) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'addMarksCardFieldsAsync',\n [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet,\n [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex,\n [api_internal_contract_js_1.ParameterId.FromIndex]: fromIndex,\n [api_internal_contract_js_1.ParameterId.ToIndex]: toIndex,\n [api_internal_contract_js_1.ParameterId.FieldCount]: fieldCount,\n };\n return this.execute(api_internal_contract_js_1.VerbId.MoveMarksCardField, parameters).then(() => {\n return;\n });\n }\n spliceMarksCardFieldsAsync(visualId, marksCardIndex, encodingType, startIndex, deleteCount, columns) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'spliceMarksCardFieldsAsync',\n [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet,\n [api_internal_contract_js_1.ParameterId.MarksCardIndex]: marksCardIndex,\n [api_internal_contract_js_1.ParameterId.EncodingType]: encodingType,\n [api_internal_contract_js_1.ParameterId.StartIndex]: startIndex,\n [api_internal_contract_js_1.ParameterId.DeleteCount]: deleteCount,\n [api_internal_contract_js_1.ParameterId.Columns]: columns,\n };\n return this.execute(api_internal_contract_js_1.VerbId.SpliceMarksCardFields, parameters).then(() => {\n return;\n });\n }\n editAliasesDialogAsync(fieldName) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'editAliasesDialogAsync',\n [api_internal_contract_js_1.ParameterId.FieldId]: fieldName,\n };\n return this.execute(api_internal_contract_js_1.VerbId.EditAliasesDialog, parameters).then(() => {\n return;\n });\n }\n}\nexports.VisualModelServiceImpl = VisualModelServiceImpl;\n//# sourceMappingURL=VisualModelServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VizChildElementAttributes = exports.VizChildElements = exports.VizAuthoringAttributes = exports.VizAttributes = exports.VizSharedAttributes = void 0;\n/**\n * The shared string constants you can use as HTML attributes for the and web component.\n * @ignore\n */\nvar VizSharedAttributes;\n(function (VizSharedAttributes) {\n VizSharedAttributes[\"TouchOptimize\"] = \"touch-optimize\";\n VizSharedAttributes[\"HideEditInDesktopButton\"] = \"hide-edit-in-desktop-button\";\n VizSharedAttributes[\"SuppressDefaultEditBehavior\"] = \"suppress-default-edit-behavior\";\n VizSharedAttributes[\"DisableVersionCheck\"] = \"disable-version-check\";\n VizSharedAttributes[\"OnEditInDesktopButtonClicked\"] = \"onEditInDesktopButtonClicked\";\n VizSharedAttributes[\"OnFirstVizSizeKnown\"] = \"onFirstVizSizeKnown\";\n VizSharedAttributes[\"OnFirstInteractive\"] = \"onFirstInteractive\";\n})(VizSharedAttributes || (exports.VizSharedAttributes = VizSharedAttributes = {}));\n/**\n * The names of the string constants you can use as HTML attributes for the web component.\n * @ignore\n */\nvar VizAttributes;\n(function (VizAttributes) {\n VizAttributes[\"DisableUrlActionsPopups\"] = \"disable-url-actions\";\n VizAttributes[\"HideTabs\"] = \"hide-tabs\";\n VizAttributes[\"Toolbar\"] = \"toolbar\";\n VizAttributes[\"InstanceIdToClone\"] = \"instance-id-to-clone\";\n VizAttributes[\"Device\"] = \"device\";\n VizAttributes[\"HideEditButton\"] = \"hide-edit-button\";\n VizAttributes[\"OnEditButtonClicked\"] = \"onEditButtonClicked\";\n VizAttributes[\"OnFilterChanged\"] = \"onFilterChanged\";\n VizAttributes[\"OnCustomMarkContextMenuEvent\"] = \"onCustomMarkContextMenuEvent\";\n VizAttributes[\"OnMarkSelectionChanged\"] = \"onMarkSelectionChanged\";\n VizAttributes[\"OnParameterChanged\"] = \"onParameterChanged\";\n VizAttributes[\"OnToolbarStateChanged\"] = \"onToolbarStateChanged\";\n VizAttributes[\"OnUrlAction\"] = \"onUrlAction\";\n VizAttributes[\"OnTabSwitched\"] = \"onTabSwitched\";\n VizAttributes[\"OnCustomViewLoaded\"] = \"onCustomViewLoaded\";\n VizAttributes[\"OnCustomViewRemoved\"] = \"onCustomViewRemoved\";\n VizAttributes[\"OnCustomViewSaved\"] = \"onCustomViewSaved\";\n VizAttributes[\"OnCustomViewSetDefault\"] = \"onCustomViewSetDefault\";\n VizAttributes[\"OnStoryPointSwitched\"] = \"onStoryPointSwitched\";\n VizAttributes[\"OnSummaryDataChanged\"] = \"onSummaryDataChanged\";\n VizAttributes[\"OnReadyToReceiveAuthToken\"] = \"onReadyToReceiveAuthToken\";\n})(VizAttributes || (exports.VizAttributes = VizAttributes = {}));\n/**\n * The names of the string constants you can use as HTML attributes for the web component.\n * @ignore\n */\nvar VizAuthoringAttributes;\n(function (VizAuthoringAttributes) {\n VizAuthoringAttributes[\"OnWorkbookPublished\"] = \"onWorkbookPublished\";\n VizAuthoringAttributes[\"OnWorkbookPublishedAs\"] = \"onWorkbookPublishedAs\";\n VizAuthoringAttributes[\"OnWorkbookReadyToClose\"] = \"onWorkbookReadyToClose\";\n VizAuthoringAttributes[\"HideCloseButton\"] = \"hide-close-button\";\n})(VizAuthoringAttributes || (exports.VizAuthoringAttributes = VizAuthoringAttributes = {}));\n/**\n * The names of the string constants you can use as child tags for TableauViz and TableauAuthoringViz custom elements.\n */\nvar VizChildElements;\n(function (VizChildElements) {\n /**\n * Contains a list of filter parameters. Available only in viewing mode.\n */\n VizChildElements[\"VizFilter\"] = \"viz-filter\";\n /**\n * Contains a name and value for a parameter. Available only in viewing mode.\n */\n VizChildElements[\"VizParameter\"] = \"viz-parameter\";\n /**\n * Contains a list of custom parameters. Available in both viewing and authoring modes.\n */\n VizChildElements[\"CustomParameter\"] = \"custom-parameter\";\n /**\n * Custom styles applicable to the embedded iframe element itself (not inside it). Available in both viewing and authoring modes.\n */\n VizChildElements[\"IframeStyle\"] = \"iframe-style\";\n})(VizChildElements || (exports.VizChildElements = VizChildElements = {}));\nvar VizChildElementAttributes;\n(function (VizChildElementAttributes) {\n VizChildElementAttributes[\"Field\"] = \"field\";\n VizChildElementAttributes[\"Value\"] = \"value\";\n VizChildElementAttributes[\"Name\"] = \"name\";\n})(VizChildElementAttributes || (exports.VizChildElementAttributes = VizChildElementAttributes = {}));\n//# sourceMappingURL=VizInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ParameterImpl = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst InternalToExternalEnumMappings_1 = require(\"../EnumMappings/InternalToExternalEnumMappings\");\nconst ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nconst DataValueFactory_1 = require(\"../Utils/DataValueFactory\");\nconst ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nconst Param_1 = require(\"../Utils/Param\");\nclass ParameterImpl {\n constructor(parameterInfo, _registryId) {\n this._registryId = _registryId;\n this.setParameterInfo(parameterInfo);\n }\n get name() {\n return this._parameterInfo.name;\n }\n get currentValue() {\n return DataValueFactory_1.DataValueFactory.MakeParameterDataValue(this._parameterInfo.currentValue, this._parameterInfo.dataType);\n }\n get dataType() {\n return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dataType.convert(this._parameterInfo.dataType);\n }\n get id() {\n return this._globalFieldName;\n }\n get allowableValues() {\n return this._allowableValues;\n }\n changeValueAsync(newValue) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(newValue, 'newValue');\n const coercedValue = Param_1.Param.serializeParameterValue(newValue);\n const parametersService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"parameters-service\" /* ServiceNames.Parameters */);\n return parametersService.changeParameterValueAsync(this._globalFieldName, coercedValue).then((parameterInfo) => {\n this.setParameterInfo(parameterInfo);\n return this.currentValue;\n });\n }\n setParameterInfo(parameterInfo) {\n this._parameterInfo = parameterInfo;\n this._globalFieldName = parameterInfo.fieldName;\n const type = InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.allowableValues.convert(parameterInfo.allowableValuesType);\n let listValues;\n let minValue;\n let maxValue;\n let stepSize;\n let dateStepPeriod;\n if (type === api_external_contract_js_1.ParameterValueType.List) {\n const values = parameterInfo.allowableValues || [];\n listValues = values.map((val) => DataValueFactory_1.DataValueFactory.MakeParameterDataValue(val, parameterInfo.dataType));\n }\n else if (type === api_external_contract_js_1.ParameterValueType.Range) {\n minValue = parameterInfo.minValue && DataValueFactory_1.DataValueFactory.MakeParameterDataValue(parameterInfo.minValue, parameterInfo.dataType);\n maxValue = parameterInfo.maxValue && DataValueFactory_1.DataValueFactory.MakeParameterDataValue(parameterInfo.maxValue, parameterInfo.dataType);\n stepSize = parameterInfo.stepSize;\n dateStepPeriod = parameterInfo.dateStepPeriod && InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.dateStepPeriod.convert(parameterInfo.dateStepPeriod);\n }\n this._allowableValues = {\n type: type,\n allowableValues: listValues,\n minValue: minValue,\n maxValue: maxValue,\n stepSize: stepSize,\n dateStepPeriod: dateStepPeriod,\n };\n }\n}\nexports.ParameterImpl = ParameterImpl;\n//# sourceMappingURL=ParameterImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=SelectionInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UI = void 0;\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\n/**\n * Implementation of the external UI namespace.\n */\nclass UI extends api_shared_js_1.EventListenerManager {\n constructor(_impl) {\n super();\n this._impl = _impl;\n // Initialize our event handling for this class\n this._impl.initializeEvents().forEach((e) => this.addNewEventType(e));\n }\n displayDialogAsync(url, payload, options) {\n return this._impl.displayDialogAsync(url, payload, options);\n }\n sendDialogMessageAsync(message, targetDialogUrl) {\n return this._impl.sendDialogMessageAsync(message, targetDialogUrl);\n }\n sendDialogMessageToParentAsync(message) {\n return this._impl.sendDialogMessageToParentAsync(message);\n }\n closeDialog(payload, dialogUrl) {\n this._impl.closeDialog(payload, dialogUrl);\n }\n}\nexports.UI = UI;\n//# sourceMappingURL=UI.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DashboardContent = void 0;\n/**\n * Implementation of the external DashboardContent namespace.\n * This does not follow the Impl pattern as DashboardContent is\n * currently just a (single) property bag.\n */\nclass DashboardContent {\n constructor(_dashboard) {\n this._dashboard = _dashboard;\n }\n get dashboard() {\n return this._dashboard;\n }\n}\nexports.DashboardContent = DashboardContent;\n//# sourceMappingURL=DashboardContent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UIImpl = exports.TableauDialogError = exports.DialogMessageEvent = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst TableauEvent_1 = require(\"../Events/TableauEvent\");\nconst ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nclass DialogMessageEvent extends TableauEvent_1.TableauEvent {\n constructor(message, sourceDialogUrl) {\n super(Contract.TableauEventType.DialogMessageReceived);\n this.message = message;\n this.sourceDialogUrl = sourceDialogUrl;\n }\n}\nexports.DialogMessageEvent = DialogMessageEvent;\n/**\n * Custom error class that extends the TableauError object.\n * Includes context for which dialog caused the exception via its url.\n */\nclass TableauDialogError extends api_shared_js_1.TableauError {\n constructor(_errorCode, message) {\n super(_errorCode, message);\n /*tslint:disable-next-line */\n // https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n // Error inheritance does not work propertly when compiling to ES5, this is a workaround to force\n // the proto chain to be built correctly. See the github link above for details.\n Object.setPrototypeOf(this, TableauDialogError.prototype);\n }\n}\nexports.TableauDialogError = TableauDialogError;\nclass UIImpl {\n constructor(isExtensionDialog) {\n this.isExtensionDialog = isExtensionDialog;\n }\n displayDialogAsync(url, payload, options) {\n const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"UIService\" /* ExtensionsServiceNames.UIService */);\n const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* ServiceNames.Notification */);\n return new Promise((resolve, reject) => {\n uiService\n .displayDialogAsync(url, payload || '', this.isExtensionDialog, options)\n .then(() => {\n const unregisterFn = notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogUpdate, () => {\n // Let through any dialog update event\n return true;\n }, (event) => {\n if (event.isCloseEvent) {\n if (event.closePayload === undefined) {\n throw new TableauDialogError(Contract.ErrorCodes.InternalError, 'closePayload is undefined');\n }\n resolve(event.closePayload);\n }\n else {\n reject(new TableauDialogError(api_external_contract_js_1.ErrorCodes.DialogClosedByUser, 'Extension dialog closed by user.'));\n }\n unregisterFn();\n });\n })\n .catch((error) => {\n reject(error);\n });\n });\n }\n sendDialogMessageAsync(message, targetDialogUrl) {\n const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"UIService\" /* ExtensionsServiceNames.UIService */);\n uiService.sendDialogMessageAsync(message, targetDialogUrl);\n }\n sendDialogMessageToParentAsync(message) {\n if (!this.isExtensionDialog) {\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'sendDialogMessageToParentAsync can only be called from an extension dialog.');\n }\n const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"UIService\" /* ExtensionsServiceNames.UIService */);\n uiService.sendDialogMessageToParentAsync(message);\n }\n closeDialog(payload, dialogUrl) {\n const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"UIService\" /* ExtensionsServiceNames.UIService */);\n uiService.closeDialog(payload, dialogUrl);\n }\n /**\n * Initializes all events relevant to UI object.\n *\n * @returns {Array} Collection of event managers to pass to an EventListenerManager.\n */\n initializeEvents() {\n const results = new Array();\n let notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* ServiceNames.Notification */);\n }\n catch (e) {\n // If we don't have this service registered, just return\n return results;\n }\n const dialogMessageEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.DialogMessageReceived);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ExtensionDialogMessage, () => true, (event) => {\n dialogMessageEvent.triggerEvent(() => new DialogMessageEvent(event.message, event.sourceDialogUrl));\n });\n results.push(dialogMessageEvent);\n return results;\n }\n}\nexports.UIImpl = UIImpl;\n//# sourceMappingURL=UIImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=DataSourceInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=InternalContractVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WorksheetImpl = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst DataSource_1 = require(\"../DataSource\");\nconst LogicalTable_1 = require(\"../LogicalTable\");\nconst GetDataService_1 = require(\"../Services/GetDataService\");\nconst ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nconst TableauError_1 = require(\"../TableauError\");\nconst ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nconst DataSourceImpl_1 = require(\"./DataSourceImpl\");\nconst SheetImpl_1 = require(\"./SheetImpl\");\nclass WorksheetImpl extends SheetImpl_1.SheetImpl {\n constructor(sheetInfoImpl, _registryId, _visualId, _parentDashboardImpl, _parentStoryPointImpl, _backgroundColor = null, _formatting = null) {\n super(sheetInfoImpl, _registryId);\n this._visualId = _visualId;\n this._parentDashboardImpl = _parentDashboardImpl;\n this._parentStoryPointImpl = _parentStoryPointImpl;\n this._backgroundColor = _backgroundColor;\n this._formatting = _formatting;\n }\n get parentDashboard() {\n return this._parentDashboardImpl;\n }\n get parentStoryPoint() {\n return this._parentStoryPointImpl;\n }\n get visualId() {\n return this._visualId;\n }\n getMaxPageRowLimit() {\n return 10000;\n }\n get backgroundColor() {\n return this._backgroundColor;\n }\n get formatting() {\n return this._formatting;\n }\n applyFilterAsync(fieldName, values, updateType, options) {\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'Contract.FilterUpdateType');\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* ServiceNames.Filter */);\n return service.applyFilterAsync(this.visualId, fieldName, values, updateType, options);\n }\n applyRangeFilterAsync(fieldName, filterOptions) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName');\n ErrorHelpers_1.ErrorHelpers.verifyParameter(filterOptions, 'filterOptions');\n if (filterOptions.nullOption) {\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(filterOptions.nullOption, api_external_contract_js_1.FilterNullOption, 'FilterNullOption');\n }\n else {\n ErrorHelpers_1.ErrorHelpers.verifyRangeParamType(filterOptions.min, filterOptions.max);\n }\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* ServiceNames.Filter */);\n return service.applyRangeFilterAsync(this.visualId, fieldName, filterOptions);\n }\n applyHierarchicalFilterAsync(fieldName, values, updateType, options) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName');\n ErrorHelpers_1.ErrorHelpers.verifyParameter(values, 'values');\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(updateType, Contract.FilterUpdateType, 'Contract.FilterUpdateType');\n if (!Array.isArray(values) && !values.levels) {\n 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');\n }\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* ServiceNames.Filter */);\n return service.applyHierarchicalFilterAsync(this.visualId, fieldName, values, updateType, options);\n }\n clearFilterAsync(fieldName) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(fieldName, 'fieldName');\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* ServiceNames.Filter */);\n return service.clearFilterAsync(this.visualId, fieldName);\n }\n applyRelativeDateFilterAsync(fieldName, options) {\n ErrorHelpers_1.ErrorHelpers.verifyStringParameter(fieldName, 'fieldName');\n ErrorHelpers_1.ErrorHelpers.verifyParameter(options, 'options');\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(options.periodType, api_external_contract_js_1.PeriodType, 'PeriodType');\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(options.rangeType, api_external_contract_js_1.DateRangeType, 'DateRangeType');\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* ServiceNames.Filter */);\n return service.applyRelativeDateFilterAsync(this.visualId, fieldName, options);\n }\n getDataSourcesAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* ServiceNames.DataSourceService */);\n return service.getDataSourcesAsync(this.visualId).then((result) => {\n const dataSchema = result;\n const worksheetDataSourceInfo = dataSchema.worksheetDataSchemaMap[this.name];\n const dataSources = [];\n // First, add the primary datasource. By convention, it comes first in the returned array.\n const primaryId = worksheetDataSourceInfo.primaryDataSource;\n dataSources.push(this.createDataSourceFromInfo(dataSchema.dataSources[primaryId]));\n // Then, loop through any secondary data sources and add them.\n for (const secondaryId of worksheetDataSourceInfo.referencedDataSourceList) {\n if (secondaryId !== primaryId) {\n dataSources.push(this.createDataSourceFromInfo(dataSchema.dataSources[secondaryId]));\n }\n }\n return dataSources;\n });\n }\n getFiltersAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* ServiceNames.Filter */);\n return service.getFiltersAsync(this.visualId);\n }\n getSelectedMarksAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* ServiceNames.GetData */);\n return service.getSelectedMarksAsync(this.visualId);\n }\n getHighlightedMarksAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* ServiceNames.GetData */);\n return service.getHighlightedMarksAsync(this.visualId);\n }\n getSummaryDataAsync(options) {\n var _a;\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* ServiceNames.GetData */);\n options = options || {};\n 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) !== null && _a !== void 0 ? _a : false);\n }\n getSummaryDataReaderAsync(pageRowCount, options) {\n var _a;\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* ServiceNames.GetData */);\n options = options || {};\n return service.getSummaryDataReaderAsync(this.visualId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, !!options.ignoreSelection, true, // includeAllColumns (can be overridden by columnsToIncludeById)\n options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting) !== null && _a !== void 0 ? _a : false);\n }\n getVisualSpecificationAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"visual-model-service\" /* ServiceNames.VisualModel */);\n return service.getVisualSpecificationAsync(this.visualId);\n }\n addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex) {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"visual-model-service\" /* ServiceNames.VisualModel */);\n return service.addMarksCardFieldsAsync(this.visualId, marksCardIndex, encodingType, columns, startIndex);\n }\n moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount) {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"visual-model-service\" /* ServiceNames.VisualModel */);\n return service.moveMarksCardFieldAsync(this.visualId, marksCardIndex, fromIndex, toIndex, fieldCount);\n }\n spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns) {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"visual-model-service\" /* ServiceNames.VisualModel */);\n return service.spliceMarksCardFieldsAsync(this.visualId, marksCardIndex, encodingType, startIndex, deleteCount, columns);\n }\n getSummaryColumnsInfoAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* ServiceNames.GetData */);\n return service.getSummaryColumnsInfoAsync(this.visualId);\n }\n getUnderlyingDataAsync(options) {\n var _a;\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* ServiceNames.GetData */);\n options = options || {};\n 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) !== null && _a !== void 0 ? _a : false);\n }\n getUnderlyingTablesAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* ServiceNames.DataSourceService */);\n return service.getUnderlyingTablesAsync(this.visualId).then((logicalTableInfos) => {\n return logicalTableInfos.map((logicalTableInfo) => new LogicalTable_1.LogicalTable(logicalTableInfo));\n });\n }\n getUnderlyingTableDataAsync(logicalTableId, options) {\n var _a;\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* ServiceNames.GetData */);\n options = options || {};\n 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) !== null && _a !== void 0 ? _a : false);\n }\n getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options) {\n var _a;\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* ServiceNames.GetData */);\n options = options || {};\n 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) !== null && _a !== void 0 ? _a : false);\n }\n clearSelectedMarksAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* ServiceNames.Selection */);\n return service.clearSelectedMarksAsync(this.visualId);\n }\n selectMarksByValueAsync(selections, selectionUpdateType) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName');\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType');\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* ServiceNames.Selection */);\n return service.selectMarksByValueAsync(this.visualId, selections, selectionUpdateType);\n }\n selectMarksByIdAsync(selections, selectionUpdateType) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(selections, 'fieldName');\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(selectionUpdateType, api_external_contract_js_1.SelectionUpdateType, 'SelectionUpdateType');\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* ServiceNames.Selection */);\n return service.selectMarksByIdAsync(this.visualId, selections, selectionUpdateType);\n }\n annotateMarkAsync(mark, annotationText) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(mark, 'mark');\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"annotation-service\" /* ServiceNames.Annotation */);\n return service.annotateMarkAsync(this.visualId, mark, annotationText);\n }\n getAnnotationsAsync() {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"annotation-service\" /* ServiceNames.Annotation */);\n return service.getAnnotationsAsync(this.visualId);\n }\n removeAnnotationAsync(annotation) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(annotation, 'annotation');\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"annotation-service\" /* ServiceNames.Annotation */);\n return service.removeAnnotationAsync(this.visualId, annotation);\n }\n appendContextMenuAsync(targetMenu, config) {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"external-context-menu-service\" /* ServiceNames.ExternalContextMenu */);\n return service.appendContextMenuAsync(this.visualId.worksheet, targetMenu, config);\n }\n removeContextMenuAsync(targetMenu, menuItemId) {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"external-context-menu-service\" /* ServiceNames.ExternalContextMenu */);\n return service.removeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId);\n }\n executeContextMenuAsync(targetMenu, menuItemId) {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"external-context-menu-service\" /* ServiceNames.ExternalContextMenu */);\n return service.executeContextMenuAsync(this.visualId.worksheet, targetMenu, menuItemId);\n }\n renameContextMenuAsync(targetMenu, menuHeader, menuDescription) {\n this.verifyActiveSheet();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"external-context-menu-service\" /* ServiceNames.ExternalContextMenu */);\n return service.renameContextMenuAsync(this.visualId.worksheet, targetMenu, menuHeader, menuDescription);\n }\n hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions) {\n if (this.isInsideDashboardExtension()) {\n return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `hoverTupleAsync is not supported in dashboard extensions`));\n }\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* ServiceNames.Selection */);\n return service.hoverTupleAsync(this.visualId, hoveredTuple, tooltip, allowHoverActions);\n }\n selectTuplesAsync(selectedTuples, selectOption, tooltip) {\n if (this.isInsideDashboardExtension()) {\n return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `selectTuplesAsync is not supported in dashboard extensions`));\n }\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"selection-service\" /* ServiceNames.Selection */);\n return service.selectTuplesAsync(this.visualId, selectedTuples, selectOption, tooltip);\n }\n getTooltipTextAsync(tupleId) {\n if (this.isInsideDashboardExtension()) {\n return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `getTooltipTextAsync is not supported in dashboard extensions`));\n }\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"accessibility\" /* ServiceNames.Accessibility */);\n return service.getTooltipTextAsync(this.visualId, tupleId);\n }\n leaveMarkNavigationAsync() {\n if (this.isInsideDashboardExtension()) {\n return Promise.reject(new TableauError_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `leaveMarkNavigationAsync is not supported in dashboard extensions`));\n }\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"accessibility\" /* ServiceNames.Accessibility */);\n return service.leaveMarkNavigationAsync(this.visualId);\n }\n editAliasesDialogAsync(fieldName) {\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"visual-model-service\" /* ServiceNames.VisualModel */);\n return service.editAliasesDialogAsync(fieldName);\n }\n createDataSourceFromInfo(dataSourceInfo) {\n const dataSourceImpl = new DataSourceImpl_1.DataSourceImpl(dataSourceInfo, this._registryId);\n const dataSource = new DataSource_1.DataSource(dataSourceImpl);\n dataSourceImpl.initializeWithPublicInterfaces(dataSource);\n return dataSource;\n }\n verifyActiveSheet() {\n const isRootAndActiveWorksheet = this.active;\n const isInsideActiveDashboard = this.isInsideActiveDashboard();\n const isInsideActiveStoryPoint = this.isInsideActiveStoryPoint();\n if (!isRootAndActiveWorksheet && !isInsideActiveDashboard && !isInsideActiveStoryPoint) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.NotActiveSheet, 'Operation not allowed on non-active sheet');\n }\n }\n isInsideActiveStoryPoint() {\n return this._parentStoryPointImpl && this._parentStoryPointImpl.active;\n }\n isInsideActiveDashboard() {\n return this._parentDashboardImpl && this._parentDashboardImpl.active;\n }\n isInsideDashboardExtension() {\n return this._parentDashboardImpl !== null;\n }\n}\nexports.WorksheetImpl = WorksheetImpl;\n//# sourceMappingURL=WorksheetImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=ParameterInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExtensionWorkbookImpl = void 0;\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nclass ExtensionWorkbookImpl extends api_shared_js_1.WorkbookImpl {\n getAllDataSourcesAsync() {\n const service = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"data-source-service\" /* ServiceNames.DataSourceService */);\n return service.getAllDataSourcesAsync().then((result) => {\n const dataSchema = result;\n const dataSources = [];\n // Loop through all data sources and add them.\n Object.values(dataSchema.dataSources).forEach((ds) => {\n dataSources.push(this.createDataSourceFromInfo(ds));\n });\n return dataSources;\n });\n }\n createDataSourceFromInfo(dataSourceInfo) {\n const dataSourceImpl = new api_shared_js_1.DataSourceImpl(dataSourceInfo, ServiceRegistryUtil_1.ExtensionsRegistryId);\n const dataSource = new api_shared_js_1.DataSource(dataSourceImpl);\n dataSourceImpl.initializeWithPublicInterfaces(dataSource);\n return dataSource;\n }\n}\nexports.ExtensionWorkbookImpl = ExtensionWorkbookImpl;\n//# sourceMappingURL=ExtensionWorkbookImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Settings = void 0;\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\n/**\n * Implementation of the external settings namespace.\n */\nclass Settings extends api_shared_js_1.EventListenerManager {\n constructor(_settingsImpl) {\n super();\n this._settingsImpl = _settingsImpl;\n // Initialize our event handling for this class\n this._settingsImpl.initializeEvents().forEach((e) => this.addNewEventType(e));\n }\n erase(key) {\n this._settingsImpl.erase(key);\n }\n get(key) {\n return this._settingsImpl.get(key);\n }\n getAll() {\n return this._settingsImpl.getAll();\n }\n get isModified() {\n return this._settingsImpl.isModified;\n }\n saveAsync() {\n return this._settingsImpl.saveAsync();\n }\n set(key, value) {\n this._settingsImpl.set(key, value);\n }\n}\nexports.Settings = Settings;\n//# sourceMappingURL=Settings.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=EventInterface.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExternalToInternalEnumMappings = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst EnumConverter_1 = require(\"../Utils/EnumConverter\");\n/* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */\n/**\n * Maps enums used by the external-api-contract to the enums used\n * in the internal-api-contract, which developers code against.\n */\nclass ExternalToInternalEnumMappings {\n}\nexports.ExternalToInternalEnumMappings = ExternalToInternalEnumMappings;\nExternalToInternalEnumMappings.filterDomainType = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.FilterDomainType.Relevant]: api_internal_contract_js_1.FilterDomainType.Relevant,\n [api_external_contract_js_1.FilterDomainType.Database]: api_internal_contract_js_1.FilterDomainType.Database,\n});\nExternalToInternalEnumMappings.nullOptions = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.FilterNullOption.AllValues]: api_internal_contract_js_1.FilterNullOption.AllValues,\n [api_external_contract_js_1.FilterNullOption.NonNullValues]: api_internal_contract_js_1.FilterNullOption.NonNullValues,\n [api_external_contract_js_1.FilterNullOption.NullValues]: api_internal_contract_js_1.FilterNullOption.NullValues,\n});\nExternalToInternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.FilterUpdateType.Add]: api_internal_contract_js_1.FilterUpdateType.Add,\n [api_external_contract_js_1.FilterUpdateType.All]: api_internal_contract_js_1.FilterUpdateType.All,\n [api_external_contract_js_1.FilterUpdateType.Remove]: api_internal_contract_js_1.FilterUpdateType.Remove,\n [api_external_contract_js_1.FilterUpdateType.Replace]: api_internal_contract_js_1.FilterUpdateType.Replace,\n});\nExternalToInternalEnumMappings.setVisibilityType = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.ZoneVisibilityType.Show]: true,\n [api_external_contract_js_1.ZoneVisibilityType.Hide]: false,\n});\nExternalToInternalEnumMappings.setReplaySpeedType = new EnumConverter_1.EnumConverter({\n // these numbers are duration multipliers\n // 2.0, for example, doubles the duration of the replay, slowing it down to 0.5x speed\n [api_external_contract_js_1.ReplaySpeedType.Slow]: 2.0,\n [api_external_contract_js_1.ReplaySpeedType.Normal]: 1.0,\n [api_external_contract_js_1.ReplaySpeedType.Fast]: 0.5,\n});\nExternalToInternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.SheetType.Dashboard]: api_internal_contract_js_1.SheetType.Dashboard,\n [api_external_contract_js_1.SheetType.Worksheet]: api_internal_contract_js_1.SheetType.Worksheet,\n [api_external_contract_js_1.SheetType.Story]: api_internal_contract_js_1.SheetType.Story,\n});\nExternalToInternalEnumMappings.showDataTableFormatType = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.IncludeDataValuesOption.AllValues]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeAndFormattedValues,\n [api_external_contract_js_1.IncludeDataValuesOption.OnlyNativeValues]: api_internal_contract_js_1.ApiShowDataTableFormat.NativeValuesOnly,\n [api_external_contract_js_1.IncludeDataValuesOption.OnlyFormattedValues]: api_internal_contract_js_1.ApiShowDataTableFormat.FormattedValuesOnly,\n});\nExternalToInternalEnumMappings.periodType = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.PeriodType.Years]: api_internal_contract_js_1.DateStepPeriod.Years,\n [api_external_contract_js_1.PeriodType.Quarters]: api_internal_contract_js_1.DateStepPeriod.Quarters,\n [api_external_contract_js_1.PeriodType.Months]: api_internal_contract_js_1.DateStepPeriod.Months,\n [api_external_contract_js_1.PeriodType.Weeks]: api_internal_contract_js_1.DateStepPeriod.Weeks,\n [api_external_contract_js_1.PeriodType.Days]: api_internal_contract_js_1.DateStepPeriod.Days,\n [api_external_contract_js_1.PeriodType.Hours]: api_internal_contract_js_1.DateStepPeriod.Hours,\n [api_external_contract_js_1.PeriodType.Minutes]: api_internal_contract_js_1.DateStepPeriod.Minutes,\n [api_external_contract_js_1.PeriodType.Seconds]: api_internal_contract_js_1.DateStepPeriod.Seconds,\n [api_external_contract_js_1.PeriodType.IsoYears]: api_internal_contract_js_1.DateStepPeriod.IsoYears,\n [api_external_contract_js_1.PeriodType.IsoQuarters]: api_internal_contract_js_1.DateStepPeriod.IsoQuarters,\n [api_external_contract_js_1.PeriodType.IsoWeeks]: api_internal_contract_js_1.DateStepPeriod.IsoWeeks,\n});\nExternalToInternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.DateRangeType.Last]: api_internal_contract_js_1.DateRangeType.Last,\n [api_external_contract_js_1.DateRangeType.LastN]: api_internal_contract_js_1.DateRangeType.LastN,\n [api_external_contract_js_1.DateRangeType.Next]: api_internal_contract_js_1.DateRangeType.Next,\n [api_external_contract_js_1.DateRangeType.NextN]: api_internal_contract_js_1.DateRangeType.NextN,\n [api_external_contract_js_1.DateRangeType.Current]: api_internal_contract_js_1.DateRangeType.Current,\n [api_external_contract_js_1.DateRangeType.ToDate]: api_internal_contract_js_1.DateRangeType.ToDate,\n});\nExternalToInternalEnumMappings.dialogStyles = new EnumConverter_1.EnumConverter({\n [api_external_contract_js_1.DialogStyle.Window]: api_internal_contract_js_1.DialogStyle.Window,\n [api_external_contract_js_1.DialogStyle.Modal]: api_internal_contract_js_1.DialogStyle.Modal,\n [api_external_contract_js_1.DialogStyle.Modeless]: api_internal_contract_js_1.DialogStyle.Modeless,\n});\n/* tslint:enable:typedef */\n//# sourceMappingURL=ExternalToInternalEnumMappings.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ConnectedServer = void 0;\nclass ConnectedServer {\n constructor(_userId, _siteId, _siteNamespace, _workbookId) {\n this._userId = _userId;\n this._siteId = _siteId;\n this._siteNamespace = _siteNamespace;\n this._workbookId = _workbookId;\n }\n get userId() {\n return this._userId;\n }\n get siteId() {\n return this._siteId;\n }\n get siteNamespace() {\n return this._siteNamespace;\n }\n get workbookId() {\n return this._workbookId;\n }\n}\nexports.ConnectedServer = ConnectedServer;\n//# sourceMappingURL=ConnectedServer.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DataSource = void 0;\nclass DataSource {\n constructor(_dataSourceImpl) {\n this._dataSourceImpl = _dataSourceImpl;\n }\n get name() {\n return this._dataSourceImpl.name;\n }\n get id() {\n return this._dataSourceImpl.id;\n }\n get fields() {\n return this._dataSourceImpl.fields;\n }\n get extractUpdateTime() {\n return this._dataSourceImpl.extractUpdateTime;\n }\n get isExtract() {\n return this._dataSourceImpl.isExtract;\n }\n get isPublished() {\n return this._dataSourceImpl.isPublished;\n }\n publishedUrl() {\n return this._dataSourceImpl.publishedUrl();\n }\n refreshAsync() {\n return this._dataSourceImpl.refreshAsync();\n }\n getActiveTablesAsync() {\n console.warn('DataSource.getActiveTablesAsync is deprecated. Please use DataSource.getLogicalTablesAsync.');\n return this._dataSourceImpl.getActiveTablesAsync();\n }\n getConnectionSummariesAsync() {\n return this._dataSourceImpl.getConnectionSummariesAsync();\n }\n getUnderlyingDataAsync(options) {\n console.warn('DataSource.getUnderlyingDataAsync is deprecated. Please use ' +\n 'DataSource.getLogicalTablesAsync and DataSource.getLogicalTableDataAsync.');\n return this._dataSourceImpl.getUnderlyingDataAsync(options);\n }\n getLogicalTablesAsync() {\n return this._dataSourceImpl.getLogicalTablesAsync();\n }\n getLogicalTableDataAsync(logicalTableId, options) {\n return this._dataSourceImpl.getLogicalTableDataAsync(logicalTableId, options);\n }\n getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options) {\n return this._dataSourceImpl.getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options);\n }\n}\nexports.DataSource = DataSource;\n//# sourceMappingURL=DataSource.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LegacyInternalApiDispatcherHolder = void 0;\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\n/**\n * LegacyInternalApiDispatcherHolder has been moved (and renamed) from api-internal-contract.\n * It supports running a newer external library against a pre 2019.3 desktop.\n * Starting in 2019.3, we have a merged bootstrap style for both desktop and server.\n * In addition, the alpha checking that is happening here is not necessary in external-api-js\n * after 2019.3 because that checking happens in api-platform-js (ApiDispatcherTest.ts)\n * TFSID: 1091561 tracks an improvement to this system to make it less complex and tie it directly to\n * tableau beta release versions.\n * @deprecated\n */\nvar LegacyInternalApiDispatcherHolder;\n(function (LegacyInternalApiDispatcherHolder) {\n /**\n * @param options\n */\n function getDesktopDispatcherPromise(options) {\n if ((!options || typeof options.isAlpha === 'undefined') && !window.__warningIssued) {\n // tslint:disable-next-line:no-console\n console.warn('This is a beta version of the Extensions API. Please upgrade to an official release.');\n window.__warningIssued = true;\n }\n else if ((options === null || options === void 0 ? void 0 : options.isAlpha) && window.__platformIsOfficialRelease) {\n window.__tableauDesktopDispatcher\n .then((dispatcherFactory) => {\n const dispatcher = dispatcherFactory(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION);\n dispatcher.execute(api_internal_contract_js_1.VerbId.BlockExtension, {}).catch();\n })\n .catch();\n }\n // this will be undefined if promise is rejected or throws\n return window.__tableauDesktopDispatcher;\n }\n LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise = getDesktopDispatcherPromise;\n /**\n * @param options\n */\n function hasDesktopApiDispatcherPromise(options) {\n return !!getDesktopDispatcherPromise(options);\n }\n LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise = hasDesktopApiDispatcherPromise;\n})(LegacyInternalApiDispatcherHolder || (exports.LegacyInternalApiDispatcherHolder = LegacyInternalApiDispatcherHolder = {}));\n//# sourceMappingURL=LegacyInternalApiDispatcherHolder.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FilterChangedEvent = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst TableauWorksheetEvent_1 = require(\"./TableauWorksheetEvent\");\nclass FilterChangedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent {\n constructor(worksheet, _fieldName, _fieldId) {\n super(api_external_contract_js_1.TableauEventType.FilterChanged, worksheet);\n this._fieldName = _fieldName;\n this._fieldId = _fieldId;\n }\n get fieldName() {\n return this._fieldName;\n }\n get fieldId() {\n return this._fieldId;\n }\n getFilterAsync() {\n return this._worksheet.getFiltersAsync().then((filters) => {\n // TODO: Filtering of the filters should eventually be done platform side.\n const eventedFilter = this.fieldId\n ? filters.find((filter) => filter.fieldId === this.fieldId, this)\n : filters.find((filter) => filter.fieldName === this.fieldName, this);\n if (!eventedFilter) {\n // We shouldn't hit this unless the filter was removed from the worksheet\n // after the event was raised.\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.MissingFilter, `cannot find filter: ${this._fieldName}`);\n }\n return eventedFilter;\n });\n }\n}\nexports.FilterChangedEvent = FilterChangedEvent;\n//# sourceMappingURL=FilterChangedEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExecuteMinorUpgradeNotification = exports.ExecuteMinorUpgradeReturnExternal = exports.ExecuteMinorDowngradeCallExternal = void 0;\nexports.CreateExternalCompatibleVersionConverter = CreateExternalCompatibleVersionConverter;\nexports.CreateExternalCompatibleVersionConverterWithTranslators = CreateExternalCompatibleVersionConverterWithTranslators;\nconst VersionConverterFactory_1 = require(\"../VersionConverterFactory\");\nconst ExternalIdentityVersionConverter_1 = require(\"./ExternalIdentityVersionConverter\");\nconst ExternalStackingVersionConverter_1 = require(\"./ExternalStackingVersionConverter\");\n// A mapping from the current client version of internal-contract to an older platform version of the contract.\n// Each version bump can have an array of translations to perform in order.\n// These translations handle downgradeExecuteCall and upgradeExecuteReturn and are meant to be called on the\n// client/external side.\n// When updating the major or minor version of our internal-contract, you will need to update these data structures.\n// * If there are translations to add, add them to the version to 'upgrade from' or 'downgrade to'.\nexports.ExecuteMinorDowngradeCallExternal = {\n 1: {\n 9: [], // Note that we put downgrades from 1.10 to 1.9 in the [1][9] bucket\n },\n};\nexports.ExecuteMinorUpgradeReturnExternal = {\n 1: {\n 9: [], // Note that we put upgrades from 1.9 to 1.10 in the [1][9] bucket\n },\n};\nexports.ExecuteMinorUpgradeNotification = {\n 1: {\n 9: [], // Note that we put upgrades from 1.9 to 1.10 in the [1][9] bucket\n },\n};\n/**\n * Creates a new ExternalContractVersionConverter which has the ability to upgrade and downgrade\n * the contract between the two versions which are specified. If externalMajorVersion is less than\n * platformMajorVersion, an ExternalIdentityVersionConverter will be returned.\n * Handles upgrade/downgrade for both major and minor updates.\n *\n * @param externalVersion VersionNumber of the internal api which the external module is using\n * @param platformVersion VersionNumber of the internal api which the platform is using\n */\nfunction CreateExternalCompatibleVersionConverter(externalVersion, platformVersion) {\n return CreateExternalCompatibleVersionConverterWithTranslators(externalVersion, platformVersion, exports.ExecuteMinorDowngradeCallExternal, exports.ExecuteMinorUpgradeReturnExternal, exports.ExecuteMinorUpgradeNotification);\n}\n/**\n * Implementation of CreateExternalCompatibleVersionConverterWithTranslators.\n * This function takes the upgrade, downgrade arrays so that all the logic can be tested.\n *\n * @param externalVersion VersionNumber of the internal contract which the external module is using\n * @param platformVersion VersionNumber of the internal contract which the platform is using\n * @param upgrades MajorMinorTranslators for response upgrades\n * @param downgrades MajorMinorTranslators for execute call downgrades\n */\nfunction CreateExternalCompatibleVersionConverterWithTranslators(externalVersion, platformVersion, downgrades, upgrades, upgradeNotifications) {\n const externalMajorVersion = externalVersion.major;\n const platformMajorVersion = platformVersion.major;\n const platformMinorVersion = platformVersion.minor;\n // This check is present in VersionConverterFactory. We throw the same error here as well.\n // Hence we only need to check the minor versions for translations.\n if (externalMajorVersion > platformMajorVersion) {\n throw new Error(`External version must be less than or equal to platform version.\n externalMajorVersion=${externalMajorVersion} platformMajorVersion=${platformMajorVersion}`);\n }\n if (externalMajorVersion < platformMajorVersion || (0, VersionConverterFactory_1.VersionEqualTo)(externalVersion, platformVersion)) {\n return new ExternalIdentityVersionConverter_1.ExternalIdentityVersionConverter();\n }\n // Walk the span between the versions we have here and collect the upgrade and downgrades necessary\n const neededExecuteCallDowngrade = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, downgrades);\n const neededExecuteReturnUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgrades);\n const neededNotificationUpgrades = GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, upgradeNotifications);\n // Reverse the downgrade calls, so that we start the downgrade from the external version to the platform version\n neededExecuteCallDowngrade.reverse();\n return new ExternalStackingVersionConverter_1.ExternalStackingVersionConverter(externalVersion, platformVersion, neededExecuteCallDowngrade, neededExecuteReturnUpgrades, neededNotificationUpgrades);\n}\nfunction GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, majorMinorTranslators) {\n const neededTranslations = [];\n if (platformMajorVersion in majorMinorTranslators) {\n const start = platformMinorVersion;\n const maximumMinorVersion = (0, VersionConverterFactory_1.GetMaximumMinorIndex)(Object.keys(majorMinorTranslators[platformMajorVersion]));\n for (let minor = start; minor <= maximumMinorVersion; minor++) {\n if (minor in majorMinorTranslators[platformMajorVersion]) {\n neededTranslations.push(...majorMinorTranslators[platformMajorVersion][minor]);\n }\n }\n }\n return neededTranslations;\n}\n//# sourceMappingURL=ExternalVersionConverterFactory.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExportHelpers = void 0;\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst TableauError_1 = require(\"../TableauError\");\n/**\n * Helper methods for Export APIs.\n *\n * @class ExportHelpers\n */\nclass ExportHelpers {\n /**\n * Modifies the internal ExportPDFOptions' properties based on the given PDF export configuration.\n * This method will construct the internal ExportPDFOptions identically to how the 'Export PDF' dialog constructs the ExportPdfOptionsPresModel.\n * See the handleExportClick method in @browser-clients/export-pdf-options-dialog for reference.\n *\n * @param internalExportPdfOptions The internal ExportPDFOptions pres model used to configure the output PDF file.\n * @param externalExportPdfOptions The external ExportPDFOptions user-facing object passed to exportPDFAsync.\n * @param sheetNames The list of sheets selected for export.\n */\n static updateInternalExportPDFOptions(internalExportPdfOptions, externalExportPdfOptions, sheetNames) {\n internalExportPdfOptions.currentSheet = sheetNames[0];\n this.updateExportLayoutOptions(internalExportPdfOptions, externalExportPdfOptions);\n this.updateSheetOptions(internalExportPdfOptions, sheetNames);\n }\n /**\n * Helper method for updateInternalExportPDFOptions.\n * Modifies the exportLayoutOptions property of the internal ExportPDFOptions based on the external ExportPDFOptions.\n * See the getExportLayoutOptions method in @browser-clients/export-pdf-options-dialog for reference.\n *\n * @param internalExportPdfOptions The internal ExportPDFOptions pres model used to configure the output PDF file.\n * @param externalExportPdfOptions The external ExportPDFOptions user-facing object passed to exportPDFAsync.\n */\n static updateExportLayoutOptions(internalExportPdfOptions, externalExportPdfOptions) {\n const exportLayoutOptions = internalExportPdfOptions.exportLayoutOptions;\n // setting the image height and width properties to their default values\n exportLayoutOptions.imageHeight = this.DefaultLayoutOptions.imageHeight;\n exportLayoutOptions.imageWidth = this.DefaultLayoutOptions.imageWidth;\n // setting the orientation value for the exportLayoutOptions\n switch (externalExportPdfOptions.orientation) {\n case api_external_contract_js_1.PrintOrientation.Landscape:\n exportLayoutOptions.pageOrientationOption = api_internal_contract_js_1.PageOrientation.Landscape;\n break;\n case api_external_contract_js_1.PrintOrientation.Portrait:\n exportLayoutOptions.pageOrientationOption = api_internal_contract_js_1.PageOrientation.Portrait;\n break;\n default:\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'invalid orientation for ExportPDFOption');\n }\n // setting the page size value for the exportLayoutOptions\n switch (externalExportPdfOptions.pageSize) {\n case api_external_contract_js_1.PrintPageSize.A3:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.A3;\n break;\n case api_external_contract_js_1.PrintPageSize.A4:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.A4;\n break;\n case api_external_contract_js_1.PrintPageSize.A5:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.A5;\n break;\n case api_external_contract_js_1.PrintPageSize.B4:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.B4;\n break;\n case api_external_contract_js_1.PrintPageSize.B5:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.B5;\n break;\n case api_external_contract_js_1.PrintPageSize.Executive:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Executive;\n break;\n case api_external_contract_js_1.PrintPageSize.Folio:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Folio;\n break;\n case api_external_contract_js_1.PrintPageSize.Ledger:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Ledger;\n break;\n case api_external_contract_js_1.PrintPageSize.Legal:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Legal;\n break;\n case api_external_contract_js_1.PrintPageSize.Letter:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Letter;\n break;\n case api_external_contract_js_1.PrintPageSize.Note:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Note;\n break;\n case api_external_contract_js_1.PrintPageSize.Quarto:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Quarto;\n break;\n case api_external_contract_js_1.PrintPageSize.Statement:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Statement;\n break;\n case api_external_contract_js_1.PrintPageSize.Tabloid:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Tabloid;\n break;\n case api_external_contract_js_1.PrintPageSize.Unspecified:\n exportLayoutOptions.pageSizeOption = api_internal_contract_js_1.PageSizeOption.Unspecified;\n break;\n default:\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'invalid pageSize for ExportPDFOption');\n }\n // setting the scaling values for the exportLayoutOptions\n switch (externalExportPdfOptions.scaling) {\n case api_external_contract_js_1.PrintScaling.AtMost1PageHigh:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitOneHigh);\n break;\n case api_external_contract_js_1.PrintScaling.AtMost1PageWide:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitOneWide);\n break;\n case api_external_contract_js_1.PrintScaling.AtMost2PagesHigh:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitTwoHigh);\n break;\n case api_external_contract_js_1.PrintScaling.AtMost2PagesWide:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.FitPages.FitTwoWide);\n break;\n case api_external_contract_js_1.PrintScaling.Automatic:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePctAuto);\n break;\n case api_external_contract_js_1.PrintScaling.Perc100:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct100);\n break;\n case api_external_contract_js_1.PrintScaling.Perc200:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct200);\n break;\n case api_external_contract_js_1.PrintScaling.Perc25:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct25);\n break;\n case api_external_contract_js_1.PrintScaling.Perc400:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct400);\n break;\n case api_external_contract_js_1.PrintScaling.Perc50:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct50);\n break;\n case api_external_contract_js_1.PrintScaling.Perc60:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct60);\n break;\n case api_external_contract_js_1.PrintScaling.Perc75:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct75);\n break;\n case api_external_contract_js_1.PrintScaling.Perc80:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct80);\n break;\n case api_external_contract_js_1.PrintScaling.Perc90:\n this.setFitAndScaleValues(exportLayoutOptions, api_internal_contract_js_1.PageScalingOption.ScalePct90);\n break;\n default:\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'invalid scaling for ExportPDFOption');\n }\n }\n /**\n * Helper method for updateInternalExportPDFOptions.\n * Modifies the sheetOptions property of the internal ExportPDFOptions based on the sheets selected for export.\n * See the handleExportClick method in @browser-clients/export-pdf-options-dialog for reference.\n *\n * @param internalExportPdfOptions The internal ExportPDFOptions pres model used to configure the output PDF file.\n * @param sheetNames The list of sheets selected for export.\n */\n static updateSheetOptions(internalExportPdfOptions, sheetNames) {\n const { exportLayoutOptions, sheetOptions } = internalExportPdfOptions;\n // updating the export layouts options for each sheet and selecting sheet for export if included in list\n for (const sheetOption of sheetOptions) {\n sheetOption.exportLayoutOptions = exportLayoutOptions;\n sheetOption.isSelected = sheetNames.includes(sheetOption.sheet);\n }\n }\n /**\n * Helper method for updateExportLayoutOptons.\n * This method is a spoof of the getFitAndScaleValues method used in @browser-clients/export-pdf-options to set the exportLayoutOptions' scaling properties.\n * In the future, this file should be refactored to import the method directly from @browser-clients/export-pdf-options.\n *\n * @param scalingSelection string used for setting the exportLayoutOptions based on the PrintScaling property from the ExternalExportPDFOptions.\n * @param exportLayoutOptions the ExportLayoutOptions used by the internal ExportPDFOptions pres model.\n */\n static setFitAndScaleValues(exportLayoutOptions, scalingSelection) {\n let { pageFitHorizontal, pageFitVertical, pageScaleMode, pageScalePercent } = this.DefaultLayoutOptions;\n const fitMatch = this.fitRegex.exec(scalingSelection);\n const percentMatch = this.pctRegex.exec(scalingSelection);\n if (fitMatch) {\n [pageFitHorizontal, pageFitVertical] = fitMatch.slice(1).map((value) => Number(value));\n pageScaleMode = api_internal_contract_js_1.ScaleMode.ScaleFitPages;\n }\n else if (percentMatch) {\n [pageScalePercent] = percentMatch.slice(1).map((value) => Number(value));\n pageScaleMode = api_internal_contract_js_1.ScaleMode.ScalePercentage;\n }\n // getFitAndScaleValues returns the properties below, but instead this method will set them.\n exportLayoutOptions.pageFitHorizontal = pageFitHorizontal;\n exportLayoutOptions.pageFitVertical = pageFitVertical;\n exportLayoutOptions.pageScaleMode = pageScaleMode;\n exportLayoutOptions.pageScalePercent = pageScalePercent;\n }\n}\nexports.ExportHelpers = ExportHelpers;\nExportHelpers.DefaultDataOptions = {\n ignoreAliases: false,\n columnsToIncludeById: [],\n};\nExportHelpers.DefaultPDFOptions = {\n scaling: api_external_contract_js_1.PrintScaling.Automatic,\n pageSize: api_external_contract_js_1.PrintPageSize.Letter,\n orientation: api_external_contract_js_1.PrintOrientation.Portrait,\n};\nExportHelpers.DefaultLayoutOptions = {\n imageHeight: 0,\n imageWidth: 0,\n pageFitHorizontal: 1,\n pageFitVertical: 1,\n pageOrientationOption: api_internal_contract_js_1.PageOrientation.Portrait,\n pageScaleMode: api_internal_contract_js_1.ScaleMode.ScaleAuto,\n pageScalePercent: 100,\n pageSizeOption: api_internal_contract_js_1.PageSizeOption.Letter,\n};\nExportHelpers.fitRegex = new RegExp('fit([0-9]+)x([0-9]+)');\nExportHelpers.pctRegex = new RegExp('pct([0-9]+)');\n//# sourceMappingURL=ExportHelpers.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MarksSelectedEvent = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst TableauWorksheetEvent_1 = require(\"./TableauWorksheetEvent\");\nclass MarksSelectedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent {\n constructor(worksheet) {\n super(api_external_contract_js_1.TableauEventType.MarkSelectionChanged, worksheet);\n }\n getMarksAsync() {\n return this.worksheet.getSelectedMarksAsync();\n }\n}\nexports.MarksSelectedEvent = MarksSelectedEvent;\n//# sourceMappingURL=MarksSelectedEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=MessageDispatcher.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.CrossFrameDispatcher = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\n/**\n * This is an implementation of the InternalApiDispatcher interface which functions by passing messages\n * across a frame boundary. This is usually between the code where our javscript library has been included\n * by a 3rd party dev and another frame where Tableau server has content.\n */\nclass CrossFrameDispatcher {\n /**\n * Creates an instance of CrossFrameDispatcher which will use the given messenger to communicate\n * @param _messenger an instantiated and listening messenger object\n */\n constructor(_messenger) {\n this._messenger = _messenger;\n // Collection of pending promises which are waiting to be resolved. When we receive a response back from the other frame,\n // these promises can be either resolved or rejected\n this._pendingPromises = {};\n // The collection of notification handlers which have been registered with this dispatcher\n this._notificationHandlers = [];\n if (!this._messenger) {\n throw 'Missing messenger object';\n }\n // Set up our message handlers. We only care about incoming notifications and command responses\n this._messenger.setCommandResponseMessageHandler(this.onCommandResponse.bind(this));\n this._messenger.setNotificationMessageHandler(this.onNotification.bind(this));\n }\n ////// Start InternalApiDispatcher implementation\n execute(verb, parameters) {\n // To execute a verb, we first prepare a command message and then define a promise.\n const preparedMessage = this._messenger.prepareCommandMessage(verb, parameters);\n const promise = new Promise((resolve, reject) => {\n // Save off the pending promise by the messageGuid we are about to send. When a response is\n // received, we'll be able to resolve this promise with the result\n this._pendingPromises[preparedMessage.messageGuid] = { resolve: resolve, reject: reject };\n });\n // Actually send the message and return the promise\n preparedMessage.send();\n return promise;\n }\n registerNotificationHandler(handler) {\n this._notificationHandlers.push(handler);\n }\n unregisterNotificationHandler(handler) {\n this._notificationHandlers = this._notificationHandlers.filter((h) => h !== handler);\n }\n ////// End InternalApiDispatcher implementation\n onCommandResponse(response) {\n // We got a command response, look through the pending promises and resolve\n if (Object.keys(this._pendingPromises).indexOf(response.commandGuid) < 0) {\n return; // We don't have any reference to this command, just return\n }\n const pendingPromise = this._pendingPromises[response.commandGuid];\n // If we have an error defined, reject the promise\n if (response.error) {\n pendingPromise.reject(response.error);\n }\n // If we have data defined, resolve the promise\n if (response.data) {\n pendingPromise.resolve({ result: response.data });\n }\n // Clean up our pending promises object\n delete this._pendingPromises[response.commandGuid];\n }\n onNotification(notificationMessage) {\n // Go through each notification handler we have registered and let them know a notification came in\n for (const handler of this._notificationHandlers) {\n try {\n handler({ notificationId: notificationMessage.notificationId, data: notificationMessage.data });\n }\n catch (e) {\n // Incase of a IncompatibleVersionError, re-throw the error.\n if (e.errorCode === api_external_contract_js_1.EmbeddingErrorCodes.IncompatibleVersionError) {\n throw e;\n }\n // Else Ignore so if one handler errors, the other still get the message.\n }\n }\n }\n}\nexports.CrossFrameDispatcher = CrossFrameDispatcher;\n//# sourceMappingURL=CrossFrameDispatcher.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NotificationMinorDowngrades = exports.ExecuteMinorDowngrades = exports.ExecuteMinorUpgrades = void 0;\nexports.VersionLessThan = VersionLessThan;\nexports.VersionEqualTo = VersionEqualTo;\nexports.CreateVersionConverter = CreateVersionConverter;\nexports.CreateVersionConverterWithTranslators = CreateVersionConverterWithTranslators;\nexports.GetMaximumMinorIndex = GetMaximumMinorIndex;\nconst IdentityVersionConverter_1 = require(\"./IdentityVersionConverter\");\nconst StackingVersionConverter_1 = require(\"./StackingVersionConverter\");\nconst VersionTranslations_1 = require(\"./VersionTranslations\");\n/**\n * @returns true if lhs < rhs (ignoring fix number)\n * @param lhs\n * @param rhs\n */\nfunction VersionLessThan(lhs, rhs) {\n if (lhs.major > rhs.major) {\n return false;\n }\n if (lhs.major < rhs.major) {\n return true;\n }\n return lhs.minor < rhs.minor;\n}\n/**\n * @returns true if lhs == rhs (ignoring fix number)\n * @param lhs\n * @param rhs\n */\nfunction VersionEqualTo(lhs, rhs) {\n return lhs.major === rhs.major && lhs.minor === rhs.minor;\n}\n// A mapping from an older client version of internal-contract to the current platform version of this contract.\n// Each version bump can have an array of translations to perform in order. Notice that this is\n// different than the major upgrades/downgrades above because it handles both major and minor version changes.\n// Also please note: downgradeExecuteCall is handled on the client/external side rather than platform side.\n// When updating the major or minor version of our internal-contract, you will need to update these data structures.\n// * If there are translations to add, add them to the version to \"upgrade from\" or \"downgrade to\".\nexports.ExecuteMinorUpgrades = {\n 1: {\n 9: [], // Note that we put upgrades from 1.9 to 1.10 in the [1][9] bucket\n },\n};\nexports.ExecuteMinorDowngrades = {\n 1: {\n 5: [VersionTranslations_1.DowngradeWorksheetNames],\n 9: [],\n 175: [VersionTranslations_1.DowngradeWorksheetFomatting175],\n 182: [VersionTranslations_1.DowngradeExtensionEnvironmentContext],\n 189: [VersionTranslations_1.DowngradePeriodType],\n },\n};\nexports.NotificationMinorDowngrades = {\n 1: {\n 9: [],\n 10: [VersionTranslations_1.DowngradeFlipboardZoneID],\n 175: [VersionTranslations_1.DowngradeWorksheetFomattingNotification175],\n },\n};\n/**\n * Creates a new InternalContractVersionConverter which has the ability to upgrade and downgrade the contract\n * between the two versions, which are specified. If externalMajorVersion is greater than platformMajorVersion,\n * an error will be thrown because we won't know how to do those conversions.\n * This converter can handle both major and minor updates when the platform version is greater than external version.\n *\n * @param externalVersion VersionNumber of the internal api which the external module is using\n * @param platformVersion VersionNumber of the internal api which the platform is using\n */\nfunction CreateVersionConverter(externalVersion, platformVersion) {\n return CreateVersionConverterWithTranslators(externalVersion, platformVersion, exports.ExecuteMinorUpgrades, exports.ExecuteMinorDowngrades, exports.NotificationMinorDowngrades);\n}\n/**\n * Implementation of CreateVersionConverter. This function takes the upgrade, downgrade, and\n * notification arrays so that all the logic can be tested.\n *\n * @param externalVersion VersionNumber of the internal api which the external module is using\n * @param platformVersion VersionNumber of the internal api which the platform is using\n * @param upgrades MajorMinorTranslators for upgrades\n * @param downgrades MajorMinorTranslators for downgrades\n * @param notificationDowngrades MajorMinorTranslators for notification downgrades\n */\nfunction CreateVersionConverterWithTranslators(externalVersion, platformVersion, upgrades, downgrades, notificationDowngrades) {\n const externalMajorVersion = externalVersion.major;\n const externalMinorVersion = externalVersion.minor;\n const platformMajorVersion = platformVersion.major;\n if (externalMajorVersion > platformMajorVersion) {\n throw new Error(`External version must be less than or equal to platform version.\n externalMajorVersion=${externalMajorVersion} platformMajorVersion=${platformMajorVersion}`);\n }\n // If we are using the exact same versions (major.minor), just use the identity converter\n if (VersionEqualTo(externalVersion, platformVersion)) {\n return new IdentityVersionConverter_1.IdentityVersionConverter();\n }\n // Walk the span between the versions we have here and collect the upgrade and downgrades necessary\n const neededExecuteUpgrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, upgrades);\n const neededExecuteDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, downgrades);\n const neededNotificationDowngrades = GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, notificationDowngrades);\n // We want to apply the downgrades in reverse order in case of dependencies between them\n neededExecuteDowngrades.reverse();\n neededNotificationDowngrades.reverse();\n return StackingVersionConverter_1.StackingVersionConverter.fromData(externalVersion, platformVersion, neededExecuteUpgrades, neededExecuteDowngrades, neededNotificationDowngrades);\n}\nfunction GetNeededTranslations(externalMajorVersion, platformMajorVersion, externalMinorVersion, majorMinorTranslators) {\n const neededTranslations = [];\n for (let major = externalMajorVersion; major <= platformMajorVersion; major++) {\n if (major in majorMinorTranslators) {\n const start = major === externalMajorVersion ? externalMinorVersion : 0;\n const maximumMinorVersion = GetMaximumMinorIndex(Object.keys(majorMinorTranslators[major]));\n for (let minor = start; minor <= maximumMinorVersion; minor++) {\n if (minor in majorMinorTranslators[major]) {\n neededTranslations.push(...majorMinorTranslators[major][minor]);\n }\n }\n }\n }\n return neededTranslations;\n}\nfunction GetMaximumMinorIndex(minorVersions) {\n return minorVersions.map((a) => Number(a)).reduce((a, b) => (a > b ? a : b));\n}\n//# sourceMappingURL=VersionConverterFactory.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SupportedTableauFontFaces = exports.TableauSemiBoldFontFaceName = exports.TableauRegularFontFaceName = exports.TableauMediumFontFaceName = exports.TableauLightFontFaceName = exports.TableauBoldFontFaceName = exports.TableauBookFontFaceName = exports.TableauBoldFontFamilyName = exports.TableauSemiboldFontFamilyName = exports.TableauMediumFontFamilyName = exports.TableauRegularFontFamilyName = exports.TableauLightFontFamilyName = exports.TableauBookFontFamilyName = void 0;\nexports.TableauBookFontFamilyName = 'Tableau Book';\nexports.TableauLightFontFamilyName = 'Tableau Light';\nexports.TableauRegularFontFamilyName = 'Tableau Regular';\nexports.TableauMediumFontFamilyName = 'Tableau Medium';\nexports.TableauSemiboldFontFamilyName = 'Tableau Semibold';\nexports.TableauBoldFontFamilyName = 'Tableau Bold';\nexports.TableauBookFontFaceName = 'Tableau Book';\nexports.TableauBoldFontFaceName = 'Tableau Bold';\nexports.TableauLightFontFaceName = 'Tableau Light';\nexports.TableauMediumFontFaceName = 'Tableau Medium';\nexports.TableauRegularFontFaceName = 'Tableau Regular';\nexports.TableauSemiBoldFontFaceName = 'Tableau Semi Bold';\nexports.SupportedTableauFontFaces = [\n exports.TableauBookFontFaceName,\n exports.TableauBoldFontFaceName,\n exports.TableauLightFontFaceName,\n exports.TableauMediumFontFaceName,\n exports.TableauRegularFontFaceName,\n exports.TableauSemiBoldFontFaceName,\n];\n//# sourceMappingURL=TableauBookFontNameConstants.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.InitializationServiceImpl = void 0;\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nclass InitializationServiceImpl extends api_shared_js_1.ServiceImplBase {\n get serviceName() {\n return \"InitializationService\" /* ExtensionsServiceNames.InitializationService */;\n }\n initializeDashboardExtensionsAsync(isExtensionDialog, contextMenuIds) {\n const params = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'initializeDashboardExtensionsAsync',\n [api_internal_contract_js_1.ParameterId.ExtensionContextMenuIds]: contextMenuIds,\n [api_internal_contract_js_1.ParameterId.IsExtensionDialog]: isExtensionDialog,\n };\n return this.execute(api_internal_contract_js_1.VerbId.InitializeExtension, params).then((response) => {\n // TODO - Validate return value\n const result = response.result;\n return result;\n });\n }\n}\nexports.InitializationServiceImpl = InitializationServiceImpl;\n//# sourceMappingURL=InitializationServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Parameter = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst ParameterChangedEvent_1 = require(\"../Events/ParameterChangedEvent\");\nconst ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\n/**\n * Implementation of the Parameter contract. Calls down to the impl\n * class for almost all of the work it does.\n */\nclass Parameter extends api_shared_js_1.EventListenerManager {\n constructor(parameterImpl, sheet) {\n super();\n this.parameterImpl = parameterImpl;\n // Initialize our event handling for this class\n this.initializeEvents(sheet).forEach((e) => this.addNewEventType(e));\n }\n get name() {\n return this.parameterImpl.name;\n }\n get currentValue() {\n return this.parameterImpl.currentValue;\n }\n get dataType() {\n return this.parameterImpl.dataType;\n }\n get allowableValues() {\n return this.parameterImpl.allowableValues;\n }\n get id() {\n return this.parameterImpl.id;\n }\n changeValueAsync(newValue) {\n return this.parameterImpl.changeValueAsync(newValue);\n }\n /**\n * Helper method which goes through and registers each event type this impl knows about\n * with the NotificationService. It returns an array of SingleEventManager objects which\n * can then be passed to an EventListenerManager to handle user registration / unregistration.\n *\n * @param sheet The sheet object which will be included with the event notifications\n * @returns {Array} Collection of event managers to pass to an EventListenerManager\n */\n initializeEvents(sheet) {\n api_shared_js_1.ErrorHelpers.verifyInternalValue(sheet, 'sheet');\n const results = new Array();\n let notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* ServiceNames.Notification */);\n }\n catch (e) {\n // If we don't have this service registered, just return\n return results;\n }\n // Initialize all of the event managers we'll need (one for each event type)\n const parameterEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.ParameterChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.ParameterChanged, (model) => {\n const fieldName = model;\n return fieldName === this.parameterImpl.id;\n }, (fieldName) => {\n parameterEvent.triggerEvent(() => new ParameterChangedEvent_1.ParameterChangedEvent(fieldName, sheet));\n });\n results.push(parameterEvent);\n return results;\n }\n}\nexports.Parameter = Parameter;\n//# sourceMappingURL=Parameter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=Messenger.js.map","// Unique ID creation requires a high quality random # generator. In the browser we therefore\n// require the crypto API and do not support built-in fallback to lower quality random number\n// generators (like Math.random()).\nvar getRandomValues;\nvar rnds8 = new Uint8Array(16);\nexport default function rng() {\n // lazy load so that environments that need to polyfill have a chance to do so\n if (!getRandomValues) {\n // getRandomValues needs to be invoked in a context where \"this\" is a Crypto implementation. Also,\n // find the complete implementation of crypto (msCrypto) on IE11.\n getRandomValues = typeof crypto !== 'undefined' && crypto.getRandomValues && crypto.getRandomValues.bind(crypto) || typeof msCrypto !== 'undefined' && typeof msCrypto.getRandomValues === 'function' && msCrypto.getRandomValues.bind(msCrypto);\n\n if (!getRandomValues) {\n throw new Error('crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported');\n }\n }\n\n return getRandomValues(rnds8);\n}","export default /^(?:[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;","import REGEX from './regex.js';\n\nfunction validate(uuid) {\n return typeof uuid === 'string' && REGEX.test(uuid);\n}\n\nexport default validate;","import validate from './validate.js';\n/**\n * Convert array of 16 byte values to UUID string format of the form:\n * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX\n */\n\nvar byteToHex = [];\n\nfor (var i = 0; i < 256; ++i) {\n byteToHex.push((i + 0x100).toString(16).substr(1));\n}\n\nfunction stringify(arr) {\n var offset = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n // Note: Be careful editing this code! It's been tuned for performance\n // and works in ways you may not expect. See https://github.com/uuidjs/uuid/pull/434\n 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\n // of the following:\n // - One or more input array values don't map to a hex octet (leading to\n // \"undefined\" in the uuid)\n // - Invalid input values for the RFC `version` or `variant` fields\n\n if (!validate(uuid)) {\n throw TypeError('Stringified UUID is invalid');\n }\n\n return uuid;\n}\n\nexport default stringify;","import rng from './rng.js';\nimport stringify from './stringify.js'; // **`v1()` - Generate time-based UUID**\n//\n// Inspired by https://github.com/LiosK/UUID.js\n// and http://docs.python.org/library/uuid.html\n\nvar _nodeId;\n\nvar _clockseq; // Previous uuid creation time\n\n\nvar _lastMSecs = 0;\nvar _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details\n\nfunction v1(options, buf, offset) {\n var i = buf && offset || 0;\n var b = buf || new Array(16);\n options = options || {};\n var node = options.node || _nodeId;\n var clockseq = options.clockseq !== undefined ? options.clockseq : _clockseq; // node and clockseq need to be initialized to random values if they're not\n // specified. We do this lazily to minimize issues related to insufficient\n // system entropy. See #189\n\n if (node == null || clockseq == null) {\n var seedBytes = options.random || (options.rng || rng)();\n\n if (node == null) {\n // Per 4.5, create and 48-bit node id, (47 random bits + multicast bit = 1)\n node = _nodeId = [seedBytes[0] | 0x01, seedBytes[1], seedBytes[2], seedBytes[3], seedBytes[4], seedBytes[5]];\n }\n\n if (clockseq == null) {\n // Per 4.2.2, randomize (14 bit) clockseq\n clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff;\n }\n } // UUID timestamps are 100 nano-second units since the Gregorian epoch,\n // (1582-10-15 00:00). JSNumbers aren't precise enough for this, so\n // time is handled internally as 'msecs' (integer milliseconds) and 'nsecs'\n // (100-nanoseconds offset from msecs) since unix epoch, 1970-01-01 00:00.\n\n\n var msecs = options.msecs !== undefined ? options.msecs : Date.now(); // Per 4.2.1.2, use count of uuid's generated during the current clock\n // cycle to simulate higher resolution clock\n\n var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs)\n\n var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression\n\n if (dt < 0 && options.clockseq === undefined) {\n clockseq = clockseq + 1 & 0x3fff;\n } // Reset nsecs if clock regresses (new clockseq) or we've moved onto a new\n // time interval\n\n\n if ((dt < 0 || msecs > _lastMSecs) && options.nsecs === undefined) {\n nsecs = 0;\n } // Per 4.2.1.2 Throw error if too many uuids are requested\n\n\n if (nsecs >= 10000) {\n throw new Error(\"uuid.v1(): Can't create more than 10M uuids/sec\");\n }\n\n _lastMSecs = msecs;\n _lastNSecs = nsecs;\n _clockseq = clockseq; // Per 4.1.4 - Convert from unix epoch to Gregorian epoch\n\n msecs += 12219292800000; // `time_low`\n\n var tl = ((msecs & 0xfffffff) * 10000 + nsecs) % 0x100000000;\n b[i++] = tl >>> 24 & 0xff;\n b[i++] = tl >>> 16 & 0xff;\n b[i++] = tl >>> 8 & 0xff;\n b[i++] = tl & 0xff; // `time_mid`\n\n var tmh = msecs / 0x100000000 * 10000 & 0xfffffff;\n b[i++] = tmh >>> 8 & 0xff;\n b[i++] = tmh & 0xff; // `time_high_and_version`\n\n b[i++] = tmh >>> 24 & 0xf | 0x10; // include version\n\n b[i++] = tmh >>> 16 & 0xff; // `clock_seq_hi_and_reserved` (Per 4.2.2 - include variant)\n\n b[i++] = clockseq >>> 8 | 0x80; // `clock_seq_low`\n\n b[i++] = clockseq & 0xff; // `node`\n\n for (var n = 0; n < 6; ++n) {\n b[i + n] = node[n];\n }\n\n return buf || stringify(b);\n}\n\nexport default v1;","import validate from './validate.js';\n\nfunction parse(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n var v;\n var arr = new Uint8Array(16); // Parse ########-....-....-....-............\n\n arr[0] = (v = parseInt(uuid.slice(0, 8), 16)) >>> 24;\n arr[1] = v >>> 16 & 0xff;\n arr[2] = v >>> 8 & 0xff;\n arr[3] = v & 0xff; // Parse ........-####-....-....-............\n\n arr[4] = (v = parseInt(uuid.slice(9, 13), 16)) >>> 8;\n arr[5] = v & 0xff; // Parse ........-....-####-....-............\n\n arr[6] = (v = parseInt(uuid.slice(14, 18), 16)) >>> 8;\n arr[7] = v & 0xff; // Parse ........-....-....-####-............\n\n arr[8] = (v = parseInt(uuid.slice(19, 23), 16)) >>> 8;\n arr[9] = v & 0xff; // Parse ........-....-....-....-############\n // (Use \"/\" to avoid 32-bit truncation when bit-shifting high-order bytes)\n\n arr[10] = (v = parseInt(uuid.slice(24, 36), 16)) / 0x10000000000 & 0xff;\n arr[11] = v / 0x100000000 & 0xff;\n arr[12] = v >>> 24 & 0xff;\n arr[13] = v >>> 16 & 0xff;\n arr[14] = v >>> 8 & 0xff;\n arr[15] = v & 0xff;\n return arr;\n}\n\nexport default parse;","import stringify from './stringify.js';\nimport parse from './parse.js';\n\nfunction stringToBytes(str) {\n str = unescape(encodeURIComponent(str)); // UTF8 escape\n\n var bytes = [];\n\n for (var i = 0; i < str.length; ++i) {\n bytes.push(str.charCodeAt(i));\n }\n\n return bytes;\n}\n\nexport var DNS = '6ba7b810-9dad-11d1-80b4-00c04fd430c8';\nexport var URL = '6ba7b811-9dad-11d1-80b4-00c04fd430c8';\nexport default function (name, version, hashfunc) {\n function generateUUID(value, namespace, buf, offset) {\n if (typeof value === 'string') {\n value = stringToBytes(value);\n }\n\n if (typeof namespace === 'string') {\n namespace = parse(namespace);\n }\n\n if (namespace.length !== 16) {\n throw TypeError('Namespace must be array-like (16 iterable integer values, 0-255)');\n } // Compute hash of namespace and value, Per 4.3\n // Future: Use spread syntax when supported on all platforms, e.g. `bytes =\n // hashfunc([...namespace, ... value])`\n\n\n var bytes = new Uint8Array(16 + value.length);\n bytes.set(namespace);\n bytes.set(value, namespace.length);\n bytes = hashfunc(bytes);\n bytes[6] = bytes[6] & 0x0f | version;\n bytes[8] = bytes[8] & 0x3f | 0x80;\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = bytes[i];\n }\n\n return buf;\n }\n\n return stringify(bytes);\n } // Function#name is not settable on some platforms (#270)\n\n\n try {\n generateUUID.name = name; // eslint-disable-next-line no-empty\n } catch (err) {} // For CommonJS default export support\n\n\n generateUUID.DNS = DNS;\n generateUUID.URL = URL;\n return generateUUID;\n}","/*\n * Browser-compatible JavaScript MD5\n *\n * Modification of JavaScript MD5\n * https://github.com/blueimp/JavaScript-MD5\n *\n * Copyright 2011, Sebastian Tschan\n * https://blueimp.net\n *\n * Licensed under the MIT license:\n * https://opensource.org/licenses/MIT\n *\n * Based on\n * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message\n * Digest Algorithm, as defined in RFC 1321.\n * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009\n * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet\n * Distributed under the BSD License\n * See http://pajhome.org.uk/crypt/md5 for more info.\n */\nfunction md5(bytes) {\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = new Uint8Array(msg.length);\n\n for (var i = 0; i < msg.length; ++i) {\n bytes[i] = msg.charCodeAt(i);\n }\n }\n\n return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8));\n}\n/*\n * Convert an array of little-endian words to an array of bytes\n */\n\n\nfunction md5ToHexEncodedArray(input) {\n var output = [];\n var length32 = input.length * 32;\n var hexTab = '0123456789abcdef';\n\n for (var i = 0; i < length32; i += 8) {\n var x = input[i >> 5] >>> i % 32 & 0xff;\n var hex = parseInt(hexTab.charAt(x >>> 4 & 0x0f) + hexTab.charAt(x & 0x0f), 16);\n output.push(hex);\n }\n\n return output;\n}\n/**\n * Calculate output length with padding and bit length\n */\n\n\nfunction getOutputLength(inputLength8) {\n return (inputLength8 + 64 >>> 9 << 4) + 14 + 1;\n}\n/*\n * Calculate the MD5 of an array of little-endian words, and a bit length.\n */\n\n\nfunction wordsToMd5(x, len) {\n /* append padding */\n x[len >> 5] |= 0x80 << len % 32;\n x[getOutputLength(len) - 1] = len;\n var a = 1732584193;\n var b = -271733879;\n var c = -1732584194;\n var d = 271733878;\n\n for (var i = 0; i < x.length; i += 16) {\n var olda = a;\n var oldb = b;\n var oldc = c;\n var oldd = d;\n a = md5ff(a, b, c, d, x[i], 7, -680876936);\n d = md5ff(d, a, b, c, x[i + 1], 12, -389564586);\n c = md5ff(c, d, a, b, x[i + 2], 17, 606105819);\n b = md5ff(b, c, d, a, x[i + 3], 22, -1044525330);\n a = md5ff(a, b, c, d, x[i + 4], 7, -176418897);\n d = md5ff(d, a, b, c, x[i + 5], 12, 1200080426);\n c = md5ff(c, d, a, b, x[i + 6], 17, -1473231341);\n b = md5ff(b, c, d, a, x[i + 7], 22, -45705983);\n a = md5ff(a, b, c, d, x[i + 8], 7, 1770035416);\n d = md5ff(d, a, b, c, x[i + 9], 12, -1958414417);\n c = md5ff(c, d, a, b, x[i + 10], 17, -42063);\n b = md5ff(b, c, d, a, x[i + 11], 22, -1990404162);\n a = md5ff(a, b, c, d, x[i + 12], 7, 1804603682);\n d = md5ff(d, a, b, c, x[i + 13], 12, -40341101);\n c = md5ff(c, d, a, b, x[i + 14], 17, -1502002290);\n b = md5ff(b, c, d, a, x[i + 15], 22, 1236535329);\n a = md5gg(a, b, c, d, x[i + 1], 5, -165796510);\n d = md5gg(d, a, b, c, x[i + 6], 9, -1069501632);\n c = md5gg(c, d, a, b, x[i + 11], 14, 643717713);\n b = md5gg(b, c, d, a, x[i], 20, -373897302);\n a = md5gg(a, b, c, d, x[i + 5], 5, -701558691);\n d = md5gg(d, a, b, c, x[i + 10], 9, 38016083);\n c = md5gg(c, d, a, b, x[i + 15], 14, -660478335);\n b = md5gg(b, c, d, a, x[i + 4], 20, -405537848);\n a = md5gg(a, b, c, d, x[i + 9], 5, 568446438);\n d = md5gg(d, a, b, c, x[i + 14], 9, -1019803690);\n c = md5gg(c, d, a, b, x[i + 3], 14, -187363961);\n b = md5gg(b, c, d, a, x[i + 8], 20, 1163531501);\n a = md5gg(a, b, c, d, x[i + 13], 5, -1444681467);\n d = md5gg(d, a, b, c, x[i + 2], 9, -51403784);\n c = md5gg(c, d, a, b, x[i + 7], 14, 1735328473);\n b = md5gg(b, c, d, a, x[i + 12], 20, -1926607734);\n a = md5hh(a, b, c, d, x[i + 5], 4, -378558);\n d = md5hh(d, a, b, c, x[i + 8], 11, -2022574463);\n c = md5hh(c, d, a, b, x[i + 11], 16, 1839030562);\n b = md5hh(b, c, d, a, x[i + 14], 23, -35309556);\n a = md5hh(a, b, c, d, x[i + 1], 4, -1530992060);\n d = md5hh(d, a, b, c, x[i + 4], 11, 1272893353);\n c = md5hh(c, d, a, b, x[i + 7], 16, -155497632);\n b = md5hh(b, c, d, a, x[i + 10], 23, -1094730640);\n a = md5hh(a, b, c, d, x[i + 13], 4, 681279174);\n d = md5hh(d, a, b, c, x[i], 11, -358537222);\n c = md5hh(c, d, a, b, x[i + 3], 16, -722521979);\n b = md5hh(b, c, d, a, x[i + 6], 23, 76029189);\n a = md5hh(a, b, c, d, x[i + 9], 4, -640364487);\n d = md5hh(d, a, b, c, x[i + 12], 11, -421815835);\n c = md5hh(c, d, a, b, x[i + 15], 16, 530742520);\n b = md5hh(b, c, d, a, x[i + 2], 23, -995338651);\n a = md5ii(a, b, c, d, x[i], 6, -198630844);\n d = md5ii(d, a, b, c, x[i + 7], 10, 1126891415);\n c = md5ii(c, d, a, b, x[i + 14], 15, -1416354905);\n b = md5ii(b, c, d, a, x[i + 5], 21, -57434055);\n a = md5ii(a, b, c, d, x[i + 12], 6, 1700485571);\n d = md5ii(d, a, b, c, x[i + 3], 10, -1894986606);\n c = md5ii(c, d, a, b, x[i + 10], 15, -1051523);\n b = md5ii(b, c, d, a, x[i + 1], 21, -2054922799);\n a = md5ii(a, b, c, d, x[i + 8], 6, 1873313359);\n d = md5ii(d, a, b, c, x[i + 15], 10, -30611744);\n c = md5ii(c, d, a, b, x[i + 6], 15, -1560198380);\n b = md5ii(b, c, d, a, x[i + 13], 21, 1309151649);\n a = md5ii(a, b, c, d, x[i + 4], 6, -145523070);\n d = md5ii(d, a, b, c, x[i + 11], 10, -1120210379);\n c = md5ii(c, d, a, b, x[i + 2], 15, 718787259);\n b = md5ii(b, c, d, a, x[i + 9], 21, -343485551);\n a = safeAdd(a, olda);\n b = safeAdd(b, oldb);\n c = safeAdd(c, oldc);\n d = safeAdd(d, oldd);\n }\n\n return [a, b, c, d];\n}\n/*\n * Convert an array bytes to an array of little-endian words\n * Characters >255 have their high-byte silently ignored.\n */\n\n\nfunction bytesToWords(input) {\n if (input.length === 0) {\n return [];\n }\n\n var length8 = input.length * 8;\n var output = new Uint32Array(getOutputLength(length8));\n\n for (var i = 0; i < length8; i += 8) {\n output[i >> 5] |= (input[i / 8] & 0xff) << i % 32;\n }\n\n return output;\n}\n/*\n * Add integers, wrapping at 2^32. This uses 16-bit operations internally\n * to work around bugs in some JS interpreters.\n */\n\n\nfunction safeAdd(x, y) {\n var lsw = (x & 0xffff) + (y & 0xffff);\n var msw = (x >> 16) + (y >> 16) + (lsw >> 16);\n return msw << 16 | lsw & 0xffff;\n}\n/*\n * Bitwise rotate a 32-bit number to the left.\n */\n\n\nfunction bitRotateLeft(num, cnt) {\n return num << cnt | num >>> 32 - cnt;\n}\n/*\n * These functions implement the four basic operations the algorithm uses.\n */\n\n\nfunction md5cmn(q, a, b, x, s, t) {\n return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b);\n}\n\nfunction md5ff(a, b, c, d, x, s, t) {\n return md5cmn(b & c | ~b & d, a, b, x, s, t);\n}\n\nfunction md5gg(a, b, c, d, x, s, t) {\n return md5cmn(b & d | c & ~d, a, b, x, s, t);\n}\n\nfunction md5hh(a, b, c, d, x, s, t) {\n return md5cmn(b ^ c ^ d, a, b, x, s, t);\n}\n\nfunction md5ii(a, b, c, d, x, s, t) {\n return md5cmn(c ^ (b | ~d), a, b, x, s, t);\n}\n\nexport default md5;","import v35 from './v35.js';\nimport md5 from './md5.js';\nvar v3 = v35('v3', 0x30, md5);\nexport default v3;","import rng from './rng.js';\nimport stringify from './stringify.js';\n\nfunction v4(options, buf, offset) {\n options = options || {};\n var rnds = options.random || (options.rng || rng)(); // Per 4.4, set bits for version and `clock_seq_hi_and_reserved`\n\n rnds[6] = rnds[6] & 0x0f | 0x40;\n rnds[8] = rnds[8] & 0x3f | 0x80; // Copy bytes to buffer, if provided\n\n if (buf) {\n offset = offset || 0;\n\n for (var i = 0; i < 16; ++i) {\n buf[offset + i] = rnds[i];\n }\n\n return buf;\n }\n\n return stringify(rnds);\n}\n\nexport default v4;","// Adapted from Chris Veness' SHA1 code at\n// http://www.movable-type.co.uk/scripts/sha1.html\nfunction f(s, x, y, z) {\n switch (s) {\n case 0:\n return x & y ^ ~x & z;\n\n case 1:\n return x ^ y ^ z;\n\n case 2:\n return x & y ^ x & z ^ y & z;\n\n case 3:\n return x ^ y ^ z;\n }\n}\n\nfunction ROTL(x, n) {\n return x << n | x >>> 32 - n;\n}\n\nfunction sha1(bytes) {\n var K = [0x5a827999, 0x6ed9eba1, 0x8f1bbcdc, 0xca62c1d6];\n var H = [0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0];\n\n if (typeof bytes === 'string') {\n var msg = unescape(encodeURIComponent(bytes)); // UTF8 escape\n\n bytes = [];\n\n for (var i = 0; i < msg.length; ++i) {\n bytes.push(msg.charCodeAt(i));\n }\n } else if (!Array.isArray(bytes)) {\n // Convert Array-like to Array\n bytes = Array.prototype.slice.call(bytes);\n }\n\n bytes.push(0x80);\n var l = bytes.length / 4 + 2;\n var N = Math.ceil(l / 16);\n var M = new Array(N);\n\n for (var _i = 0; _i < N; ++_i) {\n var arr = new Uint32Array(16);\n\n for (var j = 0; j < 16; ++j) {\n 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];\n }\n\n M[_i] = arr;\n }\n\n M[N - 1][14] = (bytes.length - 1) * 8 / Math.pow(2, 32);\n M[N - 1][14] = Math.floor(M[N - 1][14]);\n M[N - 1][15] = (bytes.length - 1) * 8 & 0xffffffff;\n\n for (var _i2 = 0; _i2 < N; ++_i2) {\n var W = new Uint32Array(80);\n\n for (var t = 0; t < 16; ++t) {\n W[t] = M[_i2][t];\n }\n\n for (var _t = 16; _t < 80; ++_t) {\n W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1);\n }\n\n var a = H[0];\n var b = H[1];\n var c = H[2];\n var d = H[3];\n var e = H[4];\n\n for (var _t2 = 0; _t2 < 80; ++_t2) {\n var s = Math.floor(_t2 / 20);\n var T = ROTL(a, 5) + f(s, b, c, d) + e + K[s] + W[_t2] >>> 0;\n e = d;\n d = c;\n c = ROTL(b, 30) >>> 0;\n b = a;\n a = T;\n }\n\n H[0] = H[0] + a >>> 0;\n H[1] = H[1] + b >>> 0;\n H[2] = H[2] + c >>> 0;\n H[3] = H[3] + d >>> 0;\n H[4] = H[4] + e >>> 0;\n }\n\n 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];\n}\n\nexport default sha1;","import v35 from './v35.js';\nimport sha1 from './sha1.js';\nvar v5 = v35('v5', 0x50, sha1);\nexport default v5;","export default '00000000-0000-0000-0000-000000000000';","import validate from './validate.js';\n\nfunction version(uuid) {\n if (!validate(uuid)) {\n throw TypeError('Invalid UUID');\n }\n\n return parseInt(uuid.substr(14, 1), 16);\n}\n\nexport default version;","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.registerAllSharedServices = registerAllSharedServices;\nconst ServiceRegistry_1 = require(\"./ServiceRegistry\");\nconst AccessibilityServiceImpl_1 = require(\"./impl/AccessibilityServiceImpl\");\nconst AnimationServiceImpl_1 = require(\"./impl/AnimationServiceImpl\");\nconst AnnotationServiceImpl_1 = require(\"./impl/AnnotationServiceImpl\");\nconst DataSourceServiceImpl_1 = require(\"./impl/DataSourceServiceImpl\");\nconst ExportServiceImpl_1 = require(\"./impl/ExportServiceImpl\");\nconst ExternalContextMenuServiceImpl_1 = require(\"./impl/ExternalContextMenuServiceImpl\");\nconst FilterServiceImpl_1 = require(\"./impl/FilterServiceImpl\");\nconst GetDataServiceImpl_1 = require(\"./impl/GetDataServiceImpl\");\nconst NotificationServiceImpl_1 = require(\"./impl/NotificationServiceImpl\");\nconst ParametersServiceImpl_1 = require(\"./impl/ParametersServiceImpl\");\nconst SelectionServiceImpl_1 = require(\"./impl/SelectionServiceImpl\");\nconst SizeServiceImpl_1 = require(\"./impl/SizeServiceImpl\");\nconst VisualModelServiceImpl_1 = require(\"./impl/VisualModelServiceImpl\");\nconst VizServiceImpl_1 = require(\"./impl/VizServiceImpl\");\nconst ZoneServiceImpl_1 = require(\"./impl/ZoneServiceImpl\");\nfunction registerAllSharedServices(dispatcher, registryId) {\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AnimationServiceImpl_1.AnimationServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new DataSourceServiceImpl_1.DataSourceServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ExportServiceImpl_1.ExportServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new GetDataServiceImpl_1.GetDataServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new FilterServiceImpl_1.FilterServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new NotificationServiceImpl_1.NotificationServiceImpl(dispatcher));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ParametersServiceImpl_1.ParametersServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new SelectionServiceImpl_1.SelectionServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AnnotationServiceImpl_1.AnnotationServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ZoneServiceImpl_1.ZoneServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new SizeServiceImpl_1.SizeServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new VisualModelServiceImpl_1.VisualModelServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new VizServiceImpl_1.VizServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new ExternalContextMenuServiceImpl_1.ExternalContextMenuServiceImpl(dispatcher, registryId));\n ServiceRegistry_1.ApiServiceRegistry.get(registryId).registerService(new AccessibilityServiceImpl_1.AccessibilityServiceImpl(dispatcher, registryId));\n}\n//# sourceMappingURL=RegisterAllSharedServices.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.RangeDomain = exports.CategoricalDomain = exports.RelativeDateFilter = exports.RangeFilter = exports.HierarchicalFilter = exports.HierarchicalLevelDetail = exports.HierarchicalDataValue = exports.CategoricalFilter = exports.Filter = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nconst ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nclass Filter {\n constructor(_worksheetName, _fieldName, _filterType, _fieldId, _registryId) {\n this._worksheetName = _worksheetName;\n this._fieldName = _fieldName;\n this._filterType = _filterType;\n this._fieldId = _fieldId;\n this._registryId = _registryId;\n }\n get worksheetName() {\n return this._worksheetName;\n }\n get fieldName() {\n return this._fieldName;\n }\n get fieldId() {\n return this._fieldId;\n }\n get filterType() {\n return this._filterType;\n }\n getFieldAsync() {\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* ServiceNames.DataSourceService */);\n return service.getFieldAsync(this._fieldId);\n }\n getAppliedWorksheetsAsync() {\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* ServiceNames.Filter */);\n return service.getAppliedWorksheetsAsync(this._worksheetName, this._fieldId);\n }\n setAppliedWorksheetsAsync(applyToWorksheets) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(applyToWorksheets, 'applyToWorksheets');\n const uniqueWorksheets = new Set(applyToWorksheets);\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* ServiceNames.Filter */);\n return service.setAppliedWorksheetsAsync(this._worksheetName, this._fieldName, this._fieldId, Array.from(uniqueWorksheets));\n }\n}\nexports.Filter = Filter;\nclass CategoricalFilter extends Filter {\n constructor(worksheetName, fieldName, fieldId, filterType, registryId, _appliedValues, _isExcludeMode, _isAllSelected) {\n super(worksheetName, fieldName, filterType, fieldId, registryId);\n this._appliedValues = _appliedValues;\n this._isExcludeMode = _isExcludeMode;\n this._isAllSelected = _isAllSelected;\n }\n get isAllSelected() {\n return this._isAllSelected;\n }\n get appliedValues() {\n return this._appliedValues;\n }\n get isExcludeMode() {\n return this._isExcludeMode;\n }\n getDomainAsync(domainType) {\n if (!domainType) {\n domainType = api_external_contract_js_1.FilterDomainType.Relevant;\n }\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType');\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* ServiceNames.Filter */);\n return service.getCategoricalDomainAsync(this._worksheetName, this._fieldId, domainType);\n }\n}\nexports.CategoricalFilter = CategoricalFilter;\nclass HierarchicalDataValue {\n constructor(_value, _hierarchicalPath, _level) {\n this._value = _value;\n this._hierarchicalPath = _hierarchicalPath;\n this._level = _level;\n }\n get value() {\n return this._value;\n }\n get hierarchicalPath() {\n return this._hierarchicalPath;\n }\n get level() {\n return this._level;\n }\n}\nexports.HierarchicalDataValue = HierarchicalDataValue;\nclass HierarchicalLevelDetail {\n constructor(_name, _levelSelectionState) {\n this._name = _name;\n this._levelSelectionState = _levelSelectionState;\n }\n get name() {\n return this._name;\n }\n get levelSelectionState() {\n return this._levelSelectionState;\n }\n}\nexports.HierarchicalLevelDetail = HierarchicalLevelDetail;\nclass HierarchicalFilter extends Filter {\n constructor(worksheetName, fieldName, fieldId, filterType, registryId, _dimensionName, _hierarchyCaption, _numberOfLevels, _levelDetails, _appliedValues, _isAllSelected) {\n super(worksheetName, fieldName, filterType, fieldId, registryId);\n this._dimensionName = _dimensionName;\n this._hierarchyCaption = _hierarchyCaption;\n this._numberOfLevels = _numberOfLevels;\n this._levelDetails = _levelDetails;\n this._appliedValues = _appliedValues;\n this._isAllSelected = _isAllSelected;\n }\n getDomainAsync(domainType) {\n throw new Error('Method not implemented.');\n }\n get dimensionName() {\n return this._dimensionName;\n }\n get hierarchyCaption() {\n return this._hierarchyCaption;\n }\n get numberOfLevels() {\n return this._numberOfLevels;\n }\n get levelDetails() {\n return this._levelDetails;\n }\n get isAllSelected() {\n return this._isAllSelected;\n }\n get appliedValues() {\n return this._appliedValues;\n }\n}\nexports.HierarchicalFilter = HierarchicalFilter;\nclass RangeFilter extends Filter {\n constructor(worksheetName, fieldName, fieldId, filterType, registryId, _min, _max, _includeNullValues) {\n super(worksheetName, fieldName, filterType, fieldId, registryId);\n this._min = _min;\n this._max = _max;\n this._includeNullValues = _includeNullValues;\n }\n get minValue() {\n return this._min;\n }\n get maxValue() {\n return this._max;\n }\n get includeNullValues() {\n return this._includeNullValues;\n }\n getDomainAsync(domainType) {\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"filter-service\" /* ServiceNames.Filter */);\n if (!domainType) {\n domainType = api_external_contract_js_1.FilterDomainType.Relevant;\n }\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(domainType, api_external_contract_js_1.FilterDomainType, 'FilterDomainType');\n return service.getRangeDomainAsync(this._worksheetName, this._fieldId, domainType);\n }\n}\nexports.RangeFilter = RangeFilter;\nclass RelativeDateFilter extends Filter {\n constructor(worksheetName, fieldName, fieldId, filterType, registryId, _anchorDate, _periodType, _rangeType, _rangeN) {\n super(worksheetName, fieldName, filterType, fieldId, registryId);\n this._anchorDate = _anchorDate;\n this._periodType = _periodType;\n this._rangeType = _rangeType;\n this._rangeN = _rangeN;\n }\n get anchorDate() {\n return this._anchorDate;\n }\n get periodType() {\n return this._periodType;\n }\n get rangeType() {\n return this._rangeType;\n }\n get rangeN() {\n return this._rangeN;\n }\n}\nexports.RelativeDateFilter = RelativeDateFilter;\nclass CategoricalDomain {\n constructor(_values, _domainType) {\n this._values = _values;\n this._domainType = _domainType;\n }\n get values() {\n return this._values;\n }\n get type() {\n return this._domainType;\n }\n}\nexports.CategoricalDomain = CategoricalDomain;\nclass RangeDomain {\n constructor(_min, _max, _domainType) {\n this._min = _min;\n this._max = _max;\n this._domainType = _domainType;\n }\n get type() {\n return this._domainType;\n }\n get min() {\n return this._min;\n }\n get max() {\n return this._max;\n }\n}\nexports.RangeDomain = RangeDomain;\n//# sourceMappingURL=FilterModels.js.map","\"use strict\";\n/**\n * This is your main. This is where you re-export everything you want to be publicly available.\n *\n * The build enforces that the file has the same name as the global variable that is exported.\n */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\n__exportStar(require(\"./EmbeddingApiExternalContract\"), exports);\n__exportStar(require(\"./ExtensionsApiExternalContract\"), exports);\n//# sourceMappingURL=ExternalContract.js.map","\"use strict\";\n// All enum values made available to Embedding developers.\n// Enums should be kept in alphabetical order.\n// Most of them should match an enum on the server defined at\n// workgroup/vqlweb/scriptsharp/src/ApiShared/PublicEnums.cs#L398:17\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TableauDialogType = exports.ApiMenuType = exports.TableauEventType = exports.PulseErrorMessageVisibility = exports.PulseTimeDimension = exports.PulseLayout = exports.SheetSizeBehavior = exports.Toolbar = exports.ToolbarButtons = exports.RevertVizSelection = exports.PrintScaling = exports.PrintPageSize = exports.PrintOrientation = exports.EmbeddingErrorCodes = exports.DeviceType = exports.CrosstabFileFormat = void 0;\n/**\n * Crosstab file formats available to use with {@link Viz.exportCrosstabAsync}\n */\nvar CrosstabFileFormat;\n(function (CrosstabFileFormat) {\n CrosstabFileFormat[\"CSV\"] = \"csv\";\n CrosstabFileFormat[\"Excel\"] = \"xlsx\";\n})(CrosstabFileFormat || (exports.CrosstabFileFormat = CrosstabFileFormat = {}));\n/**\n * Device types available to use with {@link Viz.device}\n */\nvar DeviceType;\n(function (DeviceType) {\n DeviceType[\"Default\"] = \"default\";\n DeviceType[\"Desktop\"] = \"desktop\";\n DeviceType[\"Tablet\"] = \"tablet\";\n DeviceType[\"Phone\"] = \"phone\";\n})(DeviceType || (exports.DeviceType = DeviceType = {}));\n/**\n * All error codes used by the Embedding API.\n */\nvar EmbeddingErrorCodes;\n(function (EmbeddingErrorCodes) {\n /**\n * Raised when a request to the auth endpoint fails.\n */\n EmbeddingErrorCodes[\"AuthFailed\"] = \"auth-failed\";\n /**\n * The browser is not capable of supporting the Tableau Embedding API\n */\n EmbeddingErrorCodes[\"BrowserNotCapable\"] = \"browser-not-capable\";\n /**\n * The permissions on a workbook or a view do not allow downloading the workbook.\n */\n EmbeddingErrorCodes[\"DownloadWorkbookNotAllowed\"] = \"download-workbook-not-allowed\";\n /**\n * Thrown when an error occurs while attempting to perform a filter operation.\n */\n EmbeddingErrorCodes[\"FilterCannotBePerformed\"] = \"filter-cannot-be-performed\";\n /**\n * Thrown when attempting to switch to a sheet by index that does not exist in the workbook.\n */\n EmbeddingErrorCodes[\"IndexOutOfRange\"] = \"index-out-of-range\";\n /**\n * Thrown when an error occurs within the Tableau Embedding API. Contact Tableau Support.\n */\n EmbeddingErrorCodes[\"InternalError\"] = \"internal-error\";\n /**\n * An operation was attempted on a custom view that does not exist.\n */\n EmbeddingErrorCodes[\"InvalidCustomViewName\"] = \"invalid-custom-view-name\";\n /**\n * An invalid date was specified in a method that required a date parameter.\n */\n EmbeddingErrorCodes[\"InvalidDateParameter\"] = \"invalid-date-parameter\";\n /**\n * Either a filter operation was attempted on a field that does not exist in the data source, or the value supplied\n * in the filter operation is the wrong data type or format.\n */\n EmbeddingErrorCodes[\"invalidFilterFieldNameOrValue\"] = \"invalid-filter-field-name\";\n /**\n * A parameter is not the correct data type or format. The name of the parameter is specified in the Error.message\n * field.\n */\n EmbeddingErrorCodes[\"InvalidParameter\"] = \"invalid-parameter\";\n /**\n * The currently applied time dimension could not be determined or is invalid.\n */\n EmbeddingErrorCodes[\"InvalidTimeDimension\"] = \"invalid-time-dimension\";\n /**\n * A negative size was specified or the maxSize value is less than minSize in Sheet.changeSizeAsync().\n */\n EmbeddingErrorCodes[\"InvalidSize\"] = \"invalid-size\";\n /**\n * Attempted to get an authoring worksheet when the current sheet is not a worksheet.\n * @ignore\n */\n EmbeddingErrorCodes[\"InvalidSheetType\"] = \"invalid-sheet-type\";\n /**\n * A behavior value was found that is not included in the SheetSizeBehavior enum.\n */\n EmbeddingErrorCodes[\"InvalidSizeBehavior\"] = \"invalid-size-behavior\";\n /**\n * A behavior other than SheetSizeBehavior.Automatic was specified in Sheet.changeSizeAsync() when the sheet is a\n * Worksheet instance.\n */\n EmbeddingErrorCodes[\"InvalidSizeBehaviorOnWorksheet\"] = \"invalid-size-behavior-on-worksheet\";\n /**\n * The URL specified in the Viz class constructor is not valid.\n */\n EmbeddingErrorCodes[\"InvalidUrl\"] = \"invalid-url\";\n /**\n * The maxSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.AtMost.\n */\n EmbeddingErrorCodes[\"MissingMaxSize\"] = \"missing-max-size\";\n /**\n * The minSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.AtLeast.\n */\n EmbeddingErrorCodes[\"MissingMinSize\"] = \"missing-min-size\";\n /**\n * The minSize or maxSize field is missing in Sheet.changeSizeAsync() when specifying SheetSizeBehavior.Range.\n */\n EmbeddingErrorCodes[\"MissingMinMaxSize\"] = \"missing-min-max-size\";\n /**\n * Can occur if the embedding app interacts with a parameter that has been removed from the worksheet.\n */\n EmbeddingErrorCodes[\"MissingParameter\"] = \"missing-parameter\";\n /**\n * The rangeN field is missing for a relative date filter of type LASTN or NEXTN.\n */\n EmbeddingErrorCodes[\"MissingRangeNForRelativeDateFilters\"] = \"missing-range-n-for-relative-date-filters\";\n /**\n * An attempt was made to access Sheet.getUrl() on a hidden sheet. Hidden sheets do not have URLs.\n */\n EmbeddingErrorCodes[\"NoUrlForHiddenWorksheet\"] = \"no-url-for-hidden-worksheet\";\n /**\n * One or both of the parentElement or the URL parameters is not specified in the Viz constructor.\n */\n EmbeddingErrorCodes[\"NoUrlOrParentElementNotFound\"] = \"no-url-or-parent-element-not-found\";\n /**\n * An operation was attempted on a sheet that is not active or embedded within the active dashboard.\n */\n EmbeddingErrorCodes[\"NotActiveSheet\"] = \"not-active-sheet\";\n /**\n * A required parameter was not specified, null, or an empty string/array.\n */\n EmbeddingErrorCodes[\"NullOrEmptyParameter\"] = \"null-or-empty-parameter\";\n /**\n * An operation was attempted on a sheet that does not exist in the workbook.\n */\n EmbeddingErrorCodes[\"SheetNotInWorkbook\"] = \"sheet-not-in-workbook\";\n /**\n * An operation is performed on a CustomView object that is no longer valid (it has been removed).\n */\n EmbeddingErrorCodes[\"StaleDataReference\"] = \"stale-data-reference\";\n /**\n * Unknown error triggered during the auth flow.\n */\n EmbeddingErrorCodes[\"UnknownAuthError\"] = \"unknown-auth-error\";\n /**\n * An unknown event name was specified in the call to Viz.addEventListener or Viz.removeEventListener.\n */\n EmbeddingErrorCodes[\"UnsupportedEventName\"] = \"unsupported-event-name\";\n /**\n * A Viz object has already been created as a child of the parentElement specified in the Viz constructor.\n */\n EmbeddingErrorCodes[\"VizAlreadyInManager\"] = \"viz-already-in-manager\";\n /**\n * Function is not supported in the embedding api.\n */\n EmbeddingErrorCodes[\"ImplementationError\"] = \"wrong-implementation\";\n /**\n * @hidden (not implemented)\n */\n EmbeddingErrorCodes[\"NotImplemented\"] = \"not-implemented\";\n /**\n * Unknown error during event initialization\n */\n EmbeddingErrorCodes[\"EventInitializationError\"] = \"event-initialization-error\";\n /**\n * Version of the embedding api not supported by the version of tableau\n */\n EmbeddingErrorCodes[\"IncompatibleVersionError\"] = \"incompatible-version-error\";\n /**\n * Unknown {@link TableauDialogType} passed in to Viz.displayDialogAsync.\n */\n EmbeddingErrorCodes[\"UnknownDialogType\"] = \"unknown-dialog-type\";\n /**\n * Can occur if the API interacts with a filter that has been removed from the worksheet.\n * Can also occurs if a {@link FilterType} has not been implemented.\n */\n EmbeddingErrorCodes[\"FilterMissingOrNotImplemented\"] = \"filter-missing-not-implemented\";\n /**\n * Can occur if story point ids no longer match.\n */\n EmbeddingErrorCodes[\"StoryPointIdMismatch\"] = \"storypoint-id-mismatch\";\n})(EmbeddingErrorCodes || (exports.EmbeddingErrorCodes = EmbeddingErrorCodes = {}));\nvar PrintOrientation;\n(function (PrintOrientation) {\n PrintOrientation[\"Portrait\"] = \"portrait\";\n PrintOrientation[\"Landscape\"] = \"landscape\";\n})(PrintOrientation || (exports.PrintOrientation = PrintOrientation = {}));\nvar PrintPageSize;\n(function (PrintPageSize) {\n PrintPageSize[\"Letter\"] = \"letter\";\n PrintPageSize[\"Legal\"] = \"legal\";\n PrintPageSize[\"Note\"] = \"note\";\n PrintPageSize[\"Folio\"] = \"folio\";\n PrintPageSize[\"Tabloid\"] = \"tabloid\";\n PrintPageSize[\"Ledger\"] = \"ledger\";\n PrintPageSize[\"Statement\"] = \"statement\";\n PrintPageSize[\"Executive\"] = \"executive\";\n PrintPageSize[\"A3\"] = \"A3\";\n PrintPageSize[\"A4\"] = \"A4\";\n PrintPageSize[\"A5\"] = \"A5\";\n PrintPageSize[\"B4\"] = \"B4\";\n PrintPageSize[\"B5\"] = \"B5\";\n PrintPageSize[\"Quarto\"] = \"quarto\";\n PrintPageSize[\"Unspecified\"] = \"unspecified\";\n})(PrintPageSize || (exports.PrintPageSize = PrintPageSize = {}));\nvar PrintScaling;\n(function (PrintScaling) {\n PrintScaling[\"Automatic\"] = \"automatic\";\n PrintScaling[\"Perc25\"] = \"25%\";\n PrintScaling[\"Perc50\"] = \"50%\";\n PrintScaling[\"Perc60\"] = \"60%\";\n PrintScaling[\"Perc75\"] = \"75%\";\n PrintScaling[\"Perc80\"] = \"80%\";\n PrintScaling[\"Perc90\"] = \"90%\";\n PrintScaling[\"Perc100\"] = \"100%\";\n PrintScaling[\"Perc200\"] = \"200%\";\n PrintScaling[\"Perc400\"] = \"400%\";\n PrintScaling[\"AtMost1PageHigh\"] = \"at-most-1-page-high\";\n PrintScaling[\"AtMost2PagesHigh\"] = \"at-most-2-pages-high\";\n PrintScaling[\"AtMost1PageWide\"] = \"at-most-1-page-wide\";\n PrintScaling[\"AtMost2PagesWide\"] = \"at-most-2-pages-wide\";\n})(PrintScaling || (exports.PrintScaling = PrintScaling = {}));\nvar RevertVizSelection;\n(function (RevertVizSelection) {\n RevertVizSelection[\"All\"] = \"all\";\n RevertVizSelection[\"Axes\"] = \"axes\";\n RevertVizSelection[\"Filters\"] = \"filters\";\n RevertVizSelection[\"Sorts\"] = \"sorts\";\n RevertVizSelection[\"Shelves\"] = \"shelves\";\n})(RevertVizSelection || (exports.RevertVizSelection = RevertVizSelection = {}));\nvar ToolbarButtons;\n(function (ToolbarButtons) {\n ToolbarButtons[\"Alerts\"] = \"alerts\";\n ToolbarButtons[\"AskData\"] = \"askData\";\n ToolbarButtons[\"CustomViews\"] = \"customViews\";\n ToolbarButtons[\"DataDetails\"] = \"dataDetails\";\n ToolbarButtons[\"Share\"] = \"share\";\n ToolbarButtons[\"Subscribe\"] = \"subscribe\";\n})(ToolbarButtons || (exports.ToolbarButtons = ToolbarButtons = {}));\nvar Toolbar;\n(function (Toolbar) {\n Toolbar[\"Top\"] = \"top\";\n Toolbar[\"Bottom\"] = \"bottom\";\n Toolbar[\"Hidden\"] = \"hidden\";\n})(Toolbar || (exports.Toolbar = Toolbar = {}));\nvar SheetSizeBehavior;\n(function (SheetSizeBehavior) {\n SheetSizeBehavior[\"Automatic\"] = \"automatic\";\n SheetSizeBehavior[\"Exactly\"] = \"exactly\";\n SheetSizeBehavior[\"Range\"] = \"range\";\n SheetSizeBehavior[\"AtLeast\"] = \"atleast\";\n SheetSizeBehavior[\"AtMost\"] = \"atmost\";\n})(SheetSizeBehavior || (exports.SheetSizeBehavior = SheetSizeBehavior = {}));\nvar PulseLayout;\n(function (PulseLayout) {\n PulseLayout[\"Default\"] = \"default\";\n PulseLayout[\"Card\"] = \"card\";\n PulseLayout[\"Ban\"] = \"ban\";\n})(PulseLayout || (exports.PulseLayout = PulseLayout = {}));\nvar PulseTimeDimension;\n(function (PulseTimeDimension) {\n PulseTimeDimension[\"Today\"] = \"Today\";\n PulseTimeDimension[\"Yesterday\"] = \"Yesterday\";\n PulseTimeDimension[\"WeekToDate\"] = \"WeekToDate\";\n PulseTimeDimension[\"LastWeek\"] = \"LastWeek\";\n PulseTimeDimension[\"MonthToDate\"] = \"MonthToDate\";\n PulseTimeDimension[\"LastMonth\"] = \"LastMonth\";\n PulseTimeDimension[\"QuarterToDate\"] = \"QuarterToDate\";\n PulseTimeDimension[\"LastQuarter\"] = \"LastQuarter\";\n PulseTimeDimension[\"YearToDate\"] = \"YearToDate\";\n PulseTimeDimension[\"LastYear\"] = \"LastYear\";\n})(PulseTimeDimension || (exports.PulseTimeDimension = PulseTimeDimension = {}));\nvar PulseErrorMessageVisibility;\n(function (PulseErrorMessageVisibility) {\n PulseErrorMessageVisibility[\"Visible\"] = \"visible\";\n PulseErrorMessageVisibility[\"Hidden\"] = \"hidden\";\n PulseErrorMessageVisibility[\"Suppressed\"] = \"suppressed\";\n})(PulseErrorMessageVisibility || (exports.PulseErrorMessageVisibility = PulseErrorMessageVisibility = {}));\n/**\n * Be careful when adding new event types. Extensions and embedding follow two different patterns on how events are named.\n * Events should be all lower case and without hyphens or underscores.\n */\n/**\n * Represents the type of tableau embedding event that can be listened for.\n */\nvar TableauEventType;\n(function (TableauEventType) {\n /**\n * Raised when a custom view has finished loading. This event is raised after the callback function for {@link FirstInteractive} (if any) has been called.\n *\n * @category Viewing\n */\n TableauEventType[\"CustomViewLoaded\"] = \"customviewloaded\";\n /**\n * Raised when a custom view has been removed.\n *\n * @category Viewing\n */\n TableauEventType[\"CustomViewRemoved\"] = \"customviewremoved\";\n /**\n * Raised when a custom view has been saved (newly created or updated).\n *\n * @category Viewing\n */\n TableauEventType[\"CustomViewSaved\"] = \"customviewsaved\";\n /**\n * Raised when a custom view has been set as the default view for a workbook.\n *\n * @category Viewing\n */\n TableauEventType[\"CustomViewSetDefault\"] = \"customviewsetdefault\";\n /** Raised when the user clicks on the Edit Button.\n *\n * @category Viewing\n */\n TableauEventType[\"EditButtonClicked\"] = \"editbuttonclicked\";\n /** Raised when the user clicks on the Edit In Desktop Button.\n *\n * @category Authoring, Viewing\n */\n TableauEventType[\"EditInDesktopButtonClicked\"] = \"editindesktopbuttonclicked\";\n /** Raised when any filter has changed state. You can use this event type with TableauViz objects.\n *\n * @category Viewing\n */\n TableauEventType[\"FilterChanged\"] = \"filterchanged\";\n /** Fired when viz size is known\n *\n * @category Authoring, Viewing\n */\n TableauEventType[\"FirstVizSizeKnown\"] = \"firstvizsizeknown\";\n /** Fired when a viz first becomes interactive\n *\n * @category Authoring, Viewing, Pulse\n */\n TableauEventType[\"FirstInteractive\"] = \"firstinteractive\";\n /** Raised when a custom mark context menu is clicked.\n *\n * @category Viewing\n */\n TableauEventType[\"CustomMarkContextMenuEvent\"] = \"custommarkcontextmenu\";\n /** The selected marks on a visualization have changed. You can use this event type with TableauViz objects.\n *\n * @category Viewing\n */\n TableauEventType[\"MarkSelectionChanged\"] = \"markselectionchanged\";\n /** A parameter has had its value modified. You can use this event type with [[Parameter]] objects.\n *\n * @category Viewing\n */\n TableauEventType[\"ParameterChanged\"] = \"parameterchanged\";\n /** Raised when a toolbar button or control becomes available or becomes unavailable.\n *\n * @category Viewing\n */\n TableauEventType[\"ToolbarStateChanged\"] = \"toolbarstatechanged\";\n /** Raised when the workbook is ready to close. This notification is sent when using embedded web authoring functionality.\n *\n * @category Authoring\n */\n TableauEventType[\"WorkbookReadyToClose\"] = \"workbookreadytoclose\";\n /** Raised when the workbook has been published. This notification is sent when using embedded web authoring functionality.\n *\n * @category Authoring\n */\n TableauEventType[\"WorkbookPublished\"] = \"workbookpublished\";\n /** Raised when \"publish as\" is successful. This notification is sent when using embedded web authoring functionality.\n *\n * @category Authoring\n */\n TableauEventType[\"WorkbookPublishedAs\"] = \"workbookpublishedas\";\n /**\n * Raised when a URL action occurs. See the {@link UrlActionEvent} class.\n *\n * @category Viewing\n */\n TableauEventType[\"UrlAction\"] = \"urlaction\";\n /**\n * Raised after a tab switch occurs (the active sheet has changed). Guarantees the viz object will be interactive after this.\n *\n * @category Viewing\n */\n TableauEventType[\"TabSwitched\"] = \"tabswitched\";\n /**\n *\n * Raised after a new story point becomes active.\n *\n * @category Viewing\n */\n TableauEventType[\"StoryPointSwitched\"] = \"storypointswitched\";\n /**\n *\n * Raised when an error occurs while loading the contents of the webcomponent.\n *\n * @category Authoring, Viewing, AskData\n */\n TableauEventType[\"VizLoadError\"] = \"vizloaderror\";\n /**\n * Raised after the iframe src attribute has been updated\n *\n * @category Authoring, Viewing, AskData\n */\n TableauEventType[\"IframeSrcUpdated\"] = \"iframesrcupdated\";\n /**\n * Raised when changes are made to summary data.\n *\n * @category Viewing\n */\n TableauEventType[\"SummaryDataChanged\"] = \"summarydatachanged\";\n /**\n * Raised when tableau (viz-client) is ready to receive an auth token.\n * Used for authentication in salesforce native mode.\n *\n * @hidden\n * @category Authoring, Viewing,\n */\n TableauEventType[\"ReadyToReceiveAuthToken\"] = \"readytoreceiveauthtoken\";\n /**\n * Fired when the Pulse metric size is known\n *\n * @category Pulse\n */\n TableauEventType[\"FirstPulseMetricSizeKnown\"] = \"firstpulsemetricsizeknown\";\n /**\n * Fired when an internal Pulse error is encountered.\n *\n * @category Pulse\n */\n TableauEventType[\"PulseError\"] = \"pulseerror\";\n /**\n * Fired when the Pulse filters change\n *\n * @category Pulse\n */\n TableauEventType[\"PulseFiltersChanged\"] = \"pulsefilterschanged\";\n /**\n * Fired when a Pulse insight is discovered\n *\n * @category Pulse\n */\n TableauEventType[\"PulseInsightDiscovered\"] = \"pulseinsightdiscovered\";\n /**\n * Fired when the Pulse metric size changes\n *\n * @category Pulse\n */\n TableauEventType[\"PulseMetricSizeChanged\"] = \"pulsemetricsizechanged\";\n /**\n * Fired when the Pulse metric time dimension changes\n *\n * @category Pulse\n */\n TableauEventType[\"PulseTimeDimensionChanged\"] = \"pulsetimedimensionchanged\";\n /**\n * Fired when the Pulse URL changes\n *\n * @category Pulse\n */\n TableauEventType[\"PulseUrlChanged\"] = \"pulseurlchanged\";\n})(TableauEventType || (exports.TableauEventType = TableauEventType = {}));\n/**\n * Represents the location of a context menu where users can add external menu items.\n */\nvar ApiMenuType;\n(function (ApiMenuType) {\n /** External menu item will be injected in ubertip dialog */\n ApiMenuType[\"Ubertip\"] = \"ubertip\";\n})(ApiMenuType || (exports.ApiMenuType = ApiMenuType = {}));\n/** You can use this type with a {@link Viz} object. */\nvar TableauDialogType;\n(function (TableauDialogType) {\n /**\n * Used to display the download PDF dialog.\n */\n TableauDialogType[\"ExportPDF\"] = \"export-pdf\";\n /**\n * Used to display the download PowerPoint dialog.\n */\n TableauDialogType[\"ExportPowerPoint\"] = \"export-powerpoint\";\n /**\n * Used to display the download Data dialog.\n */\n TableauDialogType[\"ExportData\"] = \"export-data\";\n /**\n * Used to display the download CrossTab dialog.\n */\n TableauDialogType[\"ExportCrossTab\"] = \"export-cross-tab\";\n /**\n * Used to display the download Workbook dialog.\n */\n TableauDialogType[\"ExportWorkbook\"] = \"export-workbook\";\n /**\n * Used to display the Share dialog.\n */\n TableauDialogType[\"Share\"] = \"share\";\n})(TableauDialogType || (exports.TableauDialogType = TableauDialogType = {}));\n//# sourceMappingURL=Enums.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DataTableReader = void 0;\nconst ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nconst ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nclass DataTableReader {\n constructor(_id, _totalRowCount, _pageRowCount, _registryId) {\n this._id = _id;\n this._totalRowCount = _totalRowCount;\n this._pageRowCount = _pageRowCount;\n this._registryId = _registryId;\n this._pageCount = Math.ceil(_totalRowCount / _pageRowCount);\n }\n get totalRowCount() {\n return this._totalRowCount;\n }\n get pageCount() {\n return this._pageCount;\n }\n getPageAsync(pageNumber) {\n ErrorHelpers_1.ErrorHelpers.verifyRange(pageNumber, 0, this._pageCount);\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* ServiceNames.GetData */);\n return service.getPageAsync(this._id, pageNumber, this._pageRowCount);\n }\n getAllPagesAsync(maxRows) {\n return __awaiter(this, void 0, void 0, function* () {\n const firstPage = yield this.getPageAsync(0);\n maxRows = maxRows || this.totalRowCount;\n const rowsRequested = Math.min(maxRows, this.totalRowCount);\n const pagesRequested = Math.ceil(rowsRequested / this._pageRowCount);\n // Fetch up to 400 pages, with a default of 10,000 pageRowCount that gives us 4,000,000 rows\n const pagesToFetch = Math.min(pagesRequested, 400);\n const isDataLimited = pagesToFetch < pagesRequested;\n let remainingData = [];\n for (let i = 1; i < pagesToFetch; i++) {\n const page = yield this.getPageAsync(i);\n remainingData.push(page.data);\n }\n let fullData = firstPage.data.concat(...remainingData);\n // This slices the array only if maxRows has been set and is less than totalRowCount\n fullData.length = rowsRequested;\n return {\n name: firstPage.name,\n data: fullData,\n columns: firstPage.columns,\n totalRowCount: isDataLimited ? pagesToFetch * this._pageRowCount : rowsRequested,\n isTotalRowCountLimited: isDataLimited,\n isSummaryData: firstPage.isSummaryData,\n };\n });\n }\n releaseAsync() {\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* ServiceNames.GetData */);\n return service.releaseAsync(this._id);\n }\n}\nexports.DataTableReader = DataTableReader;\n//# sourceMappingURL=GetDataTableReaderModels.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SingleEventManagerImpl = void 0;\n/**\n * This class implements the SingleEventManager interface for a single type of Tableau event\n *\n * @template TEventType The Tableau event type this class specializes\n */\nclass SingleEventManagerImpl {\n constructor(eventType) {\n this._eventType = eventType;\n this._handlers = [];\n }\n get eventType() {\n return this._eventType;\n }\n addEventListener(handler) {\n this._handlers.push(handler);\n return () => this.removeEventListener(handler);\n }\n removeEventListener(handler) {\n const beforeCount = this._handlers.length;\n this._handlers = this._handlers.filter((h) => h !== handler);\n return beforeCount > this._handlers.length;\n }\n triggerEvent(eventGenerator) {\n for (const handler of this._handlers) {\n try {\n const eventModel = eventGenerator();\n handler(eventModel);\n }\n catch (e) {\n // Since this handler could be outside our control, just catch anything it throws and continue on\n continue;\n }\n }\n }\n}\nexports.SingleEventManagerImpl = SingleEventManagerImpl;\n//# sourceMappingURL=SingleEventManagerImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.IdentityVersionConverter = void 0;\n// tslint:disable:no-any\n/**\n * This version converter doesn't actually do anything but is useful for testing or when we have\n * a matching platform and internal version number\n */\nclass IdentityVersionConverter {\n upgradeExecuteCall(verb, parameters) {\n return {\n verb: verb,\n parameters: parameters,\n };\n }\n downgradeExecuteReturn(executeResponse) {\n return executeResponse;\n }\n downgradeNotification(notification) {\n return notification;\n }\n}\nexports.IdentityVersionConverter = IdentityVersionConverter;\n//# sourceMappingURL=IdentityVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AnimationServiceImpl = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nconst ErrorHelpers_1 = require(\"../../Utils/ErrorHelpers\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass AnimationServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"animation-service\" /* ServiceNames.Animation */;\n }\n replayAsync(replaySpeed) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.ReplaySpeed]: 1.0,\n };\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(replaySpeed, api_external_contract_js_1.ReplaySpeedType, 'ReplaySpeedType');\n parameters[api_internal_contract_js_1.ParameterId.ReplaySpeed] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setReplaySpeedType.convert(replaySpeed);\n return this.execute(api_internal_contract_js_1.VerbId.ReplayAnimation, parameters).then((response) => {\n return;\n });\n }\n}\nexports.AnimationServiceImpl = AnimationServiceImpl;\n//# sourceMappingURL=AnimationServiceImpl.js.map","\"use strict\";\n// This file re-exports everything which is part of the extensions api public interface\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VizImageSortDirectionType = exports.VizImageSizeSettingType = exports.VizImageSizeSettingAlignmentType = exports.VizImagePaletteType = exports.VizImageEncodingType = exports.TableauEventType = exports.ExtensionMode = exports.ExtensionContext = exports.ExportedMediaType = exports.ErrorCodes = void 0;\n__exportStar(require(\"./ExternalContract/Extensions/EventInterface\"), exports);\nvar Tableau_1 = require(\"./ExternalContract/Extensions/Namespaces/Tableau\");\nObject.defineProperty(exports, \"ErrorCodes\", { enumerable: true, get: function () { return Tableau_1.ErrorCodes; } });\nObject.defineProperty(exports, \"ExportedMediaType\", { enumerable: true, get: function () { return Tableau_1.ExportedMediaType; } });\nObject.defineProperty(exports, \"ExtensionContext\", { enumerable: true, get: function () { return Tableau_1.ExtensionContext; } });\nObject.defineProperty(exports, \"ExtensionMode\", { enumerable: true, get: function () { return Tableau_1.ExtensionMode; } });\nObject.defineProperty(exports, \"TableauEventType\", { enumerable: true, get: function () { return Tableau_1.TableauEventType; } });\nObject.defineProperty(exports, \"VizImageEncodingType\", { enumerable: true, get: function () { return Tableau_1.VizImageEncodingType; } });\nObject.defineProperty(exports, \"VizImagePaletteType\", { enumerable: true, get: function () { return Tableau_1.VizImagePaletteType; } });\nObject.defineProperty(exports, \"VizImageSizeSettingAlignmentType\", { enumerable: true, get: function () { return Tableau_1.VizImageSizeSettingAlignmentType; } });\nObject.defineProperty(exports, \"VizImageSizeSettingType\", { enumerable: true, get: function () { return Tableau_1.VizImageSizeSettingType; } });\nObject.defineProperty(exports, \"VizImageSortDirectionType\", { enumerable: true, get: function () { return Tableau_1.VizImageSortDirectionType; } });\n__exportStar(require(\"./ExternalContract/Extensions/Namespaces/UI\"), exports);\n__exportStar(require(\"./ExternalContract/Extensions/ParameterInterfaces\"), exports);\n__exportStar(require(\"./ExternalContract/Extensions/TableauError\"), exports);\n__exportStar(require(\"./SharedApiExternalContract\"), exports);\n//# sourceMappingURL=ExtensionsApiExternalContract.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SizeServiceImpl = void 0;\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass SizeServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"size-service\" /* ServiceNames.Size */;\n }\n changeSizeAsync(name, newSize) {\n var _a, _b, _c, _d;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'changeSizeAsync',\n [api_internal_contract_js_1.ParameterId.SheetName]: name,\n [api_internal_contract_js_1.ParameterId.MinHeight]: ((_a = newSize.minSize) === null || _a === void 0 ? void 0 : _a.height) || 0,\n [api_internal_contract_js_1.ParameterId.MinWidth]: ((_b = newSize.minSize) === null || _b === void 0 ? void 0 : _b.width) || 0,\n [api_internal_contract_js_1.ParameterId.MaxHeight]: ((_c = newSize.maxSize) === null || _c === void 0 ? void 0 : _c.height) || 0,\n [api_internal_contract_js_1.ParameterId.MaxWidth]: ((_d = newSize.maxSize) === null || _d === void 0 ? void 0 : _d.width) || 0,\n };\n return this.execute(api_internal_contract_js_1.VerbId.SetSheetSize, parameters).then((_response) => {\n return;\n });\n }\n}\nexports.SizeServiceImpl = SizeServiceImpl;\n//# sourceMappingURL=SizeServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=FilterInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=PreparedMessage.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Extensions = void 0;\n/**\n * Implementation of the external Extensions namespace.\n */\nclass Extensions {\n constructor(extensionImpl) {\n this.extensionImpl = extensionImpl;\n this.extensionImpl = extensionImpl;\n }\n get dashboardContent() {\n return this.extensionImpl.dashboardContent;\n }\n get worksheetContent() {\n return this.extensionImpl.worksheetContent;\n }\n get environment() {\n return this.extensionImpl.environment;\n }\n get settings() {\n return this.extensionImpl.settings;\n }\n get ui() {\n return this.extensionImpl.ui;\n }\n get workbook() {\n return this.extensionImpl.workbook;\n }\n get dashboardObjectId() {\n return this.extensionImpl.extensionZoneId;\n }\n initializeAsync(contextMenuCallbacks) {\n return this.extensionImpl.initializeAsync(false, contextMenuCallbacks).then();\n }\n initializeDialogAsync() {\n return this.extensionImpl.initializeAsync(true);\n }\n createVizImageAsync(inputSpec) {\n return this.extensionImpl.createVizImageAsync(inputSpec);\n }\n setClickThroughAsync(clickThroughEnabled) {\n return this.extensionImpl.setClickThroughAsync(clickThroughEnabled);\n }\n reportExtensionRenderComplete(mediaBlob) {\n return this.extensionImpl.reportExtensionRenderComplete(mediaBlob);\n }\n}\nexports.Extensions = Extensions;\n//# sourceMappingURL=Extensions.js.map","\"use strict\";\n/**\n * The tableau namespace exists for organization and to avoid polluting\n * the global namespace. It contains no constructs other than sub-namespaces and the Tableau enumerations.\n */\nvar Tableau;\n(function (Tableau) {\n let AnalyticsObjectType;\n (function (AnalyticsObjectType) {\n AnalyticsObjectType[\"Cluster\"] = \"cluster\";\n AnalyticsObjectType[\"Forecast\"] = \"forecast\";\n AnalyticsObjectType[\"TrendLine\"] = \"trend-line\";\n })(AnalyticsObjectType = Tableau.AnalyticsObjectType || (Tableau.AnalyticsObjectType = {}));\n let AnnotationType;\n (function (AnnotationType) {\n AnnotationType[\"Mark\"] = \"mark\";\n AnnotationType[\"Point\"] = \"point\";\n AnnotationType[\"Area\"] = \"area\";\n })(AnnotationType = Tableau.AnnotationType || (Tableau.AnnotationType = {}));\n let ColumnType;\n (function (ColumnType) {\n ColumnType[\"Discrete\"] = \"discrete\";\n ColumnType[\"Continuous\"] = \"continuous\";\n ColumnType[\"Unknown\"] = \"unknown\";\n })(ColumnType = Tableau.ColumnType || (Tableau.ColumnType = {}));\n let ClassNameKey;\n (function (ClassNameKey) {\n ClassNameKey[\"WorksheetTitle\"] = \"tableau-worksheet-title\";\n ClassNameKey[\"Worksheet\"] = \"tableau-worksheet\";\n ClassNameKey[\"Tooltip\"] = \"tableau-tooltip\";\n ClassNameKey[\"StoryTitle\"] = \"tableau-story-title\";\n ClassNameKey[\"DashboardTitle\"] = \"tableau-dashboard-title\";\n ClassNameKey[\"Pane\"] = \"tableau-pane\";\n ClassNameKey[\"RowDividers\"] = \"tableau-row-dividers\";\n ClassNameKey[\"ColumnDividers\"] = \"tableau-column-dividers\";\n })(ClassNameKey = Tableau.ClassNameKey || (Tableau.ClassNameKey = {}));\n /**\n * What the object represents in a dashboard.\n */\n let DashboardObjectType;\n (function (DashboardObjectType) {\n DashboardObjectType[\"Blank\"] = \"blank\";\n DashboardObjectType[\"Worksheet\"] = \"worksheet\";\n DashboardObjectType[\"QuickFilter\"] = \"quick-filter\";\n DashboardObjectType[\"ParameterControl\"] = \"parameter-control\";\n DashboardObjectType[\"PageFilter\"] = \"page-filter\";\n DashboardObjectType[\"Legend\"] = \"legend\";\n DashboardObjectType[\"Title\"] = \"title\";\n DashboardObjectType[\"Text\"] = \"text\";\n DashboardObjectType[\"Image\"] = \"image\";\n DashboardObjectType[\"WebPage\"] = \"web-page\";\n DashboardObjectType[\"Extension\"] = \"extension\";\n })(DashboardObjectType = Tableau.DashboardObjectType || (Tableau.DashboardObjectType = {}));\n /**\n * Enum that represents the visibility state of a dashboard object.\n * @since 1.7.0\n */\n let DashboardObjectVisibilityType;\n (function (DashboardObjectVisibilityType) {\n /** Used for turning on the visibility of a dashboard object.*/\n DashboardObjectVisibilityType[\"Show\"] = \"show\";\n /** Used for turning off the visibility of a dashboard object.*/\n DashboardObjectVisibilityType[\"Hide\"] = \"hide\";\n })(DashboardObjectVisibilityType = Tableau.DashboardObjectVisibilityType || (Tableau.DashboardObjectVisibilityType = {}));\n /**\n * The different types of data a value can have\n */\n let DataType;\n (function (DataType) {\n DataType[\"String\"] = \"string\";\n DataType[\"Int\"] = \"int\";\n DataType[\"Float\"] = \"float\";\n DataType[\"Bool\"] = \"bool\";\n DataType[\"Date\"] = \"date\";\n DataType[\"DateTime\"] = \"date-time\";\n DataType[\"Spatial\"] = \"spatial\";\n DataType[\"Unknown\"] = \"unknown\";\n })(DataType = Tableau.DataType || (Tableau.DataType = {}));\n /**\n * Enum that represents the changes that occur to a dashboard object.\n */\n let DashboardLayoutChange;\n (function (DashboardLayoutChange) {\n /** A dashboard object was added */\n DashboardLayoutChange[\"Added\"] = \"added\";\n /** A dashboard object was removed */\n DashboardLayoutChange[\"Removed\"] = \"removed\";\n /** A dashboard object's floating state changed */\n DashboardLayoutChange[\"IsFloatingChanged\"] = \"is-floating-changed\";\n /** A dashboard object's visibility changed */\n DashboardLayoutChange[\"IsVisibleChanged\"] = \"is-visible-changed\";\n /** A dashboard object's position changed */\n DashboardLayoutChange[\"PositionChanged\"] = \"position-changed\";\n /** A dashboard object's size changed */\n DashboardLayoutChange[\"SizeChanged\"] = \"size-changed\";\n /** A dashboard object was renamed */\n DashboardLayoutChange[\"NameChanged\"] = \"name-changed\";\n /** A dashboard object is selected */\n DashboardLayoutChange[\"Selected\"] = \"selected\";\n /** A dashboard object is deselected */\n DashboardLayoutChange[\"Deselected\"] = \"deselected\";\n /** Navigate to another dashboard */\n DashboardLayoutChange[\"DashboardChanged\"] = \"dashboard-changed\";\n })(DashboardLayoutChange = Tableau.DashboardLayoutChange || (Tableau.DashboardLayoutChange = {}));\n /**\n * Valid date ranges for a relative date filter.\n */\n let DateRangeType;\n (function (DateRangeType) {\n DateRangeType[\"Last\"] = \"last\";\n DateRangeType[\"LastN\"] = \"last-n\";\n DateRangeType[\"Next\"] = \"next\";\n DateRangeType[\"NextN\"] = \"next-n\";\n DateRangeType[\"Current\"] = \"current\";\n DateRangeType[\"ToDate\"] = \"to-date\";\n })(DateRangeType = Tableau.DateRangeType || (Tableau.DateRangeType = {}));\n /**\n * Enum that represents the types of dialog popup styles.\n */\n let DialogStyle;\n (function (DialogStyle) {\n DialogStyle[\"Window\"] = \"window\";\n DialogStyle[\"Modal\"] = \"modal\";\n DialogStyle[\"Modeless\"] = \"modeless\";\n })(DialogStyle = Tableau.DialogStyle || (Tableau.DialogStyle = {}));\n let EncodingType;\n (function (EncodingType) {\n EncodingType[\"Column\"] = \"column\";\n EncodingType[\"Row\"] = \"row\";\n EncodingType[\"Page\"] = \"page\";\n EncodingType[\"Filter\"] = \"filter\";\n EncodingType[\"MarksType\"] = \"marks-type\";\n EncodingType[\"MeasureValues\"] = \"measure-values\";\n EncodingType[\"Color\"] = \"color\";\n EncodingType[\"Size\"] = \"size\";\n EncodingType[\"Label\"] = \"label\";\n EncodingType[\"Detail\"] = \"detail\";\n EncodingType[\"Tooltip\"] = \"tooltip\";\n EncodingType[\"Shape\"] = \"shape\";\n EncodingType[\"Path\"] = \"path\";\n EncodingType[\"Angle\"] = \"angle\";\n EncodingType[\"Geometry\"] = \"geometry\";\n EncodingType[\"Custom\"] = \"custom\";\n })(EncodingType = Tableau.EncodingType || (Tableau.EncodingType = {}));\n /**\n * Type of aggregation on a field.\n */\n let FieldAggregationType;\n (function (FieldAggregationType) {\n FieldAggregationType[\"Sum\"] = \"sum\";\n FieldAggregationType[\"Avg\"] = \"avg\";\n FieldAggregationType[\"Min\"] = \"min\";\n FieldAggregationType[\"Max\"] = \"max\";\n FieldAggregationType[\"Stdev\"] = \"stdev\";\n FieldAggregationType[\"Stdevp\"] = \"stdevp\";\n FieldAggregationType[\"Var\"] = \"var\";\n FieldAggregationType[\"Varp\"] = \"varp\";\n FieldAggregationType[\"Collect\"] = \"collect\";\n FieldAggregationType[\"Count\"] = \"count\";\n FieldAggregationType[\"Countd\"] = \"countd\";\n FieldAggregationType[\"Median\"] = \"median\";\n FieldAggregationType[\"Attr\"] = \"attr\";\n FieldAggregationType[\"None\"] = \"none\";\n FieldAggregationType[\"Year\"] = \"year\";\n FieldAggregationType[\"Qtr\"] = \"qtr\";\n FieldAggregationType[\"Month\"] = \"month\";\n FieldAggregationType[\"Day\"] = \"day\";\n FieldAggregationType[\"Hour\"] = \"hour\";\n FieldAggregationType[\"Minute\"] = \"minute\";\n FieldAggregationType[\"Second\"] = \"second\";\n FieldAggregationType[\"Week\"] = \"week\";\n FieldAggregationType[\"Weekday\"] = \"weekday\";\n FieldAggregationType[\"MonthYear\"] = \"month-year\";\n FieldAggregationType[\"Mdy\"] = \"mdy\";\n FieldAggregationType[\"End\"] = \"end\";\n FieldAggregationType[\"TruncYear\"] = \"trunc-year\";\n FieldAggregationType[\"TruncQtr\"] = \"trunc-qtr\";\n FieldAggregationType[\"TruncMonth\"] = \"trunc-month\";\n FieldAggregationType[\"TruncWeek\"] = \"trunc-week\";\n FieldAggregationType[\"TruncDay\"] = \"trunc-day\";\n FieldAggregationType[\"TruncHour\"] = \"trunc-hour\";\n FieldAggregationType[\"TruncMinute\"] = \"trunc-minute\";\n FieldAggregationType[\"TruncSecond\"] = \"trunc-second\";\n FieldAggregationType[\"Quart1\"] = \"quart1\";\n FieldAggregationType[\"Quart3\"] = \"quart3\";\n FieldAggregationType[\"Skewness\"] = \"skewness\";\n FieldAggregationType[\"Kurtosis\"] = \"kurtosis\";\n FieldAggregationType[\"InOut\"] = \"in-out\";\n FieldAggregationType[\"User\"] = \"user\";\n })(FieldAggregationType = Tableau.FieldAggregationType || (Tableau.FieldAggregationType = {}));\n /**\n * Role of a field.\n */\n let FieldRoleType;\n (function (FieldRoleType) {\n FieldRoleType[\"Dimension\"] = \"dimension\";\n FieldRoleType[\"Measure\"] = \"measure\";\n FieldRoleType[\"Unknown\"] = \"unknown\";\n })(FieldRoleType = Tableau.FieldRoleType || (Tableau.FieldRoleType = {}));\n /**\n * An enumeration of the valid types of filters that can be applied.\n */\n let FilterType;\n (function (FilterType) {\n FilterType[\"Categorical\"] = \"categorical\";\n FilterType[\"Range\"] = \"range\";\n FilterType[\"Hierarchical\"] = \"hierarchical\";\n FilterType[\"RelativeDate\"] = \"relative-date\";\n })(FilterType = Tableau.FilterType || (Tableau.FilterType = {}));\n /**\n * The different update types for applying filter\n */\n let FilterUpdateType;\n (function (FilterUpdateType) {\n FilterUpdateType[\"Add\"] = \"add\";\n FilterUpdateType[\"All\"] = \"all\";\n FilterUpdateType[\"Replace\"] = \"replace\";\n FilterUpdateType[\"Remove\"] = \"remove\";\n })(FilterUpdateType = Tableau.FilterUpdateType || (Tableau.FilterUpdateType = {}));\n /**\n * The domain type for a filter\n */\n let FilterDomainType;\n (function (FilterDomainType) {\n /**\n * The domain values that are relevant to the specified filter\n * i.e. the domain is restricted by a previous filter\n */\n FilterDomainType[\"Relevant\"] = \"relevant\";\n /**\n * list of all possible domain values from database\n */\n FilterDomainType[\"Database\"] = \"database\";\n })(FilterDomainType = Tableau.FilterDomainType || (Tableau.FilterDomainType = {}));\n /**\n * The option for specifying which values to include for filtering\n * Indicates what to do with null values for a given filter or mark selection call.\n */\n let FilterNullOption;\n (function (FilterNullOption) {\n FilterNullOption[\"NullValues\"] = \"null-values\";\n FilterNullOption[\"NonNullValues\"] = \"non-null-values\";\n FilterNullOption[\"AllValues\"] = \"all-values\";\n })(FilterNullOption = Tableau.FilterNullOption || (Tableau.FilterNullOption = {}));\n /**\n * Enum that serves as a filter on the DataValues returned from `getSummaryDataReaderAsync`,\n * `getUnderlyingTableDataReaderAsync` and `getLogicalTableDataReaderAsync`.\n * This is an optimization of returned data values only. Tableau versions prior to 2021.2\n * will pass the data across and populate the DataValue properties.\n * Please note that all properties not requested will be `undefined` in the DataValue results.\n * @since 1.5.0\n */\n let IncludeDataValuesOption;\n (function (IncludeDataValuesOption) {\n /** DataValues will include all properties.*/\n IncludeDataValuesOption[\"AllValues\"] = \"all-values\";\n /** DataValues will only include value and nativeValue properties.*/\n IncludeDataValuesOption[\"OnlyNativeValues\"] = \"only-native-values\";\n /** DataValues will only include formattedValue properties. */\n IncludeDataValuesOption[\"OnlyFormattedValues\"] = \"only-formatted-values\";\n })(IncludeDataValuesOption = Tableau.IncludeDataValuesOption || (Tableau.IncludeDataValuesOption = {}));\n /**\n * Type of mark for a given marks card in a viz.\n */\n let MarkType;\n (function (MarkType) {\n MarkType[\"Bar\"] = \"bar\";\n MarkType[\"Line\"] = \"line\";\n MarkType[\"Area\"] = \"area\";\n MarkType[\"Square\"] = \"square\";\n MarkType[\"Circle\"] = \"circle\";\n MarkType[\"Shape\"] = \"shape\";\n MarkType[\"Text\"] = \"text\";\n MarkType[\"Map\"] = \"map\";\n MarkType[\"Pie\"] = \"pie\";\n MarkType[\"GanttBar\"] = \"gantt-bar\";\n MarkType[\"Polygon\"] = \"polygon\";\n MarkType[\"Heatmap\"] = \"heatmap\";\n MarkType[\"VizExtension\"] = \"viz-extension\";\n })(MarkType = Tableau.MarkType || (Tableau.MarkType = {}));\n let DataFormatType;\n (function (DataFormatType) {\n DataFormatType[\"AutoFormat\"] = \"auto-format\";\n DataFormatType[\"SystemNumber\"] = \"system-number\";\n DataFormatType[\"SystemCurrency\"] = \"system-currency\";\n DataFormatType[\"SystemLongDate\"] = \"system-long-date\";\n DataFormatType[\"SystemShortDate\"] = \"system-short-date\";\n DataFormatType[\"SystemTime\"] = \"system-time\";\n DataFormatType[\"Custom\"] = \"custom\";\n DataFormatType[\"CustomNumber\"] = \"custom-number\";\n DataFormatType[\"CustomCurrency\"] = \"custom-currency\";\n DataFormatType[\"CustomScientific\"] = \"custom-scientific\";\n DataFormatType[\"CustomPercentage\"] = \"custom-percentage\";\n })(DataFormatType = Tableau.DataFormatType || (Tableau.DataFormatType = {}));\n let NumberFormatUnits;\n (function (NumberFormatUnits) {\n NumberFormatUnits[\"None\"] = \"units-none\";\n NumberFormatUnits[\"Thousands\"] = \"units-thousands\";\n NumberFormatUnits[\"Millions\"] = \"units-millions\";\n NumberFormatUnits[\"BillionsEnglish\"] = \"units-billions-english\";\n NumberFormatUnits[\"BillionsStandard\"] = \"units-billions-standard\";\n })(NumberFormatUnits = Tableau.NumberFormatUnits || (Tableau.NumberFormatUnits = {}));\n let NegativeNumberFormat;\n (function (NegativeNumberFormat) {\n NegativeNumberFormat[\"Automatic\"] = \"automatic\";\n NegativeNumberFormat[\"Parentheses\"] = \"parentheses\";\n NegativeNumberFormat[\"OuterPrefix\"] = \"outer-prefix\";\n NegativeNumberFormat[\"OuterSuffix\"] = \"outer-suffix\";\n NegativeNumberFormat[\"InnerPrefix\"] = \"inner-prefix\";\n NegativeNumberFormat[\"InnerSuffix\"] = \"inner-suffix\";\n })(NegativeNumberFormat = Tableau.NegativeNumberFormat || (Tableau.NegativeNumberFormat = {}));\n /**\n * An enumeration describing the different types of allowable values.\n * This is used for restricting the domain of a parameter\n */\n let ParameterValueType;\n (function (ParameterValueType) {\n ParameterValueType[\"All\"] = \"all\";\n ParameterValueType[\"List\"] = \"list\";\n ParameterValueType[\"Range\"] = \"range\";\n })(ParameterValueType = Tableau.ParameterValueType || (Tableau.ParameterValueType = {}));\n /**\n * Date period used in filters and in parameters.\n */\n let PeriodType;\n (function (PeriodType) {\n PeriodType[\"Years\"] = \"years\";\n PeriodType[\"Quarters\"] = \"quarters\";\n PeriodType[\"Months\"] = \"months\";\n PeriodType[\"Weeks\"] = \"weeks\";\n PeriodType[\"Days\"] = \"days\";\n PeriodType[\"Hours\"] = \"hours\";\n PeriodType[\"Minutes\"] = \"minutes\";\n PeriodType[\"Seconds\"] = \"seconds\";\n PeriodType[\"IsoYears\"] = \"iso-years\";\n PeriodType[\"IsoQuarters\"] = \"iso-quarters\";\n PeriodType[\"IsoWeeks\"] = \"iso-weeks\";\n })(PeriodType = Tableau.PeriodType || (Tableau.PeriodType = {}));\n let QuickTableCalcType;\n (function (QuickTableCalcType) {\n QuickTableCalcType[\"RunningTotal\"] = \"running-total\";\n QuickTableCalcType[\"Difference\"] = \"difference\";\n QuickTableCalcType[\"PercentDifference\"] = \"percent-difference\";\n QuickTableCalcType[\"PercentOfTotal\"] = \"percent-of-total\";\n QuickTableCalcType[\"Rank\"] = \"rank\";\n QuickTableCalcType[\"Percentile\"] = \"percentile\";\n QuickTableCalcType[\"MovingAverage\"] = \"moving-average\";\n QuickTableCalcType[\"YTDTotal\"] = \"ytd-total\";\n QuickTableCalcType[\"CompoundGrowthRate\"] = \"compound-growth-rate\";\n QuickTableCalcType[\"YearOverYearGrowth\"] = \"year-over-year-growth\";\n QuickTableCalcType[\"YTDGrowth\"] = \"ytd-growth\";\n QuickTableCalcType[\"Undefined\"] = \"undefined\";\n })(QuickTableCalcType = Tableau.QuickTableCalcType || (Tableau.QuickTableCalcType = {}));\n /**\n * Enum for specifying the selection type for select marks api.\n */\n let SelectionUpdateType;\n (function (SelectionUpdateType) {\n SelectionUpdateType[\"Replace\"] = \"select-replace\";\n SelectionUpdateType[\"Add\"] = \"select-add\";\n SelectionUpdateType[\"Remove\"] = \"select-remove\";\n })(SelectionUpdateType = Tableau.SelectionUpdateType || (Tableau.SelectionUpdateType = {}));\n /**\n * Enum for specifying the select option for the `extensions.Worksheet.selectTuplesAsync` method.\n */\n let SelectOptions;\n (function (SelectOptions) {\n /**\n * Clears existing selection before selecting the tuples specified\n */\n SelectOptions[\"Simple\"] = \"select-options-simple\";\n /**\n * Adds specified tuples to the existing selection\n */\n SelectOptions[\"Toggle\"] = \"select-options-toggle\";\n })(SelectOptions = Tableau.SelectOptions || (Tableau.SelectOptions = {}));\n /**\n * The type of sheet a [[Sheet]] object represents\n */\n let SheetType;\n (function (SheetType) {\n SheetType[\"Dashboard\"] = \"dashboard\";\n SheetType[\"Story\"] = \"story\";\n SheetType[\"Worksheet\"] = \"worksheet\";\n })(SheetType = Tableau.SheetType || (Tableau.SheetType = {}));\n let SortDirection;\n (function (SortDirection) {\n SortDirection[\"Increasing\"] = \"increasing\";\n SortDirection[\"Decreasing\"] = \"decreasing\";\n })(SortDirection = Tableau.SortDirection || (Tableau.SortDirection = {}));\n let TrendLineModelType;\n (function (TrendLineModelType) {\n TrendLineModelType[\"Linear\"] = \"linear\";\n TrendLineModelType[\"Logarithmic\"] = \"logarithmic\";\n TrendLineModelType[\"Exponential\"] = \"exponential\";\n TrendLineModelType[\"Polynomial\"] = \"polynomial\";\n })(TrendLineModelType = Tableau.TrendLineModelType || (Tableau.TrendLineModelType = {}));\n /**\n * Enum that represents the replay speed of an animation.\n * @since 1.7.0\n */\n let ReplaySpeedType;\n (function (ReplaySpeedType) {\n /** Used for setting the replay speed of an animation to 0.5x.*/\n ReplaySpeedType[\"Slow\"] = \"slow\";\n /** Used for setting the replay speed of an animation to 1.0x.*/\n ReplaySpeedType[\"Normal\"] = \"normal\";\n /** Used for setting the replay speed of an animation to 2.0x.*/\n ReplaySpeedType[\"Fast\"] = \"fast\";\n })(ReplaySpeedType = Tableau.ReplaySpeedType || (Tableau.ReplaySpeedType = {}));\n /**\n * Enum that represents the selection state of a level in a hierarchical filter\n * @since Extensions 1.10.0\n */\n let HierarchicalLevelSelectionState;\n (function (HierarchicalLevelSelectionState) {\n HierarchicalLevelSelectionState[\"AllSelected\"] = \"all-selected\";\n HierarchicalLevelSelectionState[\"NoneSelected\"] = \"none-selected\";\n HierarchicalLevelSelectionState[\"SomeSelected\"] = \"some-selected\";\n HierarchicalLevelSelectionState[\"UnknownSelected\"] = \"unknown-selected\";\n })(HierarchicalLevelSelectionState = Tableau.HierarchicalLevelSelectionState || (Tableau.HierarchicalLevelSelectionState = {}));\n Tableau.ZoneVisibilityType = Object.assign({}, DashboardObjectVisibilityType);\n})(Tableau || (Tableau = {}));\nmodule.exports = Tableau;\n//# sourceMappingURL=Tableau.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DowngradeWorksheetFomattingNotification175 = exports.DowngradeWorksheetFomatting175 = void 0;\nexports.DowngradeWorksheetNames = DowngradeWorksheetNames;\nexports.DowngradeFlipboardZoneID = DowngradeFlipboardZoneID;\nexports.DowngradeExtensionEnvironmentContext = DowngradeExtensionEnvironmentContext;\nexports.DowngradePeriodType = DowngradePeriodType;\nconst JsApiInternalContract_1 = require(\"../JsApiInternalContract\");\nconst Notifications_1 = require(\"../contract/Notifications\");\n// This is where we will start to define some of these translations.\n// When modifying existing models, add the requisite conversion functions here, then use them\n// in the VersionConverterFactory implementation. Import old versions as you would any other module\n// 0 <-> Translations\n// Uncomment this line to import from the V0 definition of the API\n// import * as V0 from '@tableau/api-internal-contract-js-v0';\n// 1 <-> 2 Translations\n// Uncomment this line to import from the V1 definition of the API\n// import * as V1 from '@tableau/api-internal-contract-js-v1';\nfunction DowngradeWorksheetNames(executeResponse) {\n // Fix the dashboard friendly name issue. The structures are compatible,\n // so we still return the original reply, but we copy the SheetInfo.name\n // into the DashboardZone.name, where v1 wants to find it.\n const bootstrapInfo = executeResponse.result;\n if (bootstrapInfo.extensionDashboardInfo !== undefined) {\n bootstrapInfo.extensionDashboardInfo.zones.forEach((zone) => {\n if (zone.sheetInfo) {\n zone.name = zone.sheetInfo.name;\n }\n });\n }\n return executeResponse;\n}\nfunction DowngradeFlipboardZoneID(notification) {\n // Fix the FlipboardZoneId issue. Older external versions still check for flipboardZoneIDs.\n // When running against a newer server, if flipboardZoneId is absent, set it to default(0).\n if (notification.notificationId === Notifications_1.NotificationId.SelectedMarksChanged) {\n const visualModel = notification.data;\n if (visualModel.flipboardZoneID === undefined) {\n visualModel.flipboardZoneID = 0;\n }\n }\n return notification;\n}\n// Filter out formatting sheets that are specified in the classNames list\nfunction DowngradeWorksheetFormatting(executeResponse, classNames) {\n var _a;\n const bootstrapInfo = executeResponse.result;\n if ((_a = bootstrapInfo === null || bootstrapInfo === void 0 ? void 0 : bootstrapInfo.extensionWorksheetInfo) === null || _a === void 0 ? void 0 : _a.formatting)\n bootstrapInfo.extensionWorksheetInfo.formatting.formattingSheets =\n bootstrapInfo.extensionWorksheetInfo.formatting.formattingSheets.filter((x) => !classNames.includes(x.classNameKey));\n return executeResponse;\n}\n// Filter out formatting sheets that are specified in the classNames list\n// Filter out formatting sheets that are specified in the classNames list\nfunction DowngradeWorksheetFormattingNotification(notification, classNames) {\n if (notification.notificationId === Notifications_1.NotificationId.WorksheetFormattingChanged) {\n const formatting = notification.data;\n notification.data = formatting.formattingSheets.filter((x) => !classNames.includes(x.classNameKey));\n }\n return notification;\n}\n// We added new enum values for ClassNameKeys enum in 176. Need to filter them out if the client version is <176\nconst ClassNameKeysToFilter175 = [\"tableau-row-dividers\" /* ClassNameKey.RowDividers */, \"tableau-column-dividers\" /* ClassNameKey.ColumnDividers */, \"tableau-pane\" /* ClassNameKey.Pane */];\nconst DowngradeWorksheetFomatting175 = (response) => DowngradeWorksheetFormatting(response, ClassNameKeysToFilter175);\nexports.DowngradeWorksheetFomatting175 = DowngradeWorksheetFomatting175;\nconst DowngradeWorksheetFomattingNotification175 = (notification) => DowngradeWorksheetFormattingNotification(notification, ClassNameKeysToFilter175);\nexports.DowngradeWorksheetFomattingNotification175 = DowngradeWorksheetFomattingNotification175;\nfunction DowngradeExtensionEnvironmentContext(executeResponse) {\n // Fix the extension environment context issue. Replaces new enum values that go unrecognized\n // by older extensions with their respective older enum values.\n const bootstrapInfo = executeResponse.result;\n if (bootstrapInfo.extensionEnvironment !== undefined) {\n const context = bootstrapInfo.extensionEnvironment.extensionContext;\n if (context === JsApiInternalContract_1.ExtensionContext.PublicWeb || context === JsApiInternalContract_1.ExtensionContext.Cloud) {\n bootstrapInfo.extensionEnvironment.extensionContext = JsApiInternalContract_1.ExtensionContext.Server;\n }\n else if (context === JsApiInternalContract_1.ExtensionContext.PublicDesktop) {\n bootstrapInfo.extensionEnvironment.extensionContext = JsApiInternalContract_1.ExtensionContext.Desktop;\n }\n }\n return executeResponse;\n}\nfunction HandleDowngradePeriodTypeForParameter(parameter) {\n if (parameter.allowableValuesType === JsApiInternalContract_1.DomainRestrictionType.Range) {\n if (parameter.dateStepPeriod === JsApiInternalContract_1.DateStepPeriod.IsoYears) {\n parameter.dateStepPeriod = JsApiInternalContract_1.DateStepPeriod.Years;\n }\n else if (parameter.dateStepPeriod === JsApiInternalContract_1.DateStepPeriod.IsoQuarters) {\n parameter.dateStepPeriod = JsApiInternalContract_1.DateStepPeriod.Quarters;\n }\n else if (parameter.dateStepPeriod === JsApiInternalContract_1.DateStepPeriod.IsoWeeks) {\n parameter.dateStepPeriod = JsApiInternalContract_1.DateStepPeriod.Weeks;\n }\n }\n}\nfunction DowngradePeriodType(executeResponse) {\n if (Array.isArray(executeResponse.result)) {\n const parameters = executeResponse.result;\n for (const parameter of parameters) {\n HandleDowngradePeriodTypeForParameter(parameter);\n }\n }\n else {\n const parameter = executeResponse.result;\n HandleDowngradePeriodTypeForParameter(parameter);\n }\n return executeResponse;\n}\n//# sourceMappingURL=VersionTranslations.js.map","\"use strict\";\n/**\n * This is your main. This is where you re-export everything you want to be publicly available.\n *\n * The build enforces that the file has the same name as the global variable that is exported.\n */\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MESSAGING_VERSION = exports.INTERNAL_CONTRACT_VERSION = void 0;\n// Export the version of the internal contract to be available at runtime\n// This file is generated by yarn publish:bump via scripts/publish-check.ts\n// updateInternalContractRuntimeVersion in the monorepo root.\nconst internalContractVersion = require(\"../internal-contract-version.json\");\nexports.INTERNAL_CONTRACT_VERSION = internalContractVersion;\n__exportStar(require(\"./contract/DataTypeConverter\"), exports);\n__exportStar(require(\"./contract/Enums\"), exports);\n__exportStar(require(\"./contract/Models\"), exports);\n__exportStar(require(\"./contract/Notifications\"), exports);\n__exportStar(require(\"./contract/Parameters\"), exports);\n__exportStar(require(\"./contract/Verbs\"), exports);\n__exportStar(require(\"./interface/AskDataInterface\"), exports);\n__exportStar(require(\"./interface/InitializationOptions\"), exports);\n__exportStar(require(\"./interface/InternalApiDispatcher\"), exports);\n__exportStar(require(\"./interface/PulseInterface\"), exports);\n__exportStar(require(\"./interface/VersionNumber\"), exports);\n__exportStar(require(\"./interface/VqlInterface\"), exports);\n__exportStar(require(\"./messaging/CrossFrameMessenger\"), exports);\n__exportStar(require(\"./messaging/interface/MessageDispatcher\"), exports);\n__exportStar(require(\"./messaging/interface/MessageListener\"), exports);\n__exportStar(require(\"./messaging/interface/MessageTypes\"), exports);\n__exportStar(require(\"./messaging/interface/Messenger\"), exports);\n__exportStar(require(\"./messaging/interface/PreparedMessage\"), exports);\n__exportStar(require(\"./versioning/external/ExternalContractVersionConverter\"), exports);\n__exportStar(require(\"./versioning/external/ExternalIdentityVersionConverter\"), exports);\n__exportStar(require(\"./versioning/external/ExternalVersionConverterFactory\"), exports);\n__exportStar(require(\"./versioning/InternalContractVersionConverter\"), exports);\n__exportStar(require(\"./versioning/VersionConverterFactory\"), exports);\n// Export the version number of messaging for consumers to use.\n// Be very careful making any updates to this contract which break version compatibility.\nexports.MESSAGING_VERSION = {\n major: 1,\n minor: 0,\n fix: 0,\n};\n//# sourceMappingURL=JsApiInternalContract.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.UnregisterTimeoutInMilliseconds = exports.Deferred = void 0;\n/**\n * A Promise wrapper class allowing for resolving/rejecting the Promise outside the context of its constructor.\n *\n * @export\n * @class Deferred\n * @template TResolve The type used to resolve the promise.\n * @template TReject The type used to reject the promise. Defaults to any.\n * @link https://stackoverflow.com/a/34637436\n */\nclass Deferred {\n /**\n * Creates an instance of Deferred.\n */\n constructor() {\n this._promise = new Promise((resolve, reject) => {\n this._resolve = resolve;\n this._reject = reject;\n });\n }\n /**\n * Gets the Promise.\n *\n * @readonly\n * @type {Promise}\n */\n get promise() {\n return this._promise;\n }\n /**\n * Resolves the wrapped Promise.\n *\n * @param {(TResolve | PromiseLike)} response The argument to be resolved by the Promise.\n * @returns {*} {void}\n */\n resolve(response) {\n if (!this._resolve) {\n return;\n }\n this._resolve(response);\n }\n /**\n *\n *\n * @param {TReject} [reason] The reason why the Promise rejected.\n * @returns {*} {void}\n */\n reject(reason) {\n if (!this._reject) {\n return;\n }\n this._reject(reason);\n }\n}\nexports.Deferred = Deferred;\nexports.UnregisterTimeoutInMilliseconds = 30000;\n//# sourceMappingURL=Deferred.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NotificationId = void 0;\nvar NotificationId;\n(function (NotificationId) {\n NotificationId[\"CustomMarkContextMenuClicked\"] = \"custom-mark-context-menu-clicked\";\n NotificationId[\"ContextMenuClick\"] = \"context-menu-click\";\n NotificationId[\"CustomViewRemoved\"] = \"custom-view-removed\";\n NotificationId[\"CustomViewSaved\"] = \"custom-view-saved\";\n NotificationId[\"CustomViewSetDefault\"] = \"custom-view-set-default\";\n NotificationId[\"CustomViewsLoaded\"] = \"custom-views-loaded\";\n NotificationId[\"DashboardLayoutChanged\"] = \"dashboard-layout-changed\";\n NotificationId[\"EditButtonClicked\"] = \"edit-button-clicked\";\n NotificationId[\"EditInDesktopButtonClicked\"] = \"edit-in-desktop-button-clicked\";\n NotificationId[\"ExtensionDialogUpdate\"] = \"extension-dialog-update\";\n NotificationId[\"ExtensionDialogMessage\"] = \"extension-dialog-message\";\n NotificationId[\"FilterChanged\"] = \"filter-changed\";\n NotificationId[\"FirstVizSizeKnown\"] = \"first-viz-size-known\";\n NotificationId[\"FirstPulseMetricSizeKnown\"] = \"first-pulse-metric-size-known\";\n NotificationId[\"ParameterChanged\"] = \"parameter-changed\";\n NotificationId[\"PulseError\"] = \"pulse-error\";\n NotificationId[\"PulseFiltersChanged\"] = \"pulse-filters-changed\";\n NotificationId[\"PulseMetricSizeChanged\"] = \"pulse-metric-size-changed\";\n NotificationId[\"PulseInsightDiscovered\"] = \"pulse-insight-discovered\";\n NotificationId[\"PulseInteractive\"] = \"pulse-interactive\";\n NotificationId[\"PulseTimeDimensionChanged\"] = \"pulse-time-dimension-changed\";\n NotificationId[\"PulseUrlChanged\"] = \"pulse-url-changed\";\n NotificationId[\"SelectedMarksChanged\"] = \"selected-marks-changed\";\n NotificationId[\"SettingsChanged\"] = \"settings-changed\";\n NotificationId[\"SummaryDataChanged\"] = \"summary-data-changed\";\n NotificationId[\"TestConversionNotification\"] = \"test-conversion-notification\";\n NotificationId[\"ToolbarStateChanged\"] = \"toolbar-state-changed\";\n NotificationId[\"VizInteractive\"] = \"viz-interactive\";\n NotificationId[\"AskDataInteractive\"] = \"ask-data-interactive\";\n NotificationId[\"WorkbookReadyToClose\"] = \"workbook-ready-to-close\";\n NotificationId[\"WorkbookFormattingChanged\"] = \"workbook-formatting-changed\";\n NotificationId[\"WorkbookPublished\"] = \"workbook-published\";\n NotificationId[\"WorkbookPublishedAs\"] = \"workbook-published-as\";\n NotificationId[\"WorksheetFormattingChanged\"] = \"worksheet-formatting-changed\";\n NotificationId[\"UrlAction\"] = \"url-action\";\n NotificationId[\"TabSwitched\"] = \"tab-switched\";\n NotificationId[\"StoryPointSwitched\"] = \"story-point-switched\";\n NotificationId[\"ReadyToReceiveAuthToken\"] = \"ready-to-receive-auth-token\";\n})(NotificationId || (exports.NotificationId = NotificationId = {}));\n//# sourceMappingURL=Notifications.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=VizQLDataServiceInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=SheetInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.InternalToExternalEnumMappings = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst EnumConverter_1 = require(\"../Utils/EnumConverter\");\n/* tslint:disable:typedef - Disable this to make declaring these classes a bit easier */\n/**\n * Maps enums used by the internal-api-contract to the enums used\n * in the external-api-contract, which developers code against.\n */\nclass InternalToExternalEnumMappings {\n}\nexports.InternalToExternalEnumMappings = InternalToExternalEnumMappings;\nInternalToExternalEnumMappings.extensionContext = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.ExtensionContext.Desktop]: api_external_contract_js_1.ExtensionContext.Desktop,\n [api_internal_contract_js_1.ExtensionContext.Server]: api_external_contract_js_1.ExtensionContext.Server,\n [api_internal_contract_js_1.ExtensionContext.PublicWeb]: api_external_contract_js_1.ExtensionContext.PublicWeb,\n [api_internal_contract_js_1.ExtensionContext.PublicDesktop]: api_external_contract_js_1.ExtensionContext.PublicDesktop,\n [api_internal_contract_js_1.ExtensionContext.Cloud]: api_external_contract_js_1.ExtensionContext.Cloud,\n});\nInternalToExternalEnumMappings.dataFormatType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.DataFormatType.AutoFormat]: api_external_contract_js_1.DataFormatType.AutoFormat,\n [api_internal_contract_js_1.DataFormatType.SystemNumber]: api_external_contract_js_1.DataFormatType.SystemNumber,\n [api_internal_contract_js_1.DataFormatType.SystemCurrency]: api_external_contract_js_1.DataFormatType.SystemCurrency,\n [api_internal_contract_js_1.DataFormatType.SystemLongDate]: api_external_contract_js_1.DataFormatType.SystemLongDate,\n [api_internal_contract_js_1.DataFormatType.SystemShortDate]: api_external_contract_js_1.DataFormatType.SystemShortDate,\n [api_internal_contract_js_1.DataFormatType.SystemTime]: api_external_contract_js_1.DataFormatType.SystemTime,\n [api_internal_contract_js_1.DataFormatType.Custom]: api_external_contract_js_1.DataFormatType.Custom,\n [api_internal_contract_js_1.DataFormatType.CustomNumber]: api_external_contract_js_1.DataFormatType.CustomNumber,\n [api_internal_contract_js_1.DataFormatType.CustomCurrency]: api_external_contract_js_1.DataFormatType.CustomCurrency,\n});\nInternalToExternalEnumMappings.numberFormatUnits = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.NumberFormatUnits.None]: api_external_contract_js_1.NumberFormatUnits.None,\n [api_internal_contract_js_1.NumberFormatUnits.Thousands]: api_external_contract_js_1.NumberFormatUnits.Thousands,\n [api_internal_contract_js_1.NumberFormatUnits.Millions]: api_external_contract_js_1.NumberFormatUnits.Millions,\n [api_internal_contract_js_1.NumberFormatUnits.BillionsEnglish]: api_external_contract_js_1.NumberFormatUnits.BillionsEnglish,\n [api_internal_contract_js_1.NumberFormatUnits.BillionsStandard]: api_external_contract_js_1.NumberFormatUnits.BillionsStandard,\n});\nInternalToExternalEnumMappings.negativeNumberFormat = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.NegativeNumberFormat.Automatic]: api_external_contract_js_1.NegativeNumberFormat.Automatic,\n [api_internal_contract_js_1.NegativeNumberFormat.Parentheses]: api_external_contract_js_1.NegativeNumberFormat.Parentheses,\n [api_internal_contract_js_1.NegativeNumberFormat.OuterPrefix]: api_external_contract_js_1.NegativeNumberFormat.OuterPrefix,\n [api_internal_contract_js_1.NegativeNumberFormat.OuterSuffix]: api_external_contract_js_1.NegativeNumberFormat.OuterSuffix,\n [api_internal_contract_js_1.NegativeNumberFormat.InnerPrefix]: api_external_contract_js_1.NegativeNumberFormat.InnerPrefix,\n [api_internal_contract_js_1.NegativeNumberFormat.InnerSuffix]: api_external_contract_js_1.NegativeNumberFormat.InnerSuffix,\n});\nInternalToExternalEnumMappings.extensionMode = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.ExtensionMode.Authoring]: api_external_contract_js_1.ExtensionMode.Authoring,\n [api_internal_contract_js_1.ExtensionMode.Viewing]: api_external_contract_js_1.ExtensionMode.Viewing,\n});\nInternalToExternalEnumMappings.exportedMediaType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.ExportedMediaType.Image]: api_external_contract_js_1.ExportedMediaType.Image,\n [api_internal_contract_js_1.ExportedMediaType.Pdf]: api_external_contract_js_1.ExportedMediaType.Pdf,\n [api_internal_contract_js_1.ExportedMediaType.Svg]: api_external_contract_js_1.ExportedMediaType.Svg,\n [api_internal_contract_js_1.ExportedMediaType.Html]: api_external_contract_js_1.ExportedMediaType.Html,\n [api_internal_contract_js_1.ExportedMediaType.PowerPoint]: api_external_contract_js_1.ExportedMediaType.PowerPoint,\n [api_internal_contract_js_1.ExportedMediaType.Excel]: api_external_contract_js_1.ExportedMediaType.Excel,\n});\nInternalToExternalEnumMappings.columnType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.ColumnType.Continuous]: api_external_contract_js_1.ColumnType.Continuous,\n [api_internal_contract_js_1.ColumnType.Discrete]: api_external_contract_js_1.ColumnType.Discrete,\n [api_internal_contract_js_1.ColumnType.Unknown]: api_external_contract_js_1.ColumnType.Unknown,\n});\nInternalToExternalEnumMappings.fieldAggregationType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.FieldAggregationType.Attr]: api_external_contract_js_1.FieldAggregationType.Attr,\n [api_internal_contract_js_1.FieldAggregationType.Avg]: api_external_contract_js_1.FieldAggregationType.Avg,\n [api_internal_contract_js_1.FieldAggregationType.Collect]: api_external_contract_js_1.FieldAggregationType.Collect,\n [api_internal_contract_js_1.FieldAggregationType.Count]: api_external_contract_js_1.FieldAggregationType.Count,\n [api_internal_contract_js_1.FieldAggregationType.Countd]: api_external_contract_js_1.FieldAggregationType.Countd,\n [api_internal_contract_js_1.FieldAggregationType.Day]: api_external_contract_js_1.FieldAggregationType.Day,\n [api_internal_contract_js_1.FieldAggregationType.End]: api_external_contract_js_1.FieldAggregationType.End,\n [api_internal_contract_js_1.FieldAggregationType.Hour]: api_external_contract_js_1.FieldAggregationType.Hour,\n [api_internal_contract_js_1.FieldAggregationType.InOut]: api_external_contract_js_1.FieldAggregationType.InOut,\n [api_internal_contract_js_1.FieldAggregationType.Kurtosis]: api_external_contract_js_1.FieldAggregationType.Kurtosis,\n [api_internal_contract_js_1.FieldAggregationType.Max]: api_external_contract_js_1.FieldAggregationType.Max,\n [api_internal_contract_js_1.FieldAggregationType.Mdy]: api_external_contract_js_1.FieldAggregationType.Mdy,\n [api_internal_contract_js_1.FieldAggregationType.Median]: api_external_contract_js_1.FieldAggregationType.Median,\n [api_internal_contract_js_1.FieldAggregationType.Min]: api_external_contract_js_1.FieldAggregationType.Min,\n [api_internal_contract_js_1.FieldAggregationType.Minute]: api_external_contract_js_1.FieldAggregationType.Minute,\n [api_internal_contract_js_1.FieldAggregationType.MonthYear]: api_external_contract_js_1.FieldAggregationType.MonthYear,\n [api_internal_contract_js_1.FieldAggregationType.None]: api_external_contract_js_1.FieldAggregationType.None,\n [api_internal_contract_js_1.FieldAggregationType.Qtr]: api_external_contract_js_1.FieldAggregationType.Qtr,\n [api_internal_contract_js_1.FieldAggregationType.Quart1]: api_external_contract_js_1.FieldAggregationType.Quart1,\n [api_internal_contract_js_1.FieldAggregationType.Quart3]: api_external_contract_js_1.FieldAggregationType.Quart3,\n [api_internal_contract_js_1.FieldAggregationType.Second]: api_external_contract_js_1.FieldAggregationType.Second,\n [api_internal_contract_js_1.FieldAggregationType.Skewness]: api_external_contract_js_1.FieldAggregationType.Skewness,\n [api_internal_contract_js_1.FieldAggregationType.Stdev]: api_external_contract_js_1.FieldAggregationType.Stdev,\n [api_internal_contract_js_1.FieldAggregationType.Stdevp]: api_external_contract_js_1.FieldAggregationType.Stdevp,\n [api_internal_contract_js_1.FieldAggregationType.Sum]: api_external_contract_js_1.FieldAggregationType.Sum,\n [api_internal_contract_js_1.FieldAggregationType.TruncDay]: api_external_contract_js_1.FieldAggregationType.TruncDay,\n [api_internal_contract_js_1.FieldAggregationType.TruncHour]: api_external_contract_js_1.FieldAggregationType.TruncHour,\n [api_internal_contract_js_1.FieldAggregationType.TruncMinute]: api_external_contract_js_1.FieldAggregationType.TruncMinute,\n [api_internal_contract_js_1.FieldAggregationType.TruncMonth]: api_external_contract_js_1.FieldAggregationType.TruncMonth,\n [api_internal_contract_js_1.FieldAggregationType.TruncQtr]: api_external_contract_js_1.FieldAggregationType.TruncQtr,\n [api_internal_contract_js_1.FieldAggregationType.TruncSecond]: api_external_contract_js_1.FieldAggregationType.TruncSecond,\n [api_internal_contract_js_1.FieldAggregationType.TruncWeek]: api_external_contract_js_1.FieldAggregationType.TruncWeek,\n [api_internal_contract_js_1.FieldAggregationType.TruncYear]: api_external_contract_js_1.FieldAggregationType.TruncYear,\n [api_internal_contract_js_1.FieldAggregationType.User]: api_external_contract_js_1.FieldAggregationType.User,\n [api_internal_contract_js_1.FieldAggregationType.Var]: api_external_contract_js_1.FieldAggregationType.Var,\n [api_internal_contract_js_1.FieldAggregationType.Varp]: api_external_contract_js_1.FieldAggregationType.Varp,\n [api_internal_contract_js_1.FieldAggregationType.Week]: api_external_contract_js_1.FieldAggregationType.Week,\n [api_internal_contract_js_1.FieldAggregationType.Weekday]: api_external_contract_js_1.FieldAggregationType.Weekday,\n [api_internal_contract_js_1.FieldAggregationType.Year]: api_external_contract_js_1.FieldAggregationType.Year,\n});\nInternalToExternalEnumMappings.fieldRoleType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.FieldRoleType.Dimension]: api_external_contract_js_1.FieldRoleType.Dimension,\n [api_internal_contract_js_1.FieldRoleType.Measure]: api_external_contract_js_1.FieldRoleType.Measure,\n [api_internal_contract_js_1.FieldRoleType.Unknown]: api_external_contract_js_1.FieldRoleType.Unknown,\n});\nInternalToExternalEnumMappings.sheetType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.SheetType.Dashboard]: api_external_contract_js_1.SheetType.Dashboard,\n [api_internal_contract_js_1.SheetType.Story]: api_external_contract_js_1.SheetType.Story,\n [api_internal_contract_js_1.SheetType.Worksheet]: api_external_contract_js_1.SheetType.Worksheet,\n});\nInternalToExternalEnumMappings.dashboardObjectType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.DashboardObjectType.Extension]: api_external_contract_js_1.DashboardObjectType.Extension,\n [api_internal_contract_js_1.DashboardObjectType.Blank]: api_external_contract_js_1.DashboardObjectType.Blank,\n [api_internal_contract_js_1.DashboardObjectType.Image]: api_external_contract_js_1.DashboardObjectType.Image,\n [api_internal_contract_js_1.DashboardObjectType.Legend]: api_external_contract_js_1.DashboardObjectType.Legend,\n [api_internal_contract_js_1.DashboardObjectType.PageFilter]: api_external_contract_js_1.DashboardObjectType.PageFilter,\n [api_internal_contract_js_1.DashboardObjectType.ParameterControl]: api_external_contract_js_1.DashboardObjectType.ParameterControl,\n [api_internal_contract_js_1.DashboardObjectType.QuickFilter]: api_external_contract_js_1.DashboardObjectType.QuickFilter,\n [api_internal_contract_js_1.DashboardObjectType.Text]: api_external_contract_js_1.DashboardObjectType.Text,\n [api_internal_contract_js_1.DashboardObjectType.Title]: api_external_contract_js_1.DashboardObjectType.Title,\n [api_internal_contract_js_1.DashboardObjectType.WebPage]: api_external_contract_js_1.DashboardObjectType.WebPage,\n [api_internal_contract_js_1.DashboardObjectType.Worksheet]: api_external_contract_js_1.DashboardObjectType.Worksheet,\n});\nInternalToExternalEnumMappings.dataType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.DataType.Bool]: api_external_contract_js_1.DataType.Bool,\n [api_internal_contract_js_1.DataType.Date]: api_external_contract_js_1.DataType.Date,\n [api_internal_contract_js_1.DataType.DateTime]: api_external_contract_js_1.DataType.DateTime,\n [api_internal_contract_js_1.DataType.Float]: api_external_contract_js_1.DataType.Float,\n [api_internal_contract_js_1.DataType.Int]: api_external_contract_js_1.DataType.Int,\n [api_internal_contract_js_1.DataType.Spatial]: api_external_contract_js_1.DataType.Spatial,\n [api_internal_contract_js_1.DataType.String]: api_external_contract_js_1.DataType.String,\n});\nInternalToExternalEnumMappings.filterUpdateType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.FilterUpdateType.Add]: api_external_contract_js_1.FilterUpdateType.Add,\n [api_internal_contract_js_1.FilterUpdateType.All]: api_external_contract_js_1.FilterUpdateType.All,\n [api_internal_contract_js_1.FilterUpdateType.Remove]: api_external_contract_js_1.FilterUpdateType.Remove,\n [api_internal_contract_js_1.FilterUpdateType.Replace]: api_external_contract_js_1.FilterUpdateType.Replace,\n});\nInternalToExternalEnumMappings.allowableValues = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.DomainRestrictionType.All]: api_external_contract_js_1.ParameterValueType.All,\n [api_internal_contract_js_1.DomainRestrictionType.List]: api_external_contract_js_1.ParameterValueType.List,\n [api_internal_contract_js_1.DomainRestrictionType.Range]: api_external_contract_js_1.ParameterValueType.Range,\n});\nInternalToExternalEnumMappings.dateStepPeriod = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.DateStepPeriod.Years]: api_external_contract_js_1.PeriodType.Years,\n [api_internal_contract_js_1.DateStepPeriod.Quarters]: api_external_contract_js_1.PeriodType.Quarters,\n [api_internal_contract_js_1.DateStepPeriod.Months]: api_external_contract_js_1.PeriodType.Months,\n [api_internal_contract_js_1.DateStepPeriod.Weeks]: api_external_contract_js_1.PeriodType.Weeks,\n [api_internal_contract_js_1.DateStepPeriod.Days]: api_external_contract_js_1.PeriodType.Days,\n [api_internal_contract_js_1.DateStepPeriod.Hours]: api_external_contract_js_1.PeriodType.Hours,\n [api_internal_contract_js_1.DateStepPeriod.Minutes]: api_external_contract_js_1.PeriodType.Minutes,\n [api_internal_contract_js_1.DateStepPeriod.Seconds]: api_external_contract_js_1.PeriodType.Seconds,\n [api_internal_contract_js_1.DateStepPeriod.IsoYears]: api_external_contract_js_1.PeriodType.IsoYears,\n [api_internal_contract_js_1.DateStepPeriod.IsoQuarters]: api_external_contract_js_1.PeriodType.IsoQuarters,\n [api_internal_contract_js_1.DateStepPeriod.IsoWeeks]: api_external_contract_js_1.PeriodType.IsoWeeks,\n});\nInternalToExternalEnumMappings.dateRangeType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.DateRangeType.Current]: api_external_contract_js_1.DateRangeType.Current,\n [api_internal_contract_js_1.DateRangeType.Last]: api_external_contract_js_1.DateRangeType.Last,\n [api_internal_contract_js_1.DateRangeType.LastN]: api_external_contract_js_1.DateRangeType.LastN,\n [api_internal_contract_js_1.DateRangeType.Next]: api_external_contract_js_1.DateRangeType.Next,\n [api_internal_contract_js_1.DateRangeType.NextN]: api_external_contract_js_1.DateRangeType.NextN,\n [api_internal_contract_js_1.DateRangeType.ToDate]: api_external_contract_js_1.DateRangeType.ToDate,\n});\nInternalToExternalEnumMappings.errorCode = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.ErrorCodes.INITIALIZATION_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError,\n [api_internal_contract_js_1.ErrorCodes.INTERNAL_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError,\n [api_internal_contract_js_1.ErrorCodes.MISSING_ENUM_MAPPING]: api_external_contract_js_1.ErrorCodes.InternalError,\n [api_internal_contract_js_1.ErrorCodes.MISSING_PARAMETER]: api_external_contract_js_1.ErrorCodes.InternalError,\n [api_internal_contract_js_1.ErrorCodes.PERMISSION_DENIED]: api_external_contract_js_1.ErrorCodes.InternalError,\n [api_internal_contract_js_1.ErrorCodes.PRES_MODEL_PARSING_ERROR]: api_external_contract_js_1.ErrorCodes.InternalError,\n [api_internal_contract_js_1.ErrorCodes.UNKNOWN_VERB_ID]: api_external_contract_js_1.ErrorCodes.InternalError,\n [api_internal_contract_js_1.ErrorCodes.VERSION_NOT_CONFIGURED]: api_external_contract_js_1.ErrorCodes.APINotInitialized,\n [api_internal_contract_js_1.ErrorCodes.VISIBILITY_ERROR]: api_external_contract_js_1.ErrorCodes.VisibilityError,\n}, api_external_contract_js_1.ErrorCodes.InternalError);\nInternalToExternalEnumMappings.filterType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.FilterType.Categorical]: api_external_contract_js_1.FilterType.Categorical,\n [api_internal_contract_js_1.FilterType.Range]: api_external_contract_js_1.FilterType.Range,\n [api_internal_contract_js_1.FilterType.RelativeDate]: api_external_contract_js_1.FilterType.RelativeDate,\n [api_internal_contract_js_1.FilterType.Hierarchical]: api_external_contract_js_1.FilterType.Hierarchical,\n});\nInternalToExternalEnumMappings.classNameKey = new EnumConverter_1.EnumConverter({\n [\"tableau-dashboard-title\" /* InternalClassNameKey.DashboardTitle */]: api_external_contract_js_1.ClassNameKey.DashboardTitle,\n [\"tableau-story-title\" /* InternalClassNameKey.StoryTitle */]: api_external_contract_js_1.ClassNameKey.StoryTitle,\n [\"tableau-tooltip\" /* InternalClassNameKey.Tooltip */]: api_external_contract_js_1.ClassNameKey.Tooltip,\n [\"tableau-worksheet\" /* InternalClassNameKey.Worksheet */]: api_external_contract_js_1.ClassNameKey.Worksheet,\n [\"tableau-worksheet-title\" /* InternalClassNameKey.WorksheetTitle */]: api_external_contract_js_1.ClassNameKey.WorksheetTitle,\n [\"tableau-pane\" /* InternalClassNameKey.Pane */]: api_external_contract_js_1.ClassNameKey.Pane,\n [\"tableau-row-dividers\" /* InternalClassNameKey.RowDividers */]: api_external_contract_js_1.ClassNameKey.RowDividers,\n [\"tableau-column-dividers\" /* InternalClassNameKey.ColumnDividers */]: api_external_contract_js_1.ClassNameKey.ColumnDividers,\n // Temporary until we fix 1317266 - Platform hasn't been updated currently because near branch is closed\n ['dashboard-title']: api_external_contract_js_1.ClassNameKey.DashboardTitle,\n ['story-title']: api_external_contract_js_1.ClassNameKey.StoryTitle,\n ['tooltip']: api_external_contract_js_1.ClassNameKey.Tooltip,\n ['worksheet']: api_external_contract_js_1.ClassNameKey.Worksheet,\n ['worksheet-title']: api_external_contract_js_1.ClassNameKey.WorksheetTitle,\n ['pane']: api_external_contract_js_1.ClassNameKey.Pane,\n ['row-dividers']: api_external_contract_js_1.ClassNameKey.RowDividers,\n ['column-dividers']: api_external_contract_js_1.ClassNameKey.ColumnDividers,\n});\nInternalToExternalEnumMappings.hierarchicalLevelSelectionState = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.HierarchicalLevelSelectionState.AllSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.AllSelected,\n [api_internal_contract_js_1.HierarchicalLevelSelectionState.NoneSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.NoneSelected,\n [api_internal_contract_js_1.HierarchicalLevelSelectionState.SomeSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.SomeSelected,\n [api_internal_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected]: api_external_contract_js_1.HierarchicalLevelSelectionState.UnknownSelected,\n});\nInternalToExternalEnumMappings.annotationType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.AnnotateEnum.Area]: api_external_contract_js_1.AnnotationType.Area,\n [api_internal_contract_js_1.AnnotateEnum.Mark]: api_external_contract_js_1.AnnotationType.Mark,\n [api_internal_contract_js_1.AnnotateEnum.Point]: api_external_contract_js_1.AnnotationType.Point,\n});\nInternalToExternalEnumMappings.markType = new EnumConverter_1.EnumConverter({\n [api_internal_contract_js_1.MarkType.Area]: api_external_contract_js_1.MarkType.Area,\n [api_internal_contract_js_1.MarkType.Bar]: api_external_contract_js_1.MarkType.Bar,\n [api_internal_contract_js_1.MarkType.Circle]: api_external_contract_js_1.MarkType.Circle,\n [api_internal_contract_js_1.MarkType.GanttBar]: api_external_contract_js_1.MarkType.GanttBar,\n [api_internal_contract_js_1.MarkType.Heatmap]: api_external_contract_js_1.MarkType.Heatmap,\n [api_internal_contract_js_1.MarkType.Line]: api_external_contract_js_1.MarkType.Line,\n [api_internal_contract_js_1.MarkType.Map]: api_external_contract_js_1.MarkType.Map,\n [api_internal_contract_js_1.MarkType.Pie]: api_external_contract_js_1.MarkType.Pie,\n [api_internal_contract_js_1.MarkType.Polygon]: api_external_contract_js_1.MarkType.Polygon,\n [api_internal_contract_js_1.MarkType.Shape]: api_external_contract_js_1.MarkType.Shape,\n [api_internal_contract_js_1.MarkType.Square]: api_external_contract_js_1.MarkType.Square,\n [api_internal_contract_js_1.MarkType.Text]: api_external_contract_js_1.MarkType.Text,\n [api_internal_contract_js_1.MarkType.VizExtension]: api_external_contract_js_1.MarkType.VizExtension,\n});\n/* tslint:enable:typedef */\n//# sourceMappingURL=InternalToExternalEnumMappings.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AskDataAttributes = void 0;\n/**\n * The names of the string constants you can use as HTML attributes for the web component.\n * @ignore\n * @deprecated\n */\nvar AskDataAttributes;\n(function (AskDataAttributes) {\n AskDataAttributes[\"Origin\"] = \"origin\";\n AskDataAttributes[\"ShowEmbed\"] = \"show-embed\";\n AskDataAttributes[\"ShowPin\"] = \"show-pin\";\n AskDataAttributes[\"ShowSave\"] = \"show-save\";\n AskDataAttributes[\"ShowShare\"] = \"show-share\";\n})(AskDataAttributes || (exports.AskDataAttributes = AskDataAttributes = {}));\n//# sourceMappingURL=AskDataInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WebComponentChildElementAttributes = exports.WebComponentChildElements = exports.EmbeddedIframeAttributes = exports.WebComponentAttributes = void 0;\n/**\n * The names of the common string constants you can use as HTML attributes for the tableau web component.\n * @ignore\n */\nvar WebComponentAttributes;\n(function (WebComponentAttributes) {\n WebComponentAttributes[\"Src\"] = \"src\";\n WebComponentAttributes[\"Width\"] = \"width\";\n WebComponentAttributes[\"Height\"] = \"height\";\n WebComponentAttributes[\"Token\"] = \"token\";\n WebComponentAttributes[\"Debug\"] = \"debug\";\n WebComponentAttributes[\"IframeAuth\"] = \"iframe-auth\";\n WebComponentAttributes[\"OnVizLoadError\"] = \"onvizloaderror\";\n WebComponentAttributes[\"ForceTokenSync\"] = \"force-token-sync\";\n})(WebComponentAttributes || (exports.WebComponentAttributes = WebComponentAttributes = {}));\n/**\n * The names of the embedded iframe attributes whose values can be controlled.\n * @ignore\n */\nvar EmbeddedIframeAttributes;\n(function (EmbeddedIframeAttributes) {\n EmbeddedIframeAttributes[\"Loading\"] = \"iframe-attr-loading\";\n EmbeddedIframeAttributes[\"Style\"] = \"iframe-attr-style\";\n EmbeddedIframeAttributes[\"Class\"] = \"iframe-attr-class\";\n})(EmbeddedIframeAttributes || (exports.EmbeddedIframeAttributes = EmbeddedIframeAttributes = {}));\n/**\n * The names of the string constants you can use as child tags for TableauViz, TableauAuthoringViz and TableauAskData custom elements.\n * @ignore\n */\nvar WebComponentChildElements;\n(function (WebComponentChildElements) {\n /**\n * Contains a list of custom parameters. Available in viz viewing, viz authoring and askdata.\n */\n WebComponentChildElements[\"CustomParameter\"] = \"custom-parameter\";\n /**\n * Custom styles applicable to the embedded iframe element itself (not inside it).\n */\n WebComponentChildElements[\"IframeStyle\"] = \"iframe-style\";\n})(WebComponentChildElements || (exports.WebComponentChildElements = WebComponentChildElements = {}));\nvar WebComponentChildElementAttributes;\n(function (WebComponentChildElementAttributes) {\n WebComponentChildElementAttributes[\"Field\"] = \"field\";\n WebComponentChildElementAttributes[\"Value\"] = \"value\";\n WebComponentChildElementAttributes[\"Name\"] = \"name\";\n})(WebComponentChildElementAttributes || (exports.WebComponentChildElementAttributes = WebComponentChildElementAttributes = {}));\n//# sourceMappingURL=WebComponentInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=AnnotationInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ParameterChangedEvent = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst Parameter_1 = require(\"../Models/Parameter\");\nconst ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nconst TableauSheetEvent_1 = require(\"./TableauSheetEvent\");\nclass ParameterChangedEvent extends TableauSheetEvent_1.TableauSheetEvent {\n constructor(_globalFieldName, sheet) {\n super(api_external_contract_js_1.TableauEventType.ParameterChanged, sheet);\n this._globalFieldName = _globalFieldName;\n }\n getParameterAsync() {\n // Call down to our service to get the parameter back via its field name\n const service = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"parameters-service\" /* ServiceNames.Parameters */);\n return service.findParameterByGlobalFieldNameAsync(this._globalFieldName).then((parameterImpl) => {\n if (parameterImpl === undefined) {\n throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.MissingParameter, `Cannot find parameter: ${this._globalFieldName}`);\n }\n return new Parameter_1.Parameter(parameterImpl, this.sheet);\n });\n }\n}\nexports.ParameterChangedEvent = ParameterChangedEvent;\n//# sourceMappingURL=ParameterChangedEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ShortLivedDeferred = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst TableauError_1 = require(\"../TableauError\");\nconst Deferred_1 = require(\"./Deferred\");\n/**\n * A Deferred wrapper class adding functionality to reject unresponsive promises after timeout\n *\n * this class handles two things:\n\n * 1. Adds timeout logic for deferred\n * 2. It blocks multiple calls from executing at the same time.\n *\n * @export\n * @class ShortLivedDeferred\n * @template TResolve The type used to resolve the promise.\n * @template TReject The type used to reject the promise. Defaults to any.\n *\n */\nclass ShortLivedDeferred {\n constructor(_timeoutInMilliseconds = Deferred_1.UnregisterTimeoutInMilliseconds) {\n this._timeoutInMilliseconds = _timeoutInMilliseconds;\n }\n getNewPromiseOrThrowIfBusy() {\n if (this._deferred) {\n throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ApiExecutionError, 'This api cannot be executed till previous call is resolved.');\n }\n this._deferred = new Deferred_1.Deferred();\n this._timeoutId = setTimeout(() => {\n const error = new TableauError_1.TableauError(Contract.SharedErrorCodes.Timeout, `Api failed to complete in ${this._timeoutInMilliseconds / 1000} seconds`);\n this.reject(error);\n }, this._timeoutInMilliseconds);\n return this._deferred.promise;\n }\n resolve(response) {\n if (this._deferred) {\n clearTimeout(this._timeoutId);\n this._deferred.resolve(response);\n this._deferred = undefined;\n }\n }\n reject(error) {\n if (this._deferred) {\n clearTimeout(this._timeoutId);\n this._deferred.reject(error);\n this._deferred = undefined;\n }\n }\n}\nexports.ShortLivedDeferred = ShortLivedDeferred;\n//# sourceMappingURL=ShortLivedDeferred.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SummaryDataChangedEvent = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst TableauWorksheetEvent_1 = require(\"./TableauWorksheetEvent\");\nclass SummaryDataChangedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent {\n constructor(worksheet) {\n super(api_external_contract_js_1.TableauEventType.SummaryDataChanged, worksheet);\n }\n}\nexports.SummaryDataChangedEvent = SummaryDataChangedEvent;\n//# sourceMappingURL=SummaryDataChangedEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ParameterId = void 0;\n// PLEASE KEEP IN ALPHABETICAL ORDER. This helps with visually finding entries, knowing where to put\n// new ones, and merge conflicts.\nvar ParameterId;\n(function (ParameterId) {\n ParameterId[\"ActiveTablesInfo\"] = \"active-tables-info\";\n ParameterId[\"AnchorDate\"] = \"anchor-date\";\n ParameterId[\"AnnotateEnum\"] = \"annotate-enum\";\n ParameterId[\"AnnotationList\"] = \"annotation-list\";\n ParameterId[\"ApplyWorksheetFormatting\"] = \"apply-worksheet-formatting\";\n ParameterId[\"CategoricalDomain\"] = \"categorical-domain\";\n ParameterId[\"ClickThroughEnabled\"] = \"click-through-enabled\";\n ParameterId[\"Columns\"] = \"columns\";\n ParameterId[\"ColumnsToInclude\"] = \"columns-to-include\";\n ParameterId[\"ColumnsToIncludeById\"] = \"columns-to-include-by-id\";\n ParameterId[\"ConnectionDescriptionSummaries\"] = \"connection-description-summaries\";\n ParameterId[\"CurrentSheetType\"] = \"current-sheet-type\";\n ParameterId[\"CustomView\"] = \"custom-view\";\n ParameterId[\"CustomViewIsDefault\"] = \"custom-view-is-default\";\n ParameterId[\"CustomViewIsPublic\"] = \"custom-view-is-public\";\n ParameterId[\"CustomViewLuid\"] = \"custom-view-luid\";\n ParameterId[\"CustomViewName\"] = \"custom-view-name\";\n ParameterId[\"CustomViews\"] = \"custom-views\";\n ParameterId[\"Dashboard\"] = \"dashboard\";\n ParameterId[\"DashboardFilters\"] = \"dashboard-filters\";\n ParameterId[\"DashboardName\"] = \"dashboard\";\n ParameterId[\"DashboardObjectPositionAndSizeUpdate\"] = \"dashboard-object-position-and-size-update\";\n ParameterId[\"DashboardObjectPositionAndSizeUpdateList\"] = \"dashboard-object-position-and-size-update-list\";\n ParameterId[\"DataRowIndex\"] = \"data-row-index\";\n ParameterId[\"DataSchema\"] = \"data-schema\";\n ParameterId[\"DataSource\"] = \"data-source\";\n ParameterId[\"DataSourceDataTable\"] = \"data-source-data-table\";\n ParameterId[\"DataSourceId\"] = \"data-source-id\";\n ParameterId[\"DataSourceName\"] = \"data-source-name\";\n ParameterId[\"DataTable\"] = \"data-table\";\n ParameterId[\"DataTableReader\"] = \"data-table-reader\";\n ParameterId[\"DateRangeType\"] = \"date-range-type\";\n ParameterId[\"DeleteCount\"] = \"delete-count\";\n ParameterId[\"DeltaTimeMs\"] = \"delta-time-ms\";\n ParameterId[\"DimValSelectionModels\"] = \"dimensionValueSelectionModels\";\n ParameterId[\"DomainType\"] = \"domain-type\";\n ParameterId[\"EmbeddingAbstractQuery\"] = \"embedding-abstract-query\";\n ParameterId[\"EmbeddingBootstrapInfo\"] = \"embedding-bootstrap-info\";\n ParameterId[\"EncodingType\"] = \"encoding-type\";\n ParameterId[\"ExportCrosstabSheetMap\"] = \"export-crosstab-sheet-map\";\n ParameterId[\"ExportFile\"] = \"export-file\";\n ParameterId[\"ExportOriginUrl\"] = \"export-origin-url\";\n ParameterId[\"ExportPdfOptions\"] = \"export-pdf-options\";\n ParameterId[\"ExtensionBootstrapInfo\"] = \"extension-bootstrap-info\";\n ParameterId[\"ExtensionContextMenuIds\"] = \"extension-context-menu-ids\";\n ParameterId[\"ExtensionDialogH\"] = \"extension-dialog-height\";\n ParameterId[\"ExtensionDialogMessage\"] = \"extension-dialog-message\";\n ParameterId[\"ExtensionDialogPayload\"] = \"extension-dialog-payload\";\n ParameterId[\"ExtensionDialogResult\"] = \"extension-dialog-result\";\n ParameterId[\"ExtensionDialogStyle\"] = \"extension-dialog-style\";\n ParameterId[\"ExtensionDialogUrl\"] = \"extension-dialog-url\";\n ParameterId[\"ExtensionDialogUrlSource\"] = \"extension-dialog-url-source\";\n ParameterId[\"ExtensionDialogW\"] = \"extension-dialog-width\";\n ParameterId[\"ExtensionLocator\"] = \"extension-locator\";\n ParameterId[\"ExtensionSettingsInfo\"] = \"extension-settings-info\";\n ParameterId[\"ExtensionZoneId\"] = \"extension-zone-id\";\n ParameterId[\"ExtensionMediaBlob\"] = \"extension-media-blob\";\n ParameterId[\"HasExtensionRenderingTimedOut\"] = \"has-extension-rendering-timed-out\";\n ParameterId[\"ExternalMenuDescription\"] = \"external-menu-description\";\n ParameterId[\"ExternalMenuHeader\"] = \"external-menu-header\";\n ParameterId[\"ExternalMenuItemDisplayName\"] = \"external-menu-item-display-name\";\n ParameterId[\"ExternalMenuItemId\"] = \"external-menu-item-id\";\n ParameterId[\"Field\"] = \"field\";\n ParameterId[\"FieldCount\"] = \"field-count\";\n ParameterId[\"FieldId\"] = \"field-id\";\n ParameterId[\"FieldName\"] = \"field-name\";\n ParameterId[\"FilterLevels\"] = \"filter-levels\";\n ParameterId[\"FilterRangeMax\"] = \"filter-range-max\";\n ParameterId[\"FilterRangeMin\"] = \"filter-range-min\";\n ParameterId[\"FilterRangeNullOption\"] = \"filter-range-null-option\";\n ParameterId[\"FilterUpdateType\"] = \"filter-update-type\";\n ParameterId[\"FilterValues\"] = \"filter-values\";\n ParameterId[\"FontNameListItems\"] = \"font-name-list-items\";\n ParameterId[\"FormattedText\"] = \"formatted-text\";\n ParameterId[\"FunctionName\"] = \"function-name\";\n ParameterId[\"FromIndex\"] = \"from-index\";\n ParameterId[\"HierValSelectionModels\"] = \"hierarchicalValueSelectionModels\";\n ParameterId[\"HighlightedData\"] = \"highlighted-data\";\n ParameterId[\"HoverTupleInteraction\"] = \"hover-tuple-interaction\";\n ParameterId[\"IgnoreAliases\"] = \"ignore-aliases\";\n ParameterId[\"IgnoreSelection\"] = \"ignore-selection\";\n ParameterId[\"IncludeAllColumns\"] = \"include-all-columns\";\n ParameterId[\"InvalidAggFieldName\"] = \"invalid-agg-field-name\";\n ParameterId[\"InvalidDates\"] = \"invalid-dates\";\n ParameterId[\"InvalidFieldCaption\"] = \"invalid-field-caption\";\n ParameterId[\"InvalidFields\"] = \"invalid-fields\";\n ParameterId[\"InvalidValues\"] = \"invalid-values\";\n ParameterId[\"IsAnalyticsAssistantAvailable\"] = \"is-analytics-assistant-available\";\n ParameterId[\"IsExcludeMode\"] = \"is-exclude\";\n ParameterId[\"IsExtensionDialog\"] = \"is-extension-dialog\";\n ParameterId[\"IsFromCalcDialog\"] = \"is-from-calc-dialog\";\n ParameterId[\"JoinDescription\"] = \"join-description\";\n ParameterId[\"LogicalTableId\"] = \"logical-table-id\";\n ParameterId[\"LogicalTableInfoList\"] = \"logical-table-info-list\";\n ParameterId[\"MarksCardIndex\"] = \"marks-card-index\";\n ParameterId[\"MaxHeight\"] = \"max-height\";\n ParameterId[\"MaxRows\"] = \"max-rows\";\n ParameterId[\"MaxWidth\"] = \"max-width\";\n ParameterId[\"MinHeight\"] = \"min-height\";\n ParameterId[\"MinWidth\"] = \"min-width\";\n ParameterId[\"PageRowCount\"] = \"page-row-count\";\n ParameterId[\"ParameterCaption\"] = \"paremeter-caption\";\n ParameterId[\"ParameterError\"] = \"parameter-error\";\n ParameterId[\"ParameterFieldName\"] = \"parameter-field-name\";\n ParameterId[\"ParameterInfo\"] = \"parameter-info\";\n ParameterId[\"ParameterInfos\"] = \"parameter-infos\";\n ParameterId[\"ParameterValue\"] = \"parameter-value\";\n ParameterId[\"PeriodType\"] = \"period-type\";\n ParameterId[\"PulseFieldName\"] = \"fieldName\";\n ParameterId[\"PulseFieldNames\"] = \"fieldNames\";\n ParameterId[\"PulseFilterDomainType\"] = \"domainType\";\n ParameterId[\"PulseFilterDomainSearchTerm\"] = \"searchTerm\";\n ParameterId[\"PulsePageSize\"] = \"pageSize\";\n ParameterId[\"PulseNextPageToken\"] = \"nextPageToken\";\n ParameterId[\"PulseFilters\"] = \"filters\";\n ParameterId[\"PulseTimeDimension\"] = \"timeDimension\";\n ParameterId[\"QuantitativeDomain\"] = \"quantitative-dmain\";\n ParameterId[\"QuantRangeSelectionModels\"] = \"quantativeRangeSelectionModels\";\n ParameterId[\"RangeN\"] = \"range-n\";\n ParameterId[\"ReplaySpeed\"] = \"replay-speed\";\n ParameterId[\"SelectedData\"] = \"selected-data\";\n ParameterId[\"SelectedSheetNames\"] = \"selected-sheet-names\";\n ParameterId[\"Selection\"] = \"selection\";\n ParameterId[\"SelectionList\"] = \"selection-list\";\n ParameterId[\"SelectionUpdateType\"] = \"selectionUpdateType\";\n ParameterId[\"SelectTuplesInteraction\"] = \"select-tuples-interaction\";\n ParameterId[\"SendNotifications\"] = \"send-notifications\";\n ParameterId[\"SettingsValues\"] = \"settings-values\";\n ParameterId[\"SharedFilterSheets\"] = \"shared-filter-sheets\";\n ParameterId[\"SharedFiltersInfo\"] = \"shared-filters-info\";\n ParameterId[\"SheetIdentifier\"] = \"sheet-identifier\";\n ParameterId[\"SheetName\"] = \"sheet-name\";\n ParameterId[\"SheetPath\"] = \"sheet-path\";\n ParameterId[\"ShouldRefreshDS\"] = \"should-refresh-ds\";\n ParameterId[\"ShowDataTableFormat\"] = \"show-data-table-format\";\n ParameterId[\"StartIndex\"] = \"start-index\";\n ParameterId[\"State\"] = \"state\";\n ParameterId[\"StoryPointIndex\"] = \"story-point-index\";\n ParameterId[\"StoryPointInfo\"] = \"story-point-info\";\n ParameterId[\"SwitchToSheetName\"] = \"switch-to-sheet-name\";\n ParameterId[\"TargetPoint\"] = \"target-point\";\n ParameterId[\"TestConversionParameter\"] = \"test-conversion-parameter\";\n ParameterId[\"Text\"] = \"formatted-text\";\n ParameterId[\"ToIndex\"] = \"to-index\";\n ParameterId[\"TooltipContext\"] = \"tooltip-context\";\n ParameterId[\"TooltipTextRequest\"] = \"tooltip-text-request\";\n ParameterId[\"TooltipText\"] = \"tooltip-text\";\n ParameterId[\"UnderlyingDataTable\"] = \"underlying-data-table\";\n ParameterId[\"UnderlyingSummaryDataTable\"] = \"underlying-summary-data-table\";\n ParameterId[\"Url\"] = \"url\";\n ParameterId[\"UseTabDelimiters\"] = \"use-tab-delimiters\";\n ParameterId[\"ViewDataTableCacheId\"] = \"view-data-table-cache-id\";\n ParameterId[\"ViewDataTableId\"] = \"view-data-table-id\";\n ParameterId[\"VisualId\"] = \"visual-id\";\n ParameterId[\"VisualSpecification\"] = \"visual-specification\";\n ParameterId[\"VizAPIInputJson\"] = \"vizapi-input-json\";\n ParameterId[\"VizAPIStateWithDataModel\"] = \"vizapi-state-with-data-model\";\n ParameterId[\"VizAPIStateWarningMsg\"] = \"vizapi-state-warning-msg\";\n ParameterId[\"VizAPISVG\"] = \"vizapi-svg\";\n ParameterId[\"WorksheetName\"] = \"worksheet-name\";\n ParameterId[\"WorksheetFilters\"] = \"worksheet-filters\";\n ParameterId[\"ZoneIdsVisibilityMap\"] = \"zone-ids-visibility-map\";\n})(ParameterId || (exports.ParameterId = ParameterId = {}));\n//# sourceMappingURL=Parameters.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=DataTableInterfaces.js.map","\"use strict\";\n// Export everything which had been previously in the api-shared module\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VersionedExternalApiDispatcher = exports.VersionNumber = exports.SheetUtils = exports.ExportHelpers = exports.ErrorHelpers = exports.Deferred = exports.TableauError = exports.StoryActivationServiceImpl = exports.SizeServiceImpl = exports.ServiceImplBase = exports.Registration = exports.NotificationServiceImplBase = exports.NotificationServiceImpl = exports.ClientInfoServiceImpl = exports.Point = exports.WorksheetImpl = exports.WorkbookImpl = exports.StoryPointInfoImpl = exports.StoryPointImpl = exports.StoryImpl = exports.SingleEventManagerImpl = exports.SheetInfoImpl = exports.SheetImpl = exports.ParameterImpl = exports.DataSourceImpl = exports.DashboardObjectImpl = exports.DashboardImpl = exports.CustomViewImpl = exports.Field = exports.EventListenerManager = exports.InternalToExternalEnumMappings = exports.ExternalToInternalEnumMappings = exports.DataSource = exports.CrossFrameDispatcher = exports.ApiVersion = void 0;\nvar ApiVersion_1 = require(\"./ApiShared/ApiVersion\");\nObject.defineProperty(exports, \"ApiVersion\", { enumerable: true, get: function () { return ApiVersion_1.ApiVersion; } });\n__exportStar(require(\"./ApiShared/CrossFrame/CrossFrameBootstrap\"), exports);\nvar CrossFrameDispatcher_1 = require(\"./ApiShared/CrossFrame/CrossFrameDispatcher\");\nObject.defineProperty(exports, \"CrossFrameDispatcher\", { enumerable: true, get: function () { return CrossFrameDispatcher_1.CrossFrameDispatcher; } });\nvar DataSource_1 = require(\"./ApiShared/DataSource\");\nObject.defineProperty(exports, \"DataSource\", { enumerable: true, get: function () { return DataSource_1.DataSource; } });\nvar ExternalToInternalEnumMappings_1 = require(\"./ApiShared/EnumMappings/ExternalToInternalEnumMappings\");\nObject.defineProperty(exports, \"ExternalToInternalEnumMappings\", { enumerable: true, get: function () { return ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings; } });\nvar InternalToExternalEnumMappings_1 = require(\"./ApiShared/EnumMappings/InternalToExternalEnumMappings\");\nObject.defineProperty(exports, \"InternalToExternalEnumMappings\", { enumerable: true, get: function () { return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings; } });\nvar EventListenerManager_1 = require(\"./ApiShared/EventListenerManager\");\nObject.defineProperty(exports, \"EventListenerManager\", { enumerable: true, get: function () { return EventListenerManager_1.EventListenerManager; } });\nvar Field_1 = require(\"./ApiShared/Field\");\nObject.defineProperty(exports, \"Field\", { enumerable: true, get: function () { return Field_1.Field; } });\nvar CustomViewImpl_1 = require(\"./ApiShared/Impl/CustomViewImpl\");\nObject.defineProperty(exports, \"CustomViewImpl\", { enumerable: true, get: function () { return CustomViewImpl_1.CustomViewImpl; } });\nvar DashboardImpl_1 = require(\"./ApiShared/Impl/DashboardImpl\");\nObject.defineProperty(exports, \"DashboardImpl\", { enumerable: true, get: function () { return DashboardImpl_1.DashboardImpl; } });\nvar DashboardObjectImpl_1 = require(\"./ApiShared/Impl/DashboardObjectImpl\");\nObject.defineProperty(exports, \"DashboardObjectImpl\", { enumerable: true, get: function () { return DashboardObjectImpl_1.DashboardObjectImpl; } });\nvar DataSourceImpl_1 = require(\"./ApiShared/Impl/DataSourceImpl\");\nObject.defineProperty(exports, \"DataSourceImpl\", { enumerable: true, get: function () { return DataSourceImpl_1.DataSourceImpl; } });\nvar ParameterImpl_1 = require(\"./ApiShared/Impl/ParameterImpl\");\nObject.defineProperty(exports, \"ParameterImpl\", { enumerable: true, get: function () { return ParameterImpl_1.ParameterImpl; } });\nvar SheetImpl_1 = require(\"./ApiShared/Impl/SheetImpl\");\nObject.defineProperty(exports, \"SheetImpl\", { enumerable: true, get: function () { return SheetImpl_1.SheetImpl; } });\nvar SheetInfoImpl_1 = require(\"./ApiShared/Impl/SheetInfoImpl\");\nObject.defineProperty(exports, \"SheetInfoImpl\", { enumerable: true, get: function () { return SheetInfoImpl_1.SheetInfoImpl; } });\nvar SingleEventManagerImpl_1 = require(\"./ApiShared/Impl/SingleEventManagerImpl\");\nObject.defineProperty(exports, \"SingleEventManagerImpl\", { enumerable: true, get: function () { return SingleEventManagerImpl_1.SingleEventManagerImpl; } });\nvar StoryImpl_1 = require(\"./ApiShared/Impl/StoryImpl\");\nObject.defineProperty(exports, \"StoryImpl\", { enumerable: true, get: function () { return StoryImpl_1.StoryImpl; } });\nvar StoryPointImpl_1 = require(\"./ApiShared/Impl/StoryPointImpl\");\nObject.defineProperty(exports, \"StoryPointImpl\", { enumerable: true, get: function () { return StoryPointImpl_1.StoryPointImpl; } });\nvar StoryPointInfoImpl_1 = require(\"./ApiShared/Impl/StoryPointInfoImpl\");\nObject.defineProperty(exports, \"StoryPointInfoImpl\", { enumerable: true, get: function () { return StoryPointInfoImpl_1.StoryPointInfoImpl; } });\nvar WorkbookImpl_1 = require(\"./ApiShared/Impl/WorkbookImpl\");\nObject.defineProperty(exports, \"WorkbookImpl\", { enumerable: true, get: function () { return WorkbookImpl_1.WorkbookImpl; } });\nvar WorksheetImpl_1 = require(\"./ApiShared/Impl/WorksheetImpl\");\nObject.defineProperty(exports, \"WorksheetImpl\", { enumerable: true, get: function () { return WorksheetImpl_1.WorksheetImpl; } });\nvar Point_1 = require(\"./ApiShared/Point\");\nObject.defineProperty(exports, \"Point\", { enumerable: true, get: function () { return Point_1.Point; } });\n__exportStar(require(\"./ApiShared/Services/RegisterAllSharedServices\"), exports);\n__exportStar(require(\"./ApiShared/Services/ServiceRegistry\"), exports);\nvar ClientInfoServiceImpl_1 = require(\"./ApiShared/Services/impl/ClientInfoServiceImpl\");\nObject.defineProperty(exports, \"ClientInfoServiceImpl\", { enumerable: true, get: function () { return ClientInfoServiceImpl_1.ClientInfoServiceImpl; } });\nvar NotificationServiceImpl_1 = require(\"./ApiShared/Services/impl/NotificationServiceImpl\");\nObject.defineProperty(exports, \"NotificationServiceImpl\", { enumerable: true, get: function () { return NotificationServiceImpl_1.NotificationServiceImpl; } });\nvar NotificationServiceImplBase_1 = require(\"./ApiShared/Services/impl/NotificationServiceImplBase\");\nObject.defineProperty(exports, \"NotificationServiceImplBase\", { enumerable: true, get: function () { return NotificationServiceImplBase_1.NotificationServiceImplBase; } });\nObject.defineProperty(exports, \"Registration\", { enumerable: true, get: function () { return NotificationServiceImplBase_1.Registration; } });\nvar ServiceImplBase_1 = require(\"./ApiShared/Services/impl/ServiceImplBase\");\nObject.defineProperty(exports, \"ServiceImplBase\", { enumerable: true, get: function () { return ServiceImplBase_1.ServiceImplBase; } });\nvar SizeServiceImpl_1 = require(\"./ApiShared/Services/impl/SizeServiceImpl\");\nObject.defineProperty(exports, \"SizeServiceImpl\", { enumerable: true, get: function () { return SizeServiceImpl_1.SizeServiceImpl; } });\nvar StoryActivationServiceImpl_1 = require(\"./ApiShared/Services/impl/StoryActivationServiceImpl\");\nObject.defineProperty(exports, \"StoryActivationServiceImpl\", { enumerable: true, get: function () { return StoryActivationServiceImpl_1.StoryActivationServiceImpl; } });\nvar TableauError_1 = require(\"./ApiShared/TableauError\");\nObject.defineProperty(exports, \"TableauError\", { enumerable: true, get: function () { return TableauError_1.TableauError; } });\nvar Deferred_1 = require(\"./ApiShared/Utils/Deferred\");\nObject.defineProperty(exports, \"Deferred\", { enumerable: true, get: function () { return Deferred_1.Deferred; } });\nvar ErrorHelpers_1 = require(\"./ApiShared/Utils/ErrorHelpers\");\nObject.defineProperty(exports, \"ErrorHelpers\", { enumerable: true, get: function () { return ErrorHelpers_1.ErrorHelpers; } });\nvar ExportHelpers_1 = require(\"./ApiShared/Utils/ExportHelpers\");\nObject.defineProperty(exports, \"ExportHelpers\", { enumerable: true, get: function () { return ExportHelpers_1.ExportHelpers; } });\nvar SheetUtils_1 = require(\"./ApiShared/Utils/SheetUtils\");\nObject.defineProperty(exports, \"SheetUtils\", { enumerable: true, get: function () { return SheetUtils_1.SheetUtils; } });\nvar VersionNumber_1 = require(\"./ApiShared/VersionNumber\");\nObject.defineProperty(exports, \"VersionNumber\", { enumerable: true, get: function () { return VersionNumber_1.VersionNumber; } });\nvar VersionedExternalApiDispatcher_1 = require(\"./VersionedExternalApiDispatcher\");\nObject.defineProperty(exports, \"VersionedExternalApiDispatcher\", { enumerable: true, get: function () { return VersionedExternalApiDispatcher_1.VersionedExternalApiDispatcher; } });\n//# sourceMappingURL=ApiShared.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=VersionNumber.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ZoneServiceImpl = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nconst ErrorHelpers_1 = require(\"../../Utils/ErrorHelpers\");\nconst Param_1 = require(\"../../Utils/Param\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass ZoneServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"zone-service\" /* ServiceNames.Zone */;\n }\n setVisibilityAsync(dashboard, dashboardZoneMap, zoneVisibilityMap) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'setVisibilityAsync',\n [api_internal_contract_js_1.ParameterId.Dashboard]: dashboard,\n [api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap]: {},\n };\n // zoneVisibilityMap can be either an object or a Map - convert it to a Map\n const parameterAsMap = Param_1.Param.convertParameterToMap(zoneVisibilityMap, 'zoneVisibilityMap');\n parameterAsMap.forEach((value, key) => {\n ErrorHelpers_1.ErrorHelpers.verifyZoneIsValid(dashboardZoneMap, Number.parseInt(key, 10));\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(value, api_external_contract_js_1.DashboardObjectVisibilityType, 'DashboardObjectVisibilityType');\n parameters[api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap][key] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.setVisibilityType.convert(value);\n });\n return this.execute(api_internal_contract_js_1.VerbId.SetZoneVisibility, parameters).then((response) => {\n return;\n });\n }\n moveAndResizeAsync(dashboard, dashboardZoneMap, dashboardObjectPositionAndSizeUpdateArray) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.Dashboard]: dashboard,\n [api_internal_contract_js_1.ParameterId.DashboardObjectPositionAndSizeUpdateList]: dashboardObjectPositionAndSizeUpdateArray,\n };\n dashboardObjectPositionAndSizeUpdateArray.forEach((dashboardObject) => {\n ErrorHelpers_1.ErrorHelpers.verifyZoneIsValidAndFloating(dashboardZoneMap, dashboardObject.dashboardObjectID);\n ErrorHelpers_1.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(dashboardObject);\n });\n return this.execute(api_internal_contract_js_1.VerbId.MoveAndResizeZones, parameters).then((response) => {\n return;\n });\n }\n}\nexports.ZoneServiceImpl = ZoneServiceImpl;\n//# sourceMappingURL=ZoneServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StoryPointImpl = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst TableauError_1 = require(\"../TableauError\");\nconst SheetUtils_1 = require(\"../Utils/SheetUtils\");\nconst DashboardImpl_1 = require(\"./DashboardImpl\");\nconst SheetInfoImpl_1 = require(\"./SheetInfoImpl\");\nconst WorksheetImpl_1 = require(\"./WorksheetImpl\");\nclass StoryPointImpl {\n constructor(_storyPointInfoImpl, sheetInfos, registryId, containedSheetInfo) {\n this._storyPointInfoImpl = _storyPointInfoImpl;\n if (containedSheetInfo) {\n this._containedSheetImpl = this.createContainedSheet(containedSheetInfo, sheetInfos, registryId);\n }\n }\n get index() {\n return this._storyPointInfoImpl.index;\n }\n get caption() {\n return this._storyPointInfoImpl.caption;\n }\n get active() {\n return this._storyPointInfoImpl.active;\n }\n get updated() {\n return this._storyPointInfoImpl.updated;\n }\n set updated(updated) {\n this._storyPointInfoImpl.updated = updated;\n }\n get parentStory() {\n return this._storyPointInfoImpl.parentStory;\n }\n get containedSheet() {\n return this._containedSheetImpl;\n }\n get storyPointId() {\n return this._storyPointInfoImpl.storyPointId;\n }\n createContainedSheet(containedSheetInfo, sheetInfos, registryId) {\n const containedSheetIdx = -1;\n const publishedSheetInfo = SheetUtils_1.SheetUtils.getPublishedSheetInfoByName(containedSheetInfo.name, sheetInfos);\n const containedSheetSize = SheetUtils_1.SheetUtils.createAutomaticSize();\n const isContainedSheetHidden = publishedSheetInfo === undefined;\n const containedSheetUrl = publishedSheetInfo ? publishedSheetInfo.url : '';\n // Contained sheets aren't active - the containing sheet is active.\n const containedSheetActive = false;\n const containedSheetInfoImpl = new SheetInfoImpl_1.SheetInfoImpl(containedSheetInfo.name, SheetUtils_1.SheetUtils.getSheetTypeEnum(containedSheetInfo.sheetType), containedSheetSize, containedSheetIdx, containedSheetActive, isContainedSheetHidden, containedSheetUrl);\n let sheetImpl;\n switch (containedSheetInfoImpl.sheetType) {\n case Contract.SheetType.Worksheet: {\n const vizId = {\n worksheet: containedSheetInfoImpl.name,\n };\n sheetImpl = new WorksheetImpl_1.WorksheetImpl(containedSheetInfoImpl, registryId, vizId, null, this);\n break;\n }\n case Contract.SheetType.Dashboard: {\n const sheetPath = {\n sheetName: containedSheetInfoImpl.name,\n isDashboard: true,\n };\n sheetImpl = new DashboardImpl_1.DashboardImpl(containedSheetInfoImpl, containedSheetInfo.dashboardZones, sheetPath, registryId, this);\n break;\n }\n default: {\n throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ServerError, 'Invalid SheetType');\n }\n }\n return sheetImpl;\n }\n}\nexports.StoryPointImpl = StoryPointImpl;\n//# sourceMappingURL=StoryPointImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.PulseOptionNames = void 0;\nvar PulseOptionNames;\n(function (PulseOptionNames) {\n PulseOptionNames[\"embed\"] = \"embed\";\n PulseOptionNames[\"token\"] = \"token\";\n PulseOptionNames[\"disableExploreFilter\"] = \"disableExploreFilter\";\n PulseOptionNames[\"layout\"] = \"embed_layout\";\n PulseOptionNames[\"theme\"] = \"embed_theme\";\n PulseOptionNames[\"ApiExternalVersion\"] = \":apiExternalVersion\";\n PulseOptionNames[\"ApiInternalVersion\"] = \":apiInternalVersion\";\n PulseOptionNames[\"EmbedCount\"] = \":embcount\";\n PulseOptionNames[\"PulseWebComponent\"] = \":pulseWebComponent\";\n})(PulseOptionNames || (exports.PulseOptionNames = PulseOptionNames = {}));\n//# sourceMappingURL=PulseInterface.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WorksheetFormattingChangedEvent = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst TableauWorksheetEvent_1 = require(\"./TableauWorksheetEvent\");\nclass WorksheetFormattingChangedEvent extends TableauWorksheetEvent_1.TableauWorksheetEvent {\n constructor(worksheet, _formatting) {\n super(Contract.TableauEventType.WorksheetFormattingChanged, worksheet);\n this._formatting = _formatting;\n }\n get formatting() {\n return this._formatting;\n }\n}\nexports.WorksheetFormattingChangedEvent = WorksheetFormattingChangedEvent;\n//# sourceMappingURL=WorksheetFormattingChangedEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.registerAllExtensionsServices = registerAllExtensionsServices;\nexports.registerInitializationExtensionsServices = registerInitializationExtensionsServices;\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst InitializationServiceImpl_1 = require(\"./Impl/InitializationServiceImpl\");\nconst SettingsServiceImpl_1 = require(\"./Impl/SettingsServiceImpl\");\nconst UIServiceImpl_1 = require(\"./Impl/UIServiceImpl\");\nconst ServiceRegistryUtil_1 = require(\"./ServiceRegistryUtil\");\nfunction registerAllExtensionsServices(dispatcher) {\n api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new SettingsServiceImpl_1.SettingsServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId));\n api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new UIServiceImpl_1.UIServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId));\n}\nfunction registerInitializationExtensionsServices(dispatcher) {\n api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new InitializationServiceImpl_1.InitializationServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId));\n}\n//# sourceMappingURL=RegisterAllExtensionsServices.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ParametersServiceImpl = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ParameterImpl_1 = require(\"../../Impl/ParameterImpl\");\nconst TableauError_1 = require(\"../../TableauError\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass ParametersServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"parameters-service\" /* ServiceNames.Parameters */;\n }\n getParametersForSheetAsync(sheetPath) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getParametersForSheetAsync',\n [api_internal_contract_js_1.ParameterId.SheetPath]: sheetPath,\n };\n return this.getParametersAsync(parameters);\n }\n getAllParametersAsync() {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getParametersForSheetAsync',\n };\n return this.getParametersAsync(parameters);\n }\n getParametersAsync(inputParameters) {\n return this.execute(api_internal_contract_js_1.VerbId.GetParametersForSheet, inputParameters).then((response) => {\n const result = response.result;\n return result.map((parameterInfo) => {\n return new ParameterImpl_1.ParameterImpl(parameterInfo, this._registryId);\n });\n });\n }\n changeParameterValueAsync(fieldName, newValue) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'changeParameterValueAsync',\n [api_internal_contract_js_1.ParameterId.ParameterFieldName]: fieldName,\n [api_internal_contract_js_1.ParameterId.ParameterValue]: newValue,\n };\n return this.execute(api_internal_contract_js_1.VerbId.ChangeParameterValue, parameters).then((response) => {\n const result = response.result;\n return result;\n });\n }\n findParameterByNameAsync(name) {\n return this.findParameterAsync(name, undefined);\n }\n findParameterByGlobalFieldNameAsync(fieldName) {\n return this.findParameterAsync(undefined, fieldName);\n }\n findParameterAsync(name, fieldName) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'findParameterAsync',\n };\n if (name !== undefined) {\n parameters[api_internal_contract_js_1.ParameterId.ParameterCaption] = name;\n }\n else if (fieldName !== undefined) {\n parameters[api_internal_contract_js_1.ParameterId.ParameterFieldName] = fieldName;\n }\n else {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'name or fieldName must be provided to find parameter');\n }\n return this.execute(api_internal_contract_js_1.VerbId.FindParameter, parameters).then((response) => {\n const instanceOfParameterInfo = (object) => {\n return 'fieldName' in object;\n };\n // We need to check to see if we got a valid response back again\n if (instanceOfParameterInfo(response.result)) {\n const result = response.result;\n return new ParameterImpl_1.ParameterImpl(result, this._registryId);\n }\n else {\n return undefined;\n }\n });\n }\n}\nexports.ParametersServiceImpl = ParametersServiceImpl;\n//# sourceMappingURL=ParametersServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=VisualModelInterface.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FieldImpl = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst InternalContract = require(\"@tableau/api-internal-contract-js\");\nconst InternalToExternalEnumMappings_1 = require(\"../EnumMappings/InternalToExternalEnumMappings\");\nclass FieldImpl {\n constructor(_fieldInfo, _parentDataSource) {\n this._fieldInfo = _fieldInfo;\n this._parentDataSource = _parentDataSource;\n }\n get name() {\n return this._fieldInfo.name;\n }\n get id() {\n return this._fieldInfo.id;\n }\n get description() {\n return this._fieldInfo.description;\n }\n get dataType() {\n var _a;\n return (_a = this._fieldInfo.dataType) !== null && _a !== void 0 ? _a : Contract.DataType.Unknown;\n }\n get aggregation() {\n return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation);\n }\n get dataSource() {\n if (!this._parentDataSource)\n throw new Error(`Data source information is not available for this field. Please use getFieldAsync method to get field's data source information`);\n return this._parentDataSource;\n }\n get role() {\n return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldRoleType.convert(this._fieldInfo.role);\n }\n get columnType() {\n let definedValue = this._fieldInfo.columnType || InternalContract.ColumnType.Unknown;\n return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.columnType.convert(definedValue);\n }\n get isCalculatedField() {\n return this._fieldInfo.isCalculatedField;\n }\n get isCombinedField() {\n return this._fieldInfo.isCombinedField;\n }\n get isGenerated() {\n return this._fieldInfo.isGenerated;\n }\n get isGeospatial() {\n return this._fieldInfo.isGeospatial;\n }\n get isHidden() {\n return this._fieldInfo.isHidden;\n }\n get isPresentOnPublishedDatasource() {\n return this._fieldInfo.isPresentOnPublishedDatasource;\n }\n get semanticRole() {\n return this._fieldInfo.semanticRole;\n }\n get dataFormat() {\n return this._fieldInfo.dataFormat;\n }\n}\nexports.FieldImpl = FieldImpl;\n//# sourceMappingURL=FieldImpl.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FilterServiceImpl = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst InternalContract = require(\"@tableau/api-internal-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ApiShared_1 = require(\"../../../ApiShared\");\nconst ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nconst InternalToExternalEnumMappings_1 = require(\"../../EnumMappings/InternalToExternalEnumMappings\");\nconst FilterModels_1 = require(\"../../Models/FilterModels\");\nconst DataValueFactory_1 = require(\"../../Utils/DataValueFactory\");\nconst Param_1 = require(\"../../Utils/Param\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass FilterServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"filter-service\" /* ServiceNames.Filter */;\n }\n applyFilterAsync(visualId, fieldName, values, updateType, filterOptions) {\n const verb = api_internal_contract_js_1.VerbId.ApplyCategoricalFilter;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyFilterAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName;\n if (!Array.isArray(values)) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.ErrorCodes.InvalidParameter, 'values parameter for applyFilterAsync must be an array');\n }\n parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values;\n parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType);\n parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] =\n filterOptions === undefined || filterOptions.isExcludeMode === undefined ? false : filterOptions.isExcludeMode;\n return this.execute(verb, parameters).then((response) => {\n return fieldName;\n });\n }\n applyRangeFilterAsync(visualId, fieldName, filterOptions) {\n const verb = api_internal_contract_js_1.VerbId.ApplyRangeFilter;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyRangeFilterAsync',\n };\n if (filterOptions.min !== undefined && filterOptions.min !== null) {\n let min;\n if (filterOptions.min instanceof Date) {\n min = Param_1.Param.serializeDateForPlatform(filterOptions.min);\n }\n else {\n min = filterOptions.min;\n }\n parameters[api_internal_contract_js_1.ParameterId.FilterRangeMin] = min;\n }\n if (filterOptions.max !== undefined && filterOptions.max !== null) {\n let max;\n if (filterOptions.max instanceof Date) {\n max = Param_1.Param.serializeDateForPlatform(filterOptions.max);\n }\n else {\n max = filterOptions.max;\n }\n parameters[api_internal_contract_js_1.ParameterId.FilterRangeMax] = max;\n }\n // The null option is used with min+max for 'include-range' or 'include-range-or-null'\n if (filterOptions.nullOption) {\n parameters[api_internal_contract_js_1.ParameterId.FilterRangeNullOption] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.nullOptions.convert(filterOptions.nullOption);\n }\n parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName;\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n return this.execute(verb, parameters).then((response) => {\n this.apiFilterHandlerCheckForCommandError(response.result);\n return fieldName;\n });\n }\n applyHierarchicalFilterAsync(visualId, fieldName, values, updateType, filterOptions) {\n const verb = api_internal_contract_js_1.VerbId.HierarchicalFilter;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyHierarchicalFilterAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName;\n const hierarchicalLevels = values.levels;\n if (Array.isArray(hierarchicalLevels) && hierarchicalLevels.length > 0) {\n parameters[api_internal_contract_js_1.ParameterId.FilterLevels] = hierarchicalLevels;\n }\n else if (values.length > 0) {\n parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values;\n }\n else {\n // the server command expects empty list for clearing the filter\n // it also expects eithers FilterLevels or FilterValues to be set\n parameters[api_internal_contract_js_1.ParameterId.FilterLevels] = [];\n }\n parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType);\n parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = filterOptions && !!filterOptions.isExcludeMode;\n return this.execute(verb, parameters).then((response) => {\n return fieldName;\n });\n }\n clearFilterAsync(visualId, fieldName) {\n const verb = api_internal_contract_js_1.VerbId.ClearFilter;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'clearFilterAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName;\n return this.execute(verb, parameters).then((resposne) => {\n return fieldName;\n });\n }\n applyRelativeDateFilterAsync(visualId, fieldName, options) {\n const verb = api_internal_contract_js_1.VerbId.ApplyRelativeDateFilter;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyRelativeDateFilterAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName;\n parameters[api_internal_contract_js_1.ParameterId.PeriodType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.periodType.convert(options.periodType);\n parameters[api_internal_contract_js_1.ParameterId.DateRangeType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.dateRangeType.convert(options.rangeType);\n if (options.rangeType === api_external_contract_js_1.DateRangeType.LastN || options.rangeType === api_external_contract_js_1.DateRangeType.NextN) {\n if (options.rangeN === undefined || options.rangeN === null) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.EmbeddingErrorCodes.MissingRangeNForRelativeDateFilters, 'Missing rangeN field for a relative date filter of LASTN or NEXTN.');\n }\n parameters[api_internal_contract_js_1.ParameterId.RangeN] = options.rangeN;\n }\n if (options.anchorDate !== undefined && options.anchorDate !== null) {\n parameters[api_internal_contract_js_1.ParameterId.AnchorDate] = this.convertAnchorDate(options.anchorDate);\n }\n return this.execute(verb, parameters).then((response) => {\n return response.result;\n });\n }\n getFiltersAsync(visualId) {\n const verb = api_internal_contract_js_1.VerbId.GetFilters;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getFiltersAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId;\n return this.execute(verb, parameters).then((response) => {\n const filters = response.result;\n return this.convertDomainFilters(filters);\n });\n }\n getCategoricalDomainAsync(worksheetName, fieldId, domainType) {\n const verb = api_internal_contract_js_1.VerbId.GetCategoricalDomain;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCategoricalDomainAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = {\n worksheet: worksheetName,\n };\n parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId;\n parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType);\n return this.execute(verb, parameters).then((response) => {\n const domain = response.result;\n return this.convertCategoricalDomain(domain, domainType);\n });\n }\n getRangeDomainAsync(worksheetName, fieldId, domainType) {\n const verb = api_internal_contract_js_1.VerbId.GetRangeDomain;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getRangeDomainAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = {\n worksheet: worksheetName,\n };\n parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId;\n parameters[api_internal_contract_js_1.ParameterId.DomainType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterDomainType.convert(domainType);\n return this.execute(verb, parameters).then((response) => {\n const domain = response.result;\n return this.convertRangeDomain(domain, domainType);\n });\n }\n getDashboardFiltersAsync() {\n const verb = api_internal_contract_js_1.VerbId.GetDashboardFilters;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDashboardFiltersAsync',\n };\n return this.execute(verb, parameters).then((response) => {\n const filters = response.result;\n return this.convertDomainFilters(filters);\n });\n }\n applyDashboardFilterAsync(fieldName, values, updateType, filterOptions) {\n const verb = api_internal_contract_js_1.VerbId.DashboardCategoricalFilter;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyDashboardFilterAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.FieldName] = fieldName;\n parameters[api_internal_contract_js_1.ParameterId.FilterValues] = values;\n parameters[api_internal_contract_js_1.ParameterId.FilterUpdateType] = ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.filterUpdateType.convert(updateType);\n parameters[api_internal_contract_js_1.ParameterId.IsExcludeMode] = filterOptions && !!filterOptions.isExcludeMode;\n return this.execute(verb, parameters).then((response) => {\n return response.result;\n });\n }\n getAppliedWorksheetsAsync(worksheetName, fieldId) {\n return __awaiter(this, void 0, void 0, function* () {\n var _a;\n const sharedFilterModel = yield this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsync');\n const worksheetNames = [];\n (_a = sharedFilterModel.worksheets) === null || _a === void 0 ? void 0 : _a.map((worksheetInfo) => {\n if (worksheetInfo.isSelected) {\n worksheetNames.push(worksheetInfo.worksheetName);\n }\n });\n return worksheetNames;\n });\n }\n setAppliedWorksheetsAsync(worksheetName, fieldName, fieldId, applyToWorksheets) {\n return __awaiter(this, void 0, void 0, function* () {\n const sharedFilterModel = yield this.executeGetAppliedWorksheets(worksheetName, fieldId, 'getAppliedWorksheetsAsyncInternal');\n if (!sharedFilterModel || !sharedFilterModel.worksheets) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'This filter does not apply to multiple worksheets');\n }\n const allowedWorksheets = [];\n let activeWorksheet = '';\n sharedFilterModel.worksheets.forEach((worksheet) => {\n // Get active worksheet\n if (worksheet.isActive) {\n activeWorksheet = worksheet.worksheetName;\n }\n // Populate allowed worksheets\n if (worksheet.isSelected || worksheet.isEnabled) {\n allowedWorksheets.push(worksheet.worksheetName);\n }\n });\n if (activeWorksheet === '') {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'No active worksheet');\n }\n if (!applyToWorksheets.includes(activeWorksheet)) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `${activeWorksheet} must be included in the applied worksheets`);\n }\n applyToWorksheets.forEach((sheet) => {\n // check if it's present within compatible sheets\n if (!allowedWorksheets.includes(sheet)) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, `The field ${fieldName} isn't applicable to the worksheet ${sheet}`);\n }\n });\n const verb = api_internal_contract_js_1.VerbId.ChangeSharedFilter;\n const parameters = {};\n parameters[api_internal_contract_js_1.ParameterId.FunctionName] = 'setAppliedWorksheetsAsync';\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = {\n worksheet: worksheetName,\n };\n parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId;\n parameters[api_internal_contract_js_1.ParameterId.SharedFilterSheets] = applyToWorksheets;\n return this.execute(verb, parameters).then((response) => {\n return applyToWorksheets;\n });\n });\n }\n // Helper Methods\n executeGetAppliedWorksheets(worksheetName, fieldId, telemetryFunctionName) {\n const verb = api_internal_contract_js_1.VerbId.GetSharedFilter;\n const parameters = {};\n parameters[api_internal_contract_js_1.ParameterId.FunctionName] = telemetryFunctionName;\n parameters[api_internal_contract_js_1.ParameterId.VisualId] = {\n worksheet: worksheetName,\n };\n parameters[api_internal_contract_js_1.ParameterId.FieldId] = fieldId;\n return this.execute(verb, parameters).then((response) => {\n const sharedFilterModel = response.result;\n return sharedFilterModel;\n });\n }\n convertDomainFilters(domainFilters) {\n const filters = [];\n domainFilters.forEach((domainFilter) => {\n switch (domainFilter.filterType) {\n case api_internal_contract_js_1.FilterType.Categorical: {\n const filter = domainFilter;\n if (filter) {\n filters.push(this.convertCategoricalFilter(filter));\n }\n else {\n throw new Error('Invalid Categorical Filter');\n }\n break;\n }\n case api_internal_contract_js_1.FilterType.Hierarchical: {\n const filter = domainFilter;\n if (filter) {\n filters.push(this.convertHierarchicalFilter(filter));\n }\n else {\n throw new Error('Invalid Hierarchical Filter');\n }\n break;\n }\n case api_internal_contract_js_1.FilterType.Range: {\n const filter = domainFilter;\n if (filter) {\n filters.push(this.convertRangeFilter(filter));\n }\n else {\n throw new Error('Invalid Range Filter');\n }\n break;\n }\n case api_internal_contract_js_1.FilterType.RelativeDate: {\n const filter = domainFilter;\n if (filter) {\n filters.push(this.convertRelativeDateFilter(filter));\n }\n else {\n throw new Error('Invalid Relative Date Filter');\n }\n break;\n }\n default: {\n break;\n }\n }\n });\n return filters;\n }\n convertCategoricalFilter(domainFilter) {\n const appliedValues = domainFilter.values.map((dv) => {\n return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(dv);\n });\n return new FilterModels_1.CategoricalFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_external_contract_js_1.FilterType.Categorical, this._registryId, appliedValues, domainFilter.isExclude, domainFilter.isAllSelected);\n }\n convertHierarchicalFilter(domainFilter) {\n const appliedValues = domainFilter.values.map((hierarchicalDataValue) => {\n return new FilterModels_1.HierarchicalDataValue(DataValueFactory_1.DataValueFactory.MakeFilterDataValue(hierarchicalDataValue.value), hierarchicalDataValue.hierarchicalPath, hierarchicalDataValue.level);\n });\n const levelDetails = domainFilter.levelInfo.map((aLevel) => {\n return new FilterModels_1.HierarchicalLevelDetail(aLevel.name, InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.hierarchicalLevelSelectionState.convert(aLevel.levelSelectionState));\n });\n return new FilterModels_1.HierarchicalFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_external_contract_js_1.FilterType.Hierarchical, this._registryId, domainFilter.dimensionName, domainFilter.hierarchyCaption, domainFilter.levels, levelDetails, appliedValues, domainFilter.isAllSelected);\n }\n convertRangeFilter(domainFilter) {\n const minValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.min);\n const maxValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.max);\n return new FilterModels_1.RangeFilter(domainFilter.visualId.worksheet, domainFilter.fieldCaption, domainFilter.fieldName, api_external_contract_js_1.FilterType.Range, this._registryId, minValue, maxValue, domainFilter.includeNullValues);\n }\n convertRelativeDateFilter(domainFilter) {\n const anchorDateValue = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainFilter.anchorDate);\n 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);\n }\n convertCategoricalDomain(domain, domainType) {\n const values = domain.values.map((domainDv) => {\n return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainDv);\n });\n return new FilterModels_1.CategoricalDomain(values, domainType);\n }\n convertRangeDomain(domain, domainType) {\n const min = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.min);\n const max = DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domain.max);\n return new FilterModels_1.RangeDomain(min, max, domainType);\n }\n convertAnchorDate(anchorDate) {\n // Converts a Date object into a string format that the server expects for date/time values.\n // If anchorDate doesn't represent a valid Date object, any of these would be NaN.\n const year = anchorDate.getUTCFullYear();\n const month = anchorDate.getUTCMonth() + 1;\n const day = anchorDate.getUTCDate();\n const hh = anchorDate.getUTCHours();\n const mm = anchorDate.getUTCMinutes();\n const sec = anchorDate.getUTCSeconds();\n if (isNaN(year) || isNaN(month) || isNaN(day) || isNaN(hh) || isNaN(mm) || isNaN(sec)) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.EmbeddingErrorCodes.InvalidDateParameter, 'Invalid date parameter: anchorDate');\n }\n const result = `${year}-${month}-${day} ${hh}:${mm}:${sec}`;\n return result;\n }\n apiFilterHandlerCheckForCommandError(serverPm) {\n if (!serverPm[InternalContract.ParameterId.ParameterError]) {\n return;\n }\n if (serverPm[InternalContract.ParameterId.InvalidFieldCaption]) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidFilterFieldName, serverPm[InternalContract.ParameterId.InvalidFieldCaption]);\n }\n if (serverPm[InternalContract.ParameterId.InvalidValues]) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidFilterFieldValue, serverPm[InternalContract.ParameterId.InvalidValues]);\n }\n if (serverPm[InternalContract.ParameterId.InvalidAggFieldName]) {\n throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InvalidAggregationFieldName, serverPm[InternalContract.ParameterId.InvalidAggFieldName]);\n }\n throw new ApiShared_1.TableauError(api_external_contract_js_1.SharedErrorCodes.ServerError, 'Server Error');\n }\n}\nexports.FilterServiceImpl = FilterServiceImpl;\n//# sourceMappingURL=FilterServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Environment = void 0;\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst ConnectedServer_1 = require(\"../Impl/ConnectedServer\");\nconst WorkbookFormattingEnvUtil_1 = require(\"./WorkbookFormattingEnvUtil\");\n/**\n * Implementation of the external environment namespace.\n * Environment does not follow the Impl pattern as it is\n * just a property bag.\n * First class extensions can get to ConnectedServer with: environment['connectedServer']\n */\nclass Environment {\n constructor(extensionEnvironment) {\n this._apiVersion = api_shared_js_1.ApiVersion.Instance && api_shared_js_1.ApiVersion.Instance.formattedValue; // maj.min.fix (no build)\n this._context = api_shared_js_1.InternalToExternalEnumMappings.extensionContext.convert(extensionEnvironment.extensionContext);\n this._isExporting = extensionEnvironment.isExporting;\n this._formatting = WorkbookFormattingEnvUtil_1.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(extensionEnvironment.workbookFormatting);\n this._language = extensionEnvironment.extensionLanguage;\n this._country = extensionEnvironment.extensionCountry;\n this._locale = extensionEnvironment.extensionLocale;\n this._workbookLocale = extensionEnvironment.workbookLocale;\n this._mode = api_shared_js_1.InternalToExternalEnumMappings.extensionMode.convert(extensionEnvironment.extensionMode);\n this._operatingSystem = extensionEnvironment.operatingSystem;\n this._tableauVersion = extensionEnvironment.tableauVersion;\n this._uniqueUserId = extensionEnvironment.uniqueUserId;\n this._exportedMediaType = extensionEnvironment.exportedMediaType\n ? api_shared_js_1.InternalToExternalEnumMappings.exportedMediaType.convert(extensionEnvironment.exportedMediaType)\n : undefined;\n // If we have a userId, then we are a first class extension\n if (extensionEnvironment.userId) {\n this.connectedServer = new ConnectedServer_1.ConnectedServer(extensionEnvironment.userId, extensionEnvironment.siteId, extensionEnvironment.siteNamespace, extensionEnvironment.workbookId);\n this.featureFlags = extensionEnvironment.featureFlags;\n }\n }\n get apiVersion() {\n return this._apiVersion;\n }\n get context() {\n return this._context;\n }\n get workbookFormatting() {\n return this._formatting;\n }\n get language() {\n return this._language;\n }\n get country() {\n return this._country;\n }\n get locale() {\n return this._locale;\n }\n get workbookLocale() {\n return this._workbookLocale;\n }\n get mode() {\n return this._mode;\n }\n get operatingSystem() {\n return this._operatingSystem;\n }\n get tableauVersion() {\n return this._tableauVersion;\n }\n get uniqueUserId() {\n return this._uniqueUserId;\n }\n get isExporting() {\n return this._isExporting;\n }\n get exportedMediaType() {\n return this._exportedMediaType;\n }\n}\nexports.Environment = Environment;\n//# sourceMappingURL=Environment.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DataSourceImpl = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst ConnectionSummary_1 = require(\"../ConnectionSummary\");\nconst Field_1 = require(\"../Field\");\nconst LogicalTable_1 = require(\"../LogicalTable\");\nconst ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nconst TableSummary_1 = require(\"../TableSummary\");\nconst ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nconst FieldImpl_1 = require(\"./FieldImpl\");\nclass DataSourceImpl {\n constructor(_dataSourceInfo, _registryId) {\n this._dataSourceInfo = _dataSourceInfo;\n this._registryId = _registryId;\n this._fields = _dataSourceInfo.fields.map((fieldModel) => {\n const fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, this);\n return new Field_1.Field(fieldImpl);\n });\n }\n get name() {\n return this._dataSourceInfo.name;\n }\n get id() {\n return this._dataSourceInfo.id;\n }\n get extractUpdateTime() {\n return this._dataSourceInfo.extractUpdateTime;\n }\n get fields() {\n return this._fields;\n }\n get isExtract() {\n return this._dataSourceInfo.isExtract;\n }\n get isPublished() {\n return this._dataSourceInfo.isPublished;\n }\n publishedUrl() {\n return this._dataSourceInfo.publishedUrl;\n }\n getMaxPageRowLimit() {\n return 10000;\n }\n refreshAsync() {\n const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* ServiceNames.DataSourceService */);\n return dataSourceService.refreshAsync(this._dataSourceInfo.id);\n }\n getConnectionSummariesAsync() {\n const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* ServiceNames.DataSourceService */);\n return dataSourceService.getConnectionSummariesAsync(this._dataSourceInfo.id).then((summaries) => {\n return summaries.map((summary) => new ConnectionSummary_1.ConnectionSummary(summary));\n });\n }\n getActiveTablesAsync() {\n const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* ServiceNames.DataSourceService */);\n return dataSourceService.getActiveTablesAsync(this._dataSourceInfo.id).then((tableInfos) => {\n return tableInfos.map((tableInfo) => new TableSummary_1.TableSummary(tableInfo));\n });\n }\n getUnderlyingDataAsync(options) {\n const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* ServiceNames.GetData */);\n options = options || {};\n return getDataService.getDataSourceDataAsync(this.id, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults\n options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues);\n }\n getLogicalTableDataAsync(logicalTableId, options) {\n const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* ServiceNames.GetData */);\n options = options || {};\n return getDataService.getLogicalTableDataAsync(this.id, logicalTableId, !!options.ignoreAliases, options.maxRows || 0, // 0 and [] are defaults\n options.columnsToInclude || [], options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues);\n }\n getLogicalTableDataReaderAsync(logicalTableId, pageRowCount, options) {\n const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"get-data-service\" /* ServiceNames.GetData */);\n options = options || {};\n return getDataService.getLogicalTableDataReaderAsync(this.id, logicalTableId, pageRowCount || this.getMaxPageRowLimit(), !!options.ignoreAliases, options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues);\n }\n initializeWithPublicInterfaces(dataSource) {\n ErrorHelpers_1.ErrorHelpers.verifyInternalValue(dataSource, 'dataSource');\n this._fields = this._dataSourceInfo.fields.map((fieldModel) => {\n const fieldImpl = new FieldImpl_1.FieldImpl(fieldModel, dataSource);\n return new Field_1.Field(fieldImpl);\n });\n }\n getLogicalTablesAsync() {\n const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"data-source-service\" /* ServiceNames.DataSourceService */);\n return dataSourceService.getLogicalTablesAsync(this.id).then((logicalTableInfos) => {\n return logicalTableInfos.map((logicalTableInfo) => new LogicalTable_1.LogicalTable(logicalTableInfo));\n });\n }\n}\nexports.DataSourceImpl = DataSourceImpl;\n//# sourceMappingURL=DataSourceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Dashboard = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst DashboardLayoutChangedEvent_1 = require(\"../Events/DashboardLayoutChangedEvent\");\nconst WorkbookFormattingChangedEvent_1 = require(\"../Events/WorkbookFormattingChangedEvent\");\nconst ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nconst DashboardObject_1 = require(\"./DashboardObject\");\nconst Sheet_1 = require(\"./Sheet\");\nconst Worksheet_1 = require(\"./Worksheet\");\nclass Dashboard extends Sheet_1.Sheet {\n constructor(_dashboardImpl) {\n super(_dashboardImpl);\n this._dashboardImpl = _dashboardImpl;\n _dashboardImpl.initializeWithPublicInterfaces();\n this.initializeEvents().forEach((e) => this.addNewEventType(e));\n }\n get worksheets() {\n return this._dashboardImpl.worksheetsImpl.map((worksheetImpl) => {\n return new Worksheet_1.Worksheet(worksheetImpl);\n });\n }\n get objects() {\n return this._dashboardImpl.objects.map((dashboardObjectImpl) => {\n return new DashboardObject_1.DashboardObject(dashboardObjectImpl);\n });\n }\n get activeDashboardObjectId() {\n return this._dashboardImpl.activeDashboardObjectId;\n }\n get activeDashboardName() {\n return this._dashboardImpl.activeDashboardName;\n }\n setZoneVisibilityAsync(zoneVisibilityMap) {\n return this._dashboardImpl.setDashboardObjectVisibilityAsync(zoneVisibilityMap);\n }\n setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap) {\n return this._dashboardImpl.setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap);\n }\n getDashboardObjectById(dashboardObjectId) {\n const zone = this._dashboardImpl.getDashboardObjectById(dashboardObjectId);\n return zone && new DashboardObject_1.DashboardObject(zone);\n }\n initializeEvents() {\n const results = new Array();\n // Initializing events and registering notification service\n let notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* ServiceNames.Notification */);\n }\n catch (e) {\n // If we don't have this service registered, just return (allows unit testing without NotificationService mock)\n return results;\n }\n const dashboardLayoutChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.DashboardLayoutChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.DashboardLayoutChanged, () => true, (event) => {\n const dashboardObjectChanges = this._dashboardImpl.updateZones(event.zones, event.activeZoneId, event.activeDashboardName);\n dashboardLayoutChangedEvent.triggerEvent(() => new DashboardLayoutChangedEvent_1.DashboardLayoutChangedEvent(dashboardObjectChanges));\n });\n results.push(dashboardLayoutChangedEvent);\n const workbookFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorkbookFormattingChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorkbookFormattingChanged, () => true, (eventFormatting) => {\n workbookFormattingChangedEvent.triggerEvent(() => new WorkbookFormattingChangedEvent_1.WorkbookFormattingChangedEvent(eventFormatting));\n });\n results.push(workbookFormattingChangedEvent);\n return results;\n }\n moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray) {\n return this._dashboardImpl.moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray);\n }\n replayAnimationAsync(replaySpeed) {\n return this._dashboardImpl.replayAnimationAsync(replaySpeed);\n }\n getFiltersAsync() {\n return this._dashboardImpl.getFiltersAsync();\n }\n applyFilterAsync(fieldName, values, updateType, options) {\n return this._dashboardImpl.applyFilterAsync(fieldName, values, updateType, options);\n }\n}\nexports.Dashboard = Dashboard;\n//# sourceMappingURL=Dashboard.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SettingsImpl = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst TableauEvent_1 = require(\"../Events/TableauEvent\");\nconst ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nclass SettingsChangedEvent extends TableauEvent_1.TableauEvent {\n constructor(_newSettings) {\n super(Contract.TableauEventType.SettingsChanged);\n this._newSettings = _newSettings;\n }\n get newSettings() {\n return this._newSettings;\n }\n}\nclass SettingsImpl {\n constructor(settingsInfo) {\n // Since promises can't be introspected for state, keep a variable that\n // indicates a save is in progress, so that set/erase can't be called during a save.\n this._saveInProgress = false;\n this.initializeSettings(settingsInfo);\n }\n erase(key) {\n api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key');\n // Only make a modification if we have the key already\n if (this._currentSettings[key]) {\n this.verifySettingsAreUnlocked();\n delete this._currentSettings[key];\n this._isModified = true;\n }\n }\n get(key) {\n api_shared_js_1.ErrorHelpers.verifyParameter(key, 'key');\n return this._currentSettings[key];\n }\n getAll() {\n // Returns a mutable copy of the settings\n return Object.assign({}, this._currentSettings);\n }\n get isModified() {\n return this._isModified;\n }\n saveAsync() {\n this.verifySettingsAreUnlocked();\n // Just resolve immediately if settings are unchanged\n if (!this._isModified) {\n return Promise.resolve(this._currentSettings);\n }\n this._saveInProgress = true;\n // Use the settings service to save settings to twb\n const settingsService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"SettingsService\" /* ExtensionsServiceNames.SettingsService */);\n return settingsService.saveSettingsAsync(this._currentSettings).then((newSettings) => {\n this._saveInProgress = false;\n this._isModified = false;\n if (this._currentSettings === undefined) {\n this._currentSettings = newSettings;\n }\n else {\n Object.assign(this._currentSettings, newSettings);\n }\n return newSettings;\n }, (reason) => {\n this._saveInProgress = false;\n return Promise.reject(reason);\n });\n }\n set(key, value) {\n api_shared_js_1.ErrorHelpers.verifyStringParameter(key, 'key'); // Key shouldn't be an empty string.\n api_shared_js_1.ErrorHelpers.verifyParameter(value, 'value'); // Empty string value is allowed.\n this.verifySettingsAreUnlocked();\n this._currentSettings[key] = value;\n this._isModified = true;\n }\n /**\n * Initializes all events relevant to settings object. This is only a settingsUpdate event currently.\n *\n * @returns {Array} Collection of event managers to pass to an EventListenerManager.\n */\n initializeEvents() {\n const results = new Array();\n let notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* ServiceNames.Notification */);\n }\n catch (e) {\n // If we don't have this service registered, just return\n return results;\n }\n const settingsChangedEvent = new api_shared_js_1.SingleEventManagerImpl(Contract.TableauEventType.SettingsChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SettingsChanged, () => true, (event) => {\n var _a;\n this._currentSettings = (_a = event.newSettings) !== null && _a !== void 0 ? _a : {};\n settingsChangedEvent.triggerEvent(() => new SettingsChangedEvent(event.newSettings));\n });\n results.push(settingsChangedEvent);\n return results;\n }\n initializeSettings(settingsInfo) {\n api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo, 'settingsInfo');\n api_shared_js_1.ErrorHelpers.verifyParameter(settingsInfo.settingsValues, 'settingsInfo.SettingsValues');\n this._currentSettings = settingsInfo.settingsValues;\n // Reset the isModified flag\n this._isModified = false;\n }\n /**\n * This helper should be called before any local update to this.currentSettings.\n * Checks if a current save call is still in progress and throws an error if so.\n */\n verifySettingsAreUnlocked() {\n if (this._saveInProgress) {\n throw new api_shared_js_1.TableauError(Contract.ErrorCodes.SettingSaveInProgress, SettingsImpl.ASYNC_SAVE_IN_PROGRESS);\n }\n }\n}\nexports.SettingsImpl = SettingsImpl;\nSettingsImpl.ASYNC_SAVE_IN_PROGRESS = 'Async Save is in progress, updating settings is not allowed.';\n//# sourceMappingURL=SettingsImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Field = void 0;\nclass Field {\n constructor(_fieldImpl) {\n this._fieldImpl = _fieldImpl;\n }\n get name() {\n return this._fieldImpl.name;\n }\n get id() {\n return this._fieldImpl.id;\n }\n get description() {\n return this._fieldImpl.description;\n }\n get dataType() {\n return this._fieldImpl.dataType;\n }\n get aggregation() {\n return this._fieldImpl.aggregation;\n }\n get dataSource() {\n return this._fieldImpl.dataSource;\n }\n get role() {\n return this._fieldImpl.role;\n }\n get columnType() {\n return this._fieldImpl.columnType;\n }\n get isCalculatedField() {\n return this._fieldImpl.isCalculatedField;\n }\n get isCombinedField() {\n return this._fieldImpl.isCombinedField;\n }\n get isGenerated() {\n return this._fieldImpl.isGenerated;\n }\n get isGeospatial() {\n return this._fieldImpl.isGeospatial;\n }\n get isHidden() {\n return this._fieldImpl.isHidden;\n }\n get isPresentOnPublishedDatasource() {\n return this._fieldImpl.isPresentOnPublishedDatasource;\n }\n get semanticRole() {\n return this._fieldImpl.semanticRole;\n }\n get dataFormat() {\n return this._fieldImpl.dataFormat;\n }\n}\nexports.Field = Field;\n//# sourceMappingURL=Field.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NotificationServiceImplBase = exports.Registration = void 0;\nclass Registration {\n constructor(_filterFn, _callbackFn) {\n this._filterFn = _filterFn;\n this._callbackFn = _callbackFn;\n // Nothing Here\n }\n onNotification(notificationModel) {\n if (this._filterFn(notificationModel)) {\n this._callbackFn(notificationModel);\n }\n }\n}\nexports.Registration = Registration;\nclass NotificationServiceImplBase {\n constructor(dispatcher) {\n this.dispatcher = dispatcher;\n this._handlers = {};\n this.dispatcher.registerNotificationHandler(this.onNotification.bind(this));\n }\n registerHandler(id, filterFn, handler) {\n const handlers = this._handlers[id] || new Array();\n const registration = new Registration(filterFn, handler);\n handlers.push(registration);\n this._handlers[id] = handlers;\n return () => this.removeRegistration(id, registration);\n }\n hasHandlersForNotificationType(id) {\n return this._handlers.hasOwnProperty(id);\n }\n onNotification(notification) {\n if (!this.hasHandlersForNotificationType(notification.notificationId)) {\n return;\n }\n // Go through and check for all the handlers of this particular notification\n this._handlers[notification.notificationId].forEach((h) => h.onNotification(notification.data));\n }\n removeRegistration(id, registration) {\n if (!this.hasHandlersForNotificationType(id)) {\n return;\n }\n this._handlers[id] = this._handlers[id].filter((reg) => reg !== registration);\n }\n}\nexports.NotificationServiceImplBase = NotificationServiceImplBase;\n//# sourceMappingURL=NotificationServiceImplBase.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ConnectionSummary = void 0;\n/**\n * Implementation of a connection summary.\n * This does not follow the Impl pattern as it is just a property bag.\n */\nclass ConnectionSummary {\n constructor(_connectionInfo) {\n this._connectionInfo = _connectionInfo;\n }\n get name() {\n return this._connectionInfo.name;\n }\n get id() {\n return this._connectionInfo.id;\n }\n get serverURI() {\n return this._connectionInfo.serverURI;\n }\n get type() {\n return this._connectionInfo.type;\n }\n}\nexports.ConnectionSummary = ConnectionSummary;\n//# sourceMappingURL=ConnectionSummary.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WorksheetContent = void 0;\n/**\n * Implementation of the external WorksheetContent namespace.\n * This does not follow the Impl pattern as WorksheetContent is\n * currently just a (single) property bag.\n */\nclass WorksheetContent {\n constructor(_worksheet) {\n this._worksheet = _worksheet;\n }\n get worksheet() {\n return this._worksheet;\n }\n}\nexports.WorksheetContent = WorksheetContent;\n//# sourceMappingURL=WorksheetContent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.WorkbookFormattingEnvUtil = void 0;\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nclass WorkbookFormattingEnvUtil {\n static convertToWorkbookFormatting(workbookFormattingModel) {\n if (!workbookFormattingModel) {\n return undefined;\n }\n else {\n const formattingMap = workbookFormattingModel.formattingSheets.map((currentFormattingSheet) => {\n const formattingSheet = {\n classNameKey: api_shared_js_1.InternalToExternalEnumMappings.classNameKey.convert(currentFormattingSheet.classNameKey),\n cssProperties: getCssProperties(currentFormattingSheet.classNameKey, currentFormattingSheet.cssProperties),\n };\n return formattingSheet;\n });\n const result = {\n formattingSheets: formattingMap,\n };\n return result;\n }\n }\n}\nexports.WorkbookFormattingEnvUtil = WorkbookFormattingEnvUtil;\nfunction getCssProperties(classNameKey, cssProperties) {\n if (classNameKey === \"tableau-row-dividers\" /* ClassNameKey.RowDividers */ || classNameKey === \"tableau-column-dividers\" /* ClassNameKey.ColumnDividers */) {\n return {\n borderColor: cssProperties.borderColor,\n borderStyle: cssProperties.borderStyle,\n borderWidth: cssProperties.borderWidth,\n };\n }\n return {\n fontFamily: cssProperties.fontFamily,\n fontSize: cssProperties.fontSize,\n fontWeight: cssProperties.fontWeight,\n fontStyle: cssProperties.fontStyle,\n textDecoration: cssProperties.textDecoration,\n color: cssProperties.color,\n };\n}\n//# sourceMappingURL=WorkbookFormattingEnvUtil.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExtensionsRegistryId = void 0;\nexports.ExtensionsRegistryId = 0;\n//# sourceMappingURL=ServiceRegistryUtil.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.isMessage = isMessage;\nexports.isVersion = isVersion;\nexports.isInitMessage = isInitMessage;\nexports.isCommandResponseMessage = isCommandResponseMessage;\nexports.isCommandMessage = isCommandMessage;\nexports.isNotificationMessage = isNotificationMessage;\nexports.isHandshakeMessage = isHandshakeMessage;\nconst guid = require(\"guid\");\nconst Notifications_1 = require(\"../contract/Notifications\");\nconst MessageTypes_1 = require(\"./interface/MessageTypes\");\nconst expectedEmptyNotifications = new Set([\n Notifications_1.NotificationId.EditButtonClicked,\n Notifications_1.NotificationId.EditInDesktopButtonClicked,\n Notifications_1.NotificationId.WorkbookPublished,\n Notifications_1.NotificationId.WorkbookReadyToClose,\n Notifications_1.NotificationId.ReadyToReceiveAuthToken,\n]);\n/* tslint:disable no-any */\nfunction isMessage(data) {\n if (!data) {\n return false;\n }\n const message = data;\n if (!message || !message.msgGuid || !message.msgType) {\n return false;\n }\n if (!guid.isGuid(message.msgGuid)) {\n return false;\n }\n if (typeof message.msgType !== 'string') {\n return false;\n }\n const messageTypes = [\n MessageTypes_1.MessageType.Command,\n MessageTypes_1.MessageType.CommandResponse,\n MessageTypes_1.MessageType.Initialize,\n MessageTypes_1.MessageType.Notification,\n MessageTypes_1.MessageType.Handshake,\n ];\n if (messageTypes.indexOf(message.msgType) < 0) {\n return false;\n }\n return true;\n}\nfunction isVersion(versionNumber) {\n if (!versionNumber) {\n return false;\n }\n const v = versionNumber;\n if (typeof v !== 'object') {\n return false;\n }\n if (typeof v.fix !== 'number' || typeof v.minor !== 'number' || typeof v.major !== 'number') {\n return false;\n }\n return true;\n}\nfunction isInitMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n const initMessage = message;\n if (initMessage.msgType !== MessageTypes_1.MessageType.Initialize) {\n return false;\n }\n if (!initMessage.apiVersion || !isVersion(initMessage.apiVersion)) {\n return false;\n }\n if (!initMessage.crossFrameVersion || !isVersion(initMessage.crossFrameVersion)) {\n return false;\n }\n return true;\n}\nfunction isCommandResponseMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n const crMessage = message;\n if (crMessage.msgType !== MessageTypes_1.MessageType.CommandResponse) {\n return false;\n }\n if (!guid.isGuid(crMessage.commandGuid)) {\n return false;\n }\n if (!crMessage.data && !crMessage.error) {\n return false;\n }\n return true;\n}\nfunction isCommandMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n const commandMessage = message;\n if (commandMessage.msgType !== MessageTypes_1.MessageType.Command) {\n return false;\n }\n if (!commandMessage.parameters || typeof commandMessage.parameters !== 'object') {\n return false;\n }\n if (!commandMessage.verbId || typeof commandMessage.verbId !== 'string') {\n return false;\n }\n return true;\n}\nfunction isNotificationMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n const notificationMessage = message;\n if (notificationMessage.msgType !== MessageTypes_1.MessageType.Notification) {\n return false;\n }\n if (!notificationMessage.data && !expectedEmptyNotifications.has(notificationMessage.notificationId)) {\n return false;\n }\n if (!notificationMessage.notificationId || typeof notificationMessage.notificationId !== 'string') {\n return false;\n }\n return true;\n}\nfunction isHandshakeMessage(message) {\n if (!isMessage(message)) {\n return false;\n }\n const handshakeMessage = message;\n if (handshakeMessage.msgType !== MessageTypes_1.MessageType.Handshake) {\n return false;\n }\n return true;\n}\n//# sourceMappingURL=MessageTypeChecks.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.MessageType = void 0;\n/**\n * Enum defining the 4 different types of messages we have defined\n */\nvar MessageType;\n(function (MessageType) {\n MessageType[\"Initialize\"] = \"initialize\";\n MessageType[\"Notification\"] = \"notification\";\n MessageType[\"Command\"] = \"command\";\n MessageType[\"CommandResponse\"] = \"command-response\";\n MessageType[\"Handshake\"] = \"v-handshake\";\n MessageType[\"Ack\"] = \"v-ack\";\n})(MessageType || (exports.MessageType = MessageType = {}));\n//# sourceMappingURL=MessageTypes.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.LogicalTable = void 0;\n/**\n * Implementation of a logical table.\n * This does not follow the Impl pattern as it is just a property bag.\n */\nclass LogicalTable {\n constructor(_logicalTable) {\n this._logicalTable = _logicalTable;\n }\n get id() {\n return this._logicalTable.id;\n }\n get caption() {\n return this._logicalTable.caption;\n }\n}\nexports.LogicalTable = LogicalTable;\n//# sourceMappingURL=LogicalTable.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.EventListenerManager = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst TableauError_1 = require(\"./TableauError\");\n/**\n * Class designed to register and unregister handlers from a user. Only those events\n * which are added via AddNewEventType will be supported by this instance\n */\nclass EventListenerManager {\n constructor() {\n this._eventListenerManagers = {};\n }\n addEventListener(eventType, handler) {\n if (!this._eventListenerManagers.hasOwnProperty(eventType)) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedEventName, `Cannot add event, unsupported event type: ${eventType}`);\n }\n return this._eventListenerManagers[eventType].addEventListener(handler);\n }\n removeEventListener(eventType, handler) {\n if (!this._eventListenerManagers.hasOwnProperty(eventType)) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.ErrorCodes.UnsupportedEventName, `Cannot remove event, unsupported event type: ${eventType}`);\n }\n return this._eventListenerManagers[eventType].removeEventListener(handler);\n }\n addNewEventType(eventManager) {\n this._eventListenerManagers[eventManager.eventType] = eventManager;\n }\n}\nexports.EventListenerManager = EventListenerManager;\n//# sourceMappingURL=EventListenerManager.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SheetImpl = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nconst TableauError_1 = require(\"../TableauError\");\nconst ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nconst Param_1 = require(\"../Utils/Param\");\nconst SheetUtils_1 = require(\"../Utils/SheetUtils\");\nclass SheetImpl {\n constructor(_sheetInfoImpl, _registryId) {\n this._sheetInfoImpl = _sheetInfoImpl;\n this._registryId = _registryId;\n }\n get name() {\n return this._sheetInfoImpl.name;\n }\n get sheetType() {\n return this._sheetInfoImpl.sheetType;\n }\n get sheetPath() {\n return this._sheetInfoImpl.sheetPath;\n }\n get size() {\n return this._sheetInfoImpl.sheetSize;\n }\n get hidden() {\n if (this._sheetInfoImpl.isHidden !== undefined) {\n return this._sheetInfoImpl.isHidden;\n }\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `isHidden not implemented`);\n }\n get active() {\n if (this._sheetInfoImpl.isActive !== undefined) {\n return this._sheetInfoImpl.isActive;\n }\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `active not implemented`);\n }\n set active(active) {\n if (this._sheetInfoImpl.isActive !== undefined) {\n this._sheetInfoImpl.active = active;\n }\n }\n get index() {\n if (this._sheetInfoImpl.index !== undefined) {\n return this._sheetInfoImpl.index;\n }\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `index not implemented`);\n }\n get url() {\n if (this._sheetInfoImpl.url !== undefined) {\n return this._sheetInfoImpl.url;\n }\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.ImplementationError, `url not implemented`);\n }\n getSheetSize() {\n if (!SheetUtils_1.SheetUtils.isValidSheetSize(this.size)) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InternalError, 'size is not of type SheetSize');\n }\n return this.size;\n }\n findParameterAsync(parameterName) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(parameterName, 'parameterName');\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"parameters-service\" /* ServiceNames.Parameters */);\n return service.findParameterByNameAsync(parameterName);\n }\n getParametersAsync() {\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"parameters-service\" /* ServiceNames.Parameters */);\n return service.getParametersForSheetAsync(this.sheetPath);\n }\n changeSizeAsync(newSize) {\n const invalidSizeError = new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Invalid sheet size parameter');\n if (!newSize || !newSize.behavior) {\n throw invalidSizeError;\n }\n const partialSheetSize = this.normalizeSheetSize(newSize);\n const isAutomatic = partialSheetSize.behavior === Contract.SheetSizeBehavior.Automatic;\n if (!isAutomatic && !partialSheetSize.minSize && !partialSheetSize.maxSize) {\n throw invalidSizeError;\n }\n if (!isAutomatic && this.sheetType === Contract.SheetType.Worksheet) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSizeBehaviorOnWorksheet, 'Only SheetSizeBehavior.Automatic is allowed on Worksheets');\n }\n if (isAutomatic && this.getSheetSize().behavior === partialSheetSize.behavior) {\n return Promise.resolve(newSize);\n }\n const processedNewSize = this.processNewSize(partialSheetSize);\n const sizeService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"size-service\" /* ServiceNames.Size */);\n return sizeService.changeSizeAsync(this.name, processedNewSize).then(() => {\n const clientInfoService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"client-info-service\" /* ServiceNames.ClientInfo */);\n return clientInfoService.getClientInfoAsync().then((bootstrapInfo) => {\n const sheet = bootstrapInfo.publishedSheets.find((s) => s.name === this.name);\n if (!sheet) {\n throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InternalError, `Can't find sheet with name ${this.name}`);\n }\n const sheetSize = SheetUtils_1.SheetUtils.getSheetSizeFromSizeConstraints(sheet.sizeConstraint);\n this._sheetInfoImpl.sheetSize = sheetSize;\n return sheetSize;\n });\n });\n }\n normalizeSheetSize(newSize) {\n const { behavior } = newSize;\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(behavior, Contract.SheetSizeBehavior, 'SheetSizeBehavior');\n const minSize = SheetImpl.parseDimensions(newSize.minSize);\n const maxSize = SheetImpl.parseDimensions(newSize.maxSize);\n return { behavior, minSize, maxSize };\n }\n processNewSize(newSize) {\n const { behavior, minSize: minSizeMaybe, maxSize: maxSizeMaybe } = newSize;\n const hasMinWidth = !Param_1.Param.isNullOrUndefined(minSizeMaybe === null || minSizeMaybe === void 0 ? void 0 : minSizeMaybe.width);\n const hasMinHeight = !Param_1.Param.isNullOrUndefined(minSizeMaybe === null || minSizeMaybe === void 0 ? void 0 : minSizeMaybe.height);\n const hasMaxWidth = !Param_1.Param.isNullOrUndefined(maxSizeMaybe === null || maxSizeMaybe === void 0 ? void 0 : maxSizeMaybe.width);\n const hasMaxHeight = !Param_1.Param.isNullOrUndefined(maxSizeMaybe === null || maxSizeMaybe === void 0 ? void 0 : maxSizeMaybe.height);\n const hasValidMinSize = hasMinWidth && hasMinHeight;\n const hasValidMaxSize = hasMaxWidth && hasMaxHeight;\n switch (behavior) {\n case Contract.SheetSizeBehavior.Automatic: {\n return { behavior };\n }\n case Contract.SheetSizeBehavior.AtMost: {\n if (!maxSizeMaybe || !hasValidMaxSize) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMaxSize, 'Missing maxSize for SheetSizeBehavior.AtMost');\n }\n const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height };\n if (maxSize.width < 0 || maxSize.height < 0) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Size value cannot be less than zero');\n }\n return { behavior, maxSize };\n }\n case Contract.SheetSizeBehavior.AtLeast: {\n if (!minSizeMaybe || !hasValidMinSize) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMinSize, 'Missing minSize for SheetSizeBehavior.AtLeast');\n }\n const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height };\n if (minSize.width < 0 || minSize.height < 0) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Size value cannot be less than zero');\n }\n return { behavior, minSize };\n }\n case Contract.SheetSizeBehavior.Range: {\n if (!minSizeMaybe || !maxSizeMaybe || !hasValidMinSize || !hasValidMaxSize) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.MissingMinMaxSize, 'Missing minSize or maxSize for SheetSizeBehavior.Range');\n }\n const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height };\n const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height };\n if (minSize.width < 0 ||\n minSize.height < 0 ||\n maxSize.width < 0 ||\n maxSize.height < 0 ||\n minSize.width > maxSize.width ||\n minSize.height > maxSize.height) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Missing minSize or maxSize for SheetSizeBehavior.Range');\n }\n return { behavior, minSize, maxSize };\n }\n case Contract.SheetSizeBehavior.Exactly: {\n if (minSizeMaybe && maxSizeMaybe) {\n if (hasValidMinSize && hasValidMaxSize) {\n const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height };\n const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height };\n if (minSize.width !== maxSize.width || minSize.height !== maxSize.height) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Conflicting size values for SheetSizeBehavior.Exactly');\n }\n return { behavior, minSize, maxSize };\n }\n if (hasValidMinSize) {\n const minSize = { width: minSizeMaybe.width, height: minSizeMaybe.height };\n return { behavior, minSize, maxSize: minSize };\n }\n if (hasValidMaxSize) {\n const maxSize = { width: maxSizeMaybe.width, height: maxSizeMaybe.height };\n return { behavior, minSize: maxSize, maxSize };\n }\n }\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.InvalidSize, 'Invalid sheet size parameter');\n }\n default: {\n throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InternalError, `Unsupported sheet size behavior: ${behavior}`);\n }\n }\n }\n}\nexports.SheetImpl = SheetImpl;\nSheetImpl.parseDimensions = (size) => {\n const empty = { width: undefined, height: undefined };\n if (!size) {\n return empty;\n }\n const { success: widthParsed, parsed: parsedWidth } = Param_1.Param.tryParseNumber(size.width);\n const { success: heightParsed, parsed: parsedHeight } = Param_1.Param.tryParseNumber(size.height);\n if (widthParsed && heightParsed) {\n return { width: parsedWidth, height: parsedHeight };\n }\n if (widthParsed) {\n return { width: parsedWidth };\n }\n if (heightParsed) {\n return { height: parsedHeight };\n }\n return empty;\n};\n//# sourceMappingURL=SheetImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DataValueFactory = void 0;\nconst InternalContract = require(\"@tableau/api-internal-contract-js\");\nconst GetDataModels_1 = require(\"../Models/GetDataModels\");\n/**\n * In version 2 of the interface, we should collapse value into nativeValue, and do all this work over\n * in the platform.\n */\nclass DataValueFactory {\n static MakeParameterDataValue(internalDataValue, dataType) {\n // Parameter values are all strings, convert from string to value\n return new GetDataModels_1.DataValue(internalDataValue.value, InternalContract.DataTypeConverter.convertStringValueToNativeValue(internalDataValue.value, dataType), internalDataValue.formattedValue, internalDataValue.aliasedValue, internalDataValue.hasAlias);\n }\n static MakeFilterDataValue(internalDataValue) {\n // Filters already have native type in value, just use that for nativeValue also\n return new GetDataModels_1.DataValue(internalDataValue.value, internalDataValue.value, internalDataValue.formattedValue);\n }\n static MakeTableDataValue(internalDataValue, dataType) {\n // DataTables contain boolean | number | string | date as string | '%null%\n // convertValueToNativeValue converts dates as string to dates, and any special to null\n // (boolean, numbers, strings are passed through)\n // Because of IncludeDataValuesOption - we can have undefined values, which are different than any special\n return new GetDataModels_1.DataValue(internalDataValue.value, internalDataValue.value !== undefined\n ? InternalContract.DataTypeConverter.convertValueToNativeValue(internalDataValue.value, dataType)\n : undefined, internalDataValue.formattedValue);\n }\n}\nexports.DataValueFactory = DataValueFactory;\n//# sourceMappingURL=DataValueFactory.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AccessibilityServiceImpl = void 0;\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst AccessibilityModels_1 = require(\"../../Models/AccessibilityModels\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass AccessibilityServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"accessibility\" /* ServiceNames.Accessibility */;\n }\n getTooltipTextAsync(visualId, tupleId) {\n let tooltipTextRequest = new AccessibilityModels_1.TooltipTextRequestModel(visualId, tupleId);\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getTooltipTextAsync',\n [api_internal_contract_js_1.ParameterId.TooltipTextRequest]: tooltipTextRequest,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetTooltipText, parameters).then((response) => {\n return response.result;\n });\n }\n leaveMarkNavigationAsync(visualId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'leaveMarkNavigationAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.RaiseLeaveMarkNavNotification, parameters).then((response) => {\n return;\n });\n }\n}\nexports.AccessibilityServiceImpl = AccessibilityServiceImpl;\n//# sourceMappingURL=AccessibilityServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.AnnotationServiceImpl = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst InternalToExternalEnumMappings_1 = require(\"../../EnumMappings/InternalToExternalEnumMappings\");\nconst SelectionModels_1 = require(\"../../Models/SelectionModels\");\nconst TableauError_1 = require(\"../../TableauError\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass AnnotationServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"annotation-service\" /* ServiceNames.Annotation */;\n }\n /**\n * Method to annotate a mark on the given worksheet.\n *\n * @param visualId\n * @param mark\n * @param annotationText\n */\n annotateMarkAsync(visualId, mark, annotationText) {\n const selectionModelContainer = this.parseMarkSelectionIds([mark]);\n const dummyTargetPoint = { x: 0, y: 0 };\n const formattedText = `${annotationText}`;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'annotateMarkAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.AnnotateEnum]: api_internal_contract_js_1.AnnotateEnum.Mark,\n [api_internal_contract_js_1.ParameterId.TargetPoint]: dummyTargetPoint,\n [api_internal_contract_js_1.ParameterId.SelectionList]: [selectionModelContainer.selection],\n [api_internal_contract_js_1.ParameterId.FormattedText]: formattedText,\n };\n return this.execute(api_internal_contract_js_1.VerbId.CreateAnnotation, parameters).then((response) => {\n // Expecting an empty model and hence the void response.\n return;\n });\n }\n /**\n * Method to retrieve annotations for the given worksheet.\n *\n * @param visualId\n * @returns {Promise>}\n */\n getAnnotationsAsync(visualId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getAnnotationsAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetAnnotations, parameters).then((response) => {\n const annotationsList = response.result;\n return this.annotationFilterMap(annotationsList);\n });\n }\n /**\n * Method to remove an annotation from a given worksheet.\n *\n * @param visualId\n * @param annotation\n */\n removeAnnotationAsync(visualId, annotation) {\n const selectionModelContainer = this.parseAnnotationSelectionIds([annotation]);\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeAnnotationAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.SelectionList]: [selectionModelContainer.selection],\n };\n return this.execute(api_internal_contract_js_1.VerbId.RemoveAnnotation, parameters).then((response) => {\n // Expecting an empty model and hence the void response.\n return;\n });\n }\n /**\n * Method to prepare the pres models for selection by MarksInfo\n * @param marks\n */\n parseMarkSelectionIds(marks) {\n const ids = [];\n const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer();\n marks.forEach((mark) => {\n const tupleId = mark.tupleId;\n if (tupleId !== undefined && tupleId !== null && tupleId > 0) {\n ids.push(tupleId.toString()); // collect the tuple ids\n }\n else {\n throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'invalid tupleId');\n }\n });\n if (ids.length !== 0) {\n // tuple ids based selection\n const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel();\n tupleSelectionModel.selectionType = 'tuples';\n tupleSelectionModel.objectIds = ids;\n selectionModelContainer.selection = tupleSelectionModel;\n }\n return selectionModelContainer;\n }\n /**\n * Method to prepare the pres models for selection by MarkAnnotationInfo\n * @param marks\n */\n parseAnnotationSelectionIds(annotations) {\n const ids = [];\n const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer();\n annotations.forEach((annotation) => {\n const annotationId = annotation.annotationId;\n if (annotationId !== undefined && annotationId !== null && annotationId >= 0) {\n ids.push(annotationId.toString()); // collect the annotation ids\n }\n else {\n throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'invalid annotationId');\n }\n });\n if (ids.length !== 0) {\n // annotation ids based selection\n const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel();\n tupleSelectionModel.selectionType = 'annotations';\n tupleSelectionModel.objectIds = ids;\n selectionModelContainer.selection = tupleSelectionModel;\n }\n return selectionModelContainer;\n }\n /**\n * Method to map Annotation to MarkAnnotationInfo\n * @param annotation\n * @returns {Annotation}\n */\n mapAnnotation(annotation) {\n return {\n annotationHTML: annotation.annotationText,\n annotationId: annotation.annotationId,\n annotationText: annotation.annotationPlainText,\n annotationType: InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.annotationType.convert(annotation.annotateEnum),\n tupleId: annotation.tupleId,\n };\n }\n /**\n * Filter the Annotations to Mark Annotations, and map them to MarkAnnotationInfo\n * @param annotations\n * @returns {Array}\n */\n annotationFilterMap(annotations) {\n const annotationInfos = annotations.map((annotation) => this.mapAnnotation(annotation));\n return annotationInfos;\n }\n}\nexports.AnnotationServiceImpl = AnnotationServiceImpl;\n//# sourceMappingURL=AnnotationServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.doCrossFrameBootstrap = doCrossFrameBootstrap;\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst CrossFrameDispatcher_1 = require(\"./CrossFrameDispatcher\");\n// Checks to see if we are running in an iframe currently: https://stackoverflow.com/a/326076/8821153\nfunction inIframe(thisWindow) {\n try {\n return thisWindow.self !== thisWindow.parent;\n }\n catch (e) {\n return true;\n }\n}\n/**\n * Attempts to bootstrap the extension with a cross-frame parent where Tableau is running\n *\n * @param thisWindow The window which we are running in (injected for unit testing purposes)\n * @param internalContractVersion The version number of the internal contract we are using\n * @returns A promise which is doing the actual bootstrapping\n */\nfunction doCrossFrameBootstrap(thisWindow, internalContractVersion, options) {\n return new Promise((resolve, reject) => {\n let parent;\n // Normally, we are running inside an iframe. The exception to this is\n // when we are running as an extension inside a dialog as part of the UINamespace\n // functionality. In that case, we want the opener of this window rather than the parent.\n if (!inIframe(thisWindow)) {\n parent = thisWindow.opener;\n }\n else {\n parent = thisWindow.parent;\n }\n if (!parent) {\n reject('This extension is not running inside an iframe, desktop, or popup window. Initialization failed.');\n }\n // Create the messenger which will do he communication between this window and our parent\n // Since we don't know where we are running yet, we have to make this initial origin '*'. Once\n // we have successfully initialized our extension, we will limit where we send messages\n const messenger = new api_internal_contract_js_1.CrossFrameMessenger(thisWindow, parent, '*');\n // Prepare to send an initialization message to the parent frame\n const initializationMessage = messenger.prepareInitializationMessage(internalContractVersion, api_internal_contract_js_1.MESSAGING_VERSION, options);\n // When we receive a response back from the parent, we check to make sure the guids match and then we know\n // that the parent is aware of us and we can start communicating\n messenger.setCommandResponseMessageHandler(function (msg) {\n // Verify we are getting a response from our initialize message\n if (msg.commandGuid === initializationMessage.messageGuid) {\n // The versioning of the dispatcher happens on the other side of our frame, and\n // in a wrapper on this side. This one doesn't have any version knowledge.\n const dispatcherFactory = () => new CrossFrameDispatcher_1.CrossFrameDispatcher(messenger);\n resolve(dispatcherFactory);\n }\n });\n // Now that our handlers are ready, start listening and send our initialization message\n messenger.startListening();\n initializationMessage.send();\n });\n}\n//# sourceMappingURL=CrossFrameBootstrap.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SelectionServiceImpl = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst SelectionModels_1 = require(\"../../Models/SelectionModels\");\nconst TableauError_1 = require(\"../../TableauError\");\nconst Param_1 = require(\"../../Utils/Param\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass SelectionServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"selection-service\" /* ServiceNames.Selection */;\n }\n /**\n * Method to clear all the selected marks for the given worksheet.\n *\n * @param visualId\n */\n clearSelectedMarksAsync(visualId) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'clearSelectedMarksAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n };\n return this.execute(api_internal_contract_js_1.VerbId.ClearSelectedMarks, parameters).then((response) => {\n return; // Expecting an empty model and hence the void response.\n });\n }\n /**\n * Method to select marks for the given worksheet.\n *\n * @param visualId\n * @param selectionCriteria\n * @param selectionUpdateType\n */\n selectMarksByValueAsync(visualId, selectionCriterias, selectionUpdateType) {\n if (selectionCriterias.length === 0) {\n throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Selection criteria missing for selecting marks by value');\n }\n const selectionType = this.validateSelectionUpdateType(selectionUpdateType);\n const selectionModelContainer = this.parseSelectionMarks(selectionCriterias);\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectMarksByValueAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.SelectionUpdateType]: selectionType,\n };\n if (selectionModelContainer.hierModelArr && selectionModelContainer.hierModelArr.length) {\n parameters[api_internal_contract_js_1.ParameterId.HierValSelectionModels] = selectionModelContainer.hierModelArr;\n }\n if (selectionModelContainer.quantModelArr && selectionModelContainer.quantModelArr.length) {\n parameters[api_internal_contract_js_1.ParameterId.QuantRangeSelectionModels] = selectionModelContainer.quantModelArr;\n }\n if (selectionModelContainer.dimModelArr && selectionModelContainer.dimModelArr.length) {\n parameters[api_internal_contract_js_1.ParameterId.DimValSelectionModels] = selectionModelContainer.dimModelArr;\n }\n return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then((response) => {\n this.apiFilterHandlerCheckForCommandError(response.result);\n return;\n });\n }\n /**\n * Method to execute hover actions and render tooltip for a given tuple representing a mark in the visualization.\n * If the tooltip parameter is included it will show the tooltip on hover. If not, no tooltip is shown.\n *\n * @param visualId\n * @param hoveredTuple\n * @param tooltip\n * @returns empty promise that resolves when the extension host has successfully been informed of the request and rejects on error\n */\n hoverTupleAsync(visualId, hoveredTuple, tooltip, allowHoverActions) {\n let interactionModel = new SelectionModels_1.HoverTupleInteractionModel(visualId, this.ensureTupleIDIsNonNegative(hoveredTuple), tooltip, allowHoverActions);\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'hoverTupleAsync',\n [api_internal_contract_js_1.ParameterId.HoverTupleInteraction]: interactionModel,\n };\n return this.execute(api_internal_contract_js_1.VerbId.RaiseHoverTupleNotification, parameters).then((response) => {\n return;\n });\n }\n /**\n * Method to modify selection, execute select actions and render tooltip for a given list of tuples representing a mark or marks in the visualization.\n * If the tooltip parameter is included it will show the tooltip on select. If not, no tooltip is shown.\n *\n * @param visualId\n * @param selectedTuples\n * @param selectOption\n * @param tooltip\n * @returns empty promise that resolves when the extension host has successfully been informed of the request and rejects on error\n */\n selectTuplesAsync(visualId, selectedTuples, selectOption, tooltip) {\n let interactionModel = new SelectionModels_1.SelectTuplesInteractionModel(visualId, selectedTuples, selectOption, tooltip);\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectTuplesAsync',\n [api_internal_contract_js_1.ParameterId.SelectTuplesInteraction]: interactionModel,\n };\n return this.execute(api_internal_contract_js_1.VerbId.RaiseSelectTuplesNotification, parameters).then((response) => {\n return;\n });\n }\n apiFilterHandlerCheckForCommandError(serverPm) {\n if (!serverPm[api_internal_contract_js_1.ParameterId.ParameterError]) {\n return;\n }\n if (serverPm[api_internal_contract_js_1.ParameterId.InvalidFields]) {\n throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InvalidSelectionFieldName, serverPm[api_internal_contract_js_1.ParameterId.InvalidFields]);\n }\n if (serverPm[api_internal_contract_js_1.ParameterId.InvalidValues]) {\n throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InvalidSelectionValue, serverPm[api_internal_contract_js_1.ParameterId.InvalidValues]);\n }\n if (serverPm[api_internal_contract_js_1.ParameterId.InvalidDates]) {\n throw new TableauError_1.TableauError(Contract.SharedErrorCodes.InvalidSelectionDate, serverPm[api_internal_contract_js_1.ParameterId.InvalidDates]);\n }\n }\n /**\n * Method to select marks for the given worksheet.\n *\n * @param visualId\n * @param MarkInfo\n * @param selectionUpdateType\n */\n selectMarksByIdAsync(visualId, marks, selectionUpdateType) {\n if (marks.length === 0) {\n throw new TableauError_1.TableauError(Contract.ErrorCodes.InvalidParameter, 'Marks info missing for selecting marks by Id');\n }\n const selectionType = this.validateSelectionUpdateType(selectionUpdateType);\n const selectionModelContainer = this.parseSelectionIds(marks);\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectMarksByIdAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.SelectionUpdateType]: selectionType,\n [api_internal_contract_js_1.ParameterId.Selection]: selectionModelContainer.selection,\n };\n return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then((response) => {\n // Expecting an empty model and hence the void response.\n return;\n // TODO Investigate the error response with multiple output params and throw error accordingly.\n });\n }\n /**\n * Method to prepare the pres models for selection by MarksInfo\n * @param marks\n */\n parseSelectionIds(marks) {\n const ids = [];\n const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer();\n for (let i = 0; i < marks.length; i++) {\n const tupleId = marks[i].tupleId;\n if (tupleId !== undefined && tupleId !== null) {\n // If tuple id is provided use that instead of pair\n ids.push(tupleId.toString()); // collect the tuple ids\n }\n else {\n throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'tupleId parsing error');\n }\n }\n if (ids.length !== 0) {\n // tuple ids based selection\n const tupleSelectionModel = new SelectionModels_1.TupleSelectionModel();\n tupleSelectionModel.selectionType = 'tuples';\n tupleSelectionModel.objectIds = ids;\n selectionModelContainer.selection = tupleSelectionModel;\n }\n return selectionModelContainer;\n }\n /**\n * Method to prepare the pres models for selection by values.\n *\n * Supports 3 types for selection:\n * 1) Hierarchical value based selection\n * 2) Range value based selection\n * 3) Dimension value based selection\n *\n * @param marks\n */\n parseSelectionMarks(selectionCriterias) {\n const selectionModelContainer = new SelectionModels_1.SelectionModelsContainer();\n for (let i = 0; i < selectionCriterias.length; i++) {\n const st = selectionCriterias[i];\n if (!(st.fieldName && st.value !== undefined && st.value !== null)) {\n throw new TableauError_1.TableauError(Contract.ErrorCodes.InternalError, 'Selection Criteria parsing error');\n }\n const catRegex = new RegExp('([[A-Za-z0-9]+]).*', 'g');\n const rangeOption = st.value;\n if (catRegex.test(st.fieldName)) {\n // Hierarchical value selection\n const hierModel = this.addToParamsList(st.fieldName, st.value);\n selectionModelContainer.hierModelArr.push(hierModel);\n }\n else if (rangeOption.min !== undefined && rangeOption.max !== undefined) {\n // Range value selection\n const quantModel = this.addToRangeParamsList(st.fieldName, rangeOption);\n selectionModelContainer.quantModelArr.push(quantModel);\n }\n else {\n // Dimension value selection\n const dimModel = this.addToParamsList(st.fieldName, st.value);\n selectionModelContainer.dimModelArr.push(dimModel);\n }\n }\n return selectionModelContainer;\n }\n /**\n * Method to transform the key value pair into value based pres model object.\n *\n * @param valueSelectionModel\n * @param fieldName\n * @param value\n */\n addToParamsList(fieldName, value) {\n const valueSelectionModel = new SelectionModels_1.ValueSelectionModel();\n const markValues = [];\n if (value instanceof Array) {\n const valueArr = value;\n for (let i = 0; i < valueArr.length; i++) {\n markValues.push(Param_1.Param.serializeParameterValue(valueArr[i]));\n }\n }\n else {\n markValues.push(Param_1.Param.serializeParameterValue(value));\n }\n valueSelectionModel.qualifiedFieldCaption = fieldName;\n valueSelectionModel.selectValues = markValues;\n return valueSelectionModel;\n }\n /**\n * Method to transform the key value pair into range based selection pres model.\n *\n * TODO: Need to handle the parsing of date type values.\n *\n * @param valueSelectionModel\n * @param fieldName\n * @param value\n */\n addToRangeParamsList(fieldName, value) {\n const rangeSelectionModel = new SelectionModels_1.RangeSelectionModel();\n rangeSelectionModel.qualifiedFieldCaption = fieldName;\n if (value.max !== undefined && value.max !== null) {\n rangeSelectionModel.maxValue = Param_1.Param.serializeParameterValue(value.max);\n }\n if (value.min !== undefined && value.min !== null) {\n rangeSelectionModel.minValue = Param_1.Param.serializeParameterValue(value.min);\n }\n rangeSelectionModel.included = this.validateNullOptionType(value.nullOption);\n return rangeSelectionModel;\n }\n /**\n * Method to validate the selection update type.\n *\n * @param selectionUpdateType\n */\n validateSelectionUpdateType(selectionUpdateType) {\n if (selectionUpdateType === Contract.SelectionUpdateType.Replace) {\n return api_internal_contract_js_1.SelectionUpdateType.Replace;\n }\n else if (selectionUpdateType === Contract.SelectionUpdateType.Add) {\n return api_internal_contract_js_1.SelectionUpdateType.Add;\n }\n else if (selectionUpdateType === Contract.SelectionUpdateType.Remove) {\n return api_internal_contract_js_1.SelectionUpdateType.Remove;\n }\n return api_internal_contract_js_1.SelectionUpdateType.Replace;\n }\n /**\n * Method to validate the include type for range selection.\n *\n * @param nullOption\n */\n validateNullOptionType(nullOption) {\n if (nullOption) {\n if (nullOption === Contract.FilterNullOption.NullValues) {\n return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeNull;\n }\n else if (nullOption === Contract.FilterNullOption.NonNullValues) {\n return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeNonNull;\n }\n else if (nullOption === Contract.FilterNullOption.AllValues) {\n return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeAll;\n }\n }\n return api_internal_contract_js_1.QuantitativeIncludedValues.IncludeAll;\n }\n ensureTupleIDIsNonNegative(tupleId) {\n if (tupleId && tupleId > 0) {\n return tupleId;\n }\n // 0 will not refer to a valid tuple (since tuple ids are 1-based),\n // but can be used for clearing the current hover or selection\n return 0;\n }\n}\nexports.SelectionServiceImpl = SelectionServiceImpl;\n//# sourceMappingURL=SelectionServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ApiVersion = void 0;\nconst VersionNumber_1 = require(\"./VersionNumber\");\n/**\n * This is the singleton wrapper of VersionNumber\n */\nclass ApiVersion {\n /**\n * Gets the singleton instance of the version number.\n */\n static get Instance() {\n return ApiVersion._instance;\n }\n static SetVersionNumber(numString, isAlpha) {\n ApiVersion._instance = new VersionNumber_1.VersionNumber(numString, isAlpha);\n }\n}\nexports.ApiVersion = ApiVersion;\n//# sourceMappingURL=ApiVersion.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=TableauError.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Point = void 0;\nclass Point {\n constructor(_x, _y) {\n this._x = _x;\n this._y = _y;\n }\n get x() {\n return this._x;\n }\n get y() {\n return this._y;\n }\n}\nexports.Point = Point;\n//# sourceMappingURL=Point.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DashboardLayoutChangedEvent = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst TableauEvent_1 = require(\"./TableauEvent\");\nclass DashboardLayoutChangedEvent extends TableauEvent_1.TableauEvent {\n constructor(_dashboardLayoutChangeDetails) {\n super(Contract.TableauEventType.DashboardLayoutChanged);\n this._dashboardLayoutChangeDetails = _dashboardLayoutChangeDetails;\n }\n get dashboardLayoutChangeDetails() {\n return this._dashboardLayoutChangeDetails;\n }\n}\nexports.DashboardLayoutChangedEvent = DashboardLayoutChangedEvent;\n//# sourceMappingURL=DashboardLayoutChangedEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StackingVersionConverter = void 0;\n// tslint:disable:no-any\n/**\n * The version converter is designed to allow the platform and external modules\n * to seemlessly communicate over two different versions of the internal API. The only\n * mode it supports is external's version <= platform's version. When executing\n * commands, it is used to upgrade the external representation to what platform knows on the way in\n * and downgrade the representations on the way out. Similarly for notifications, it can\n * downgrade those on the way from platform to external.\n */\nclass StackingVersionConverter {\n /**\n * Creates a new instance of the StackingVersionConverter\n *\n * @param _externalVersion The version of the internal contract api-external-js is using\n * @param _platformVersion The version of the internal contract the api-platform-js is using\n * @param _upgradeExecuteTranslations Ordered list of the translations to perform when upgrading cmd parameters\n * @param _downgradeExecuteTranslations Ordered list of downgrade translations to perform after a cmd\n * @param _downgradeNotificationTranslations Ordered list of downgrade translations to perform on a notification\n */\n static fromData(externalVersion, platformVersion, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations) {\n return new this(externalVersion.major, platformVersion.major, upgradeExecuteTranslations, downgradeExecuteTranslations, downgradeNotificationTranslations);\n }\n /**\n * Creates a new instance of the StackingVersionConverter\n *\n * @param _externalMajorVersion The major version of the internal contract api-external-js is using\n * @param _platformMajorVersion The major version of the internal contract the api-platform-js is using\n * @param _upgradeExecuteTranslations Ordered list of the translations to perform when upgrading cmd parameters\n * @param _downgradeExecuteTranslations Ordered list of downgrade translations to perform after a cmd\n * @param _downgradeNotificationTranslations Ordered list of downgrade translations to perform on a notification\n */\n constructor(_externalMajorVersion, _platformMajorVersion, _upgradeExecuteTranslations, _downgradeExecuteTranslations, _downgradeNotificationTranslations) {\n this._externalMajorVersion = _externalMajorVersion;\n this._platformMajorVersion = _platformMajorVersion;\n this._upgradeExecuteTranslations = _upgradeExecuteTranslations;\n this._downgradeExecuteTranslations = _downgradeExecuteTranslations;\n this._downgradeNotificationTranslations = _downgradeNotificationTranslations;\n if (this._externalMajorVersion > this._platformMajorVersion) {\n throw new Error(`Cannot convert between external version ${this._externalMajorVersion} and ${this._platformMajorVersion}`);\n }\n }\n upgradeExecuteCall(verb, parameters) {\n // Perform the upgrade of the verb and parameters to the level that platform is using\n let upgraded = { verb: verb, parameters: parameters };\n for (const upgradeTranslation of this._upgradeExecuteTranslations) {\n upgraded = upgradeTranslation(upgraded.verb, upgraded.parameters);\n }\n return upgraded;\n }\n downgradeExecuteReturn(executeResponse) {\n // Downgrade the response to what the external module is expecting\n let downgraded = executeResponse;\n for (const downgradeTranslation of this._downgradeExecuteTranslations) {\n downgraded = downgradeTranslation(downgraded);\n }\n return downgraded;\n }\n downgradeNotification(notification) {\n // Downgrade the notification to what the external module is expecting\n let downgraded = notification;\n for (const downgradeTranslation of this._downgradeNotificationTranslations) {\n downgraded = downgradeTranslation(downgraded);\n }\n return downgraded;\n }\n}\nexports.StackingVersionConverter = StackingVersionConverter;\n//# sourceMappingURL=StackingVersionConverter.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DashboardObjectImpl = void 0;\n/**\n * Implementation of the dashboard objects - the zones in a dashboard.\n * This does not follow the Impl pattern as it is just a property bag.\n */\nclass DashboardObjectImpl {\n constructor(_dashboardImpl, _type, _position, _size, _worksheetImpl, _name, _isFloating, _isVisible, _id, _fieldId) {\n this._dashboardImpl = _dashboardImpl;\n this._type = _type;\n this._position = _position;\n this._size = _size;\n this._worksheetImpl = _worksheetImpl;\n this._name = _name;\n this._isFloating = _isFloating;\n this._isVisible = _isVisible;\n this._id = _id;\n this._fieldId = _fieldId;\n }\n get dashboardImpl() {\n return this._dashboardImpl;\n }\n get type() {\n return this._type;\n }\n get position() {\n return this._position;\n }\n get size() {\n return this._size;\n }\n get worksheetImpl() {\n return this._worksheetImpl;\n }\n get name() {\n return this._name;\n }\n get isFloating() {\n return this._isFloating;\n }\n get isVisible() {\n return this._isVisible;\n }\n get id() {\n return this._id;\n }\n get fieldId() {\n return this._fieldId;\n }\n}\nexports.DashboardObjectImpl = DashboardObjectImpl;\n//# sourceMappingURL=DashboardObjectImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.TableauEvent = void 0;\nclass TableauEvent {\n constructor(type) {\n this._type = type;\n }\n get type() {\n return this._type;\n }\n}\nexports.TableauEvent = TableauEvent;\n//# sourceMappingURL=TableauEvent.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VizServiceImpl = void 0;\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst CustomViewImpl_1 = require(\"../../Impl/CustomViewImpl\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass VizServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"viz-service\" /* ServiceNames.Viz */;\n }\n createVizImageAsync(inputSpec) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'createVizImageAsync',\n [api_internal_contract_js_1.ParameterId.VizAPIInputJson]: JSON.stringify(inputSpec),\n };\n return this.execute(api_internal_contract_js_1.VerbId.VizAPI, parameters).then((response) => {\n const result = response.result;\n return result;\n });\n }\n activateSheetAsync(name) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateSheetAsync',\n [api_internal_contract_js_1.ParameterId.SwitchToSheetName]: name,\n };\n return this.execute(api_internal_contract_js_1.VerbId.ActivateSheet, parameters).then(() => {\n return;\n });\n }\n getCustomViewsAsync() {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCustomViewsAsync',\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetCustomViews, parameters).then((response) => {\n const customViews = response.result;\n return customViews.map((customView) => {\n return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId);\n });\n });\n }\n showCustomViewAsync(customViewName) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'showCustomViewAsync',\n [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName || '', // a falsey value means \"show original view\"\n };\n return this.execute(api_internal_contract_js_1.VerbId.ShowCustomView, parameters).then((response) => {\n const customView = response.result;\n return (customView === null || customView === void 0 ? void 0 : customView.luid) ? new CustomViewImpl_1.CustomViewImpl(customView, this._registryId) : undefined;\n });\n }\n removeCustomViewAsync(customViewName) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'removeCustomViewAsync',\n [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName,\n };\n return this.execute(api_internal_contract_js_1.VerbId.RemoveCustomView, parameters).then((response) => {\n const customView = response.result;\n return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId);\n });\n }\n saveCustomViewAsync(customViewName) {\n // CustomViewIsDefault is a required parameter, but our API has not been updated to allow it to be specified yet.\n // We should add a 'default' parameter to the interface.\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveCustomViewAsync',\n [api_internal_contract_js_1.ParameterId.CustomViewName]: customViewName,\n [api_internal_contract_js_1.ParameterId.CustomViewIsDefault]: false,\n };\n return this.execute(api_internal_contract_js_1.VerbId.SaveWorkbookAsCustomView, parameters).then((response) => {\n const customView = response.result;\n return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId);\n });\n }\n setActiveCustomViewAsDefaultAsync() {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'setActiveCustomViewAsDefaultAsync',\n };\n return this.execute(api_internal_contract_js_1.VerbId.SetActiveCustomViewAsDefault, parameters).then(() => {\n return;\n });\n }\n saveAsync(customView) {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'saveAsync',\n [api_internal_contract_js_1.ParameterId.CustomViewLuid]: customView.luid,\n [api_internal_contract_js_1.ParameterId.CustomViewName]: customView.name,\n [api_internal_contract_js_1.ParameterId.CustomViewIsDefault]: customView.isDefault,\n [api_internal_contract_js_1.ParameterId.CustomViewIsPublic]: customView.shared,\n };\n return this.execute(api_internal_contract_js_1.VerbId.UpdateCustomView, parameters).then((response) => {\n const customView = response.result;\n return new CustomViewImpl_1.CustomViewImpl(customView, this._registryId);\n });\n }\n getCurrentSrcAsync() {\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCurrentSrcAsync',\n };\n return this.execute(api_internal_contract_js_1.VerbId.GetCurrentSrc, parameters).then((response) => response.result);\n }\n}\nexports.VizServiceImpl = VizServiceImpl;\n//# sourceMappingURL=VizServiceImpl.js.map","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ExportServiceImpl = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ExternalToInternalEnumMappings_1 = require(\"../../EnumMappings/ExternalToInternalEnumMappings\");\nconst TableauError_1 = require(\"../../TableauError\");\nconst ErrorHelpers_1 = require(\"../../Utils/ErrorHelpers\");\nconst ExportHelpers_1 = require(\"../../Utils/ExportHelpers\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass ExportServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"export-service\" /* ServiceNames.Export */;\n }\n getExportCrosstabSheetMapAsync(currentSheetType) {\n const verb = api_internal_contract_js_1.VerbId.GetExportCrosstabSheetMap;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getExportCrosstabSheetMapAsync',\n [api_internal_contract_js_1.ParameterId.CurrentSheetType]: ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings.sheetType.convert(currentSheetType),\n };\n return this.execute(verb, parameters).then((response) => {\n const result = response.result;\n return result;\n });\n }\n exportCrosstabAsync(sheetName, format, exportableWorksheetNames, currentSheetType) {\n return __awaiter(this, void 0, void 0, function* () {\n ErrorHelpers_1.ErrorHelpers.verifySheetName(exportableWorksheetNames, sheetName);\n ErrorHelpers_1.ErrorHelpers.verifyEnumValue(format, api_external_contract_js_1.CrosstabFileFormat, 'CrosstabFileFormat');\n // The pres layer command for exporting Crosstab uses SimpleSheetIdentifiers instead of sheet names.\n // The extensions-and-embedding-api current does not store references to the SimpleSheetIdentifiers of its sheets\n // so we call a pres layer command that gives us the SimpleSheetIdentifier for each sheet name that appears in the\n // export Crosstab dialog popup.\n const sheetNameToIdMap = yield this.getExportCrosstabSheetMapAsync(currentSheetType);\n if (!sheetNameToIdMap[sheetName]) {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'missing sheet doc id from sheetMap');\n }\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportCrosstabAsync',\n [api_internal_contract_js_1.ParameterId.SheetIdentifier]: sheetNameToIdMap[sheetName],\n [api_internal_contract_js_1.ParameterId.SendNotifications]: true, // send notification on pres layer that triggers file download\n };\n // pres layer command invoked depends on the crosstab file format\n let verb;\n switch (format) {\n case api_external_contract_js_1.CrosstabFileFormat.CSV:\n verb = api_internal_contract_js_1.VerbId.ExportCrosstabCsvDownload;\n // CSV only parameter: see browser-clients/export-crosstab-options-dialog repo\n parameters[api_internal_contract_js_1.ParameterId.UseTabDelimiters] = true;\n break;\n case api_external_contract_js_1.CrosstabFileFormat.Excel:\n verb = api_internal_contract_js_1.VerbId.ExportCrosstabExcelDownload;\n break;\n default:\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.InternalError, 'unsupported Crosstab file format.');\n }\n return this.execute(verb, parameters)\n .then((response) => {\n const result = response.result;\n return result;\n })\n .catch(() => {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.CrosstabCreationError, 'An unexpected error occurred while generating the document.');\n });\n });\n }\n exportDataAsync(visualId, options) {\n var _a;\n ErrorHelpers_1.ErrorHelpers.verifyExportDataOptions(options);\n // Remove any duplicates from the input array\n const columnsAsSet = new Set(options.columnsToIncludeById);\n const columnsToIncludeById = Array.from(columnsAsSet);\n const verb = api_internal_contract_js_1.VerbId.ExportDataDownload;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportDataAsync',\n [api_internal_contract_js_1.ParameterId.VisualId]: visualId,\n [api_internal_contract_js_1.ParameterId.IgnoreAliases]: (_a = options.ignoreAliases) !== null && _a !== void 0 ? _a : false,\n [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: columnsToIncludeById,\n };\n return this.execute(verb, parameters)\n .then(() => { })\n .catch(() => {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.DataCreationError, 'An unexpected error occurred while generating the document.');\n });\n }\n exportPowerPointAsync(sheetNames, exportScenarios) {\n ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios);\n // Note: the ExportOriginUrl param is listed as optional for the pres layer command we are invoking; however,\n // recent changes were made that enforced the use of the empty string when invoking this command with no ExportOriginUrl.\n // see browser-clients/export-powerpoint-options-dialog repo.\n const verb = api_internal_contract_js_1.VerbId.ExportPowerpointDownload;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportPowerPointAsync',\n [api_internal_contract_js_1.ParameterId.ExportOriginUrl]: '',\n [api_internal_contract_js_1.ParameterId.SelectedSheetNames]: sheetNames,\n };\n return this.execute(verb, parameters)\n .then((response) => {\n const result = response.result;\n return result;\n })\n .catch(() => {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.PowerPointCreationError, 'An error occured while attempting to generate the PowerPoint file.');\n });\n }\n exportPDFAsync(sheetNames, externalExportPdfOptions, exportScenarios) {\n return __awaiter(this, void 0, void 0, function* () {\n ErrorHelpers_1.ErrorHelpers.verifyExportPDFOptions(externalExportPdfOptions);\n ErrorHelpers_1.ErrorHelpers.verifySheetNamesForPDFAndPPT(sheetNames, exportScenarios);\n const internalExportPdfOptions = yield this.getExportPDFOptionsAsync();\n ExportHelpers_1.ExportHelpers.updateInternalExportPDFOptions(internalExportPdfOptions, externalExportPdfOptions, sheetNames);\n const verb = api_internal_contract_js_1.VerbId.ExportPdfDownload;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'exportPDFAsync',\n [api_internal_contract_js_1.ParameterId.ExportPdfOptions]: internalExportPdfOptions,\n };\n return this.execute(verb, parameters)\n .then((response) => {\n const result = response.result;\n return result;\n })\n .catch(() => {\n throw new TableauError_1.TableauError(api_external_contract_js_1.SharedErrorCodes.PDFCreationError, 'Unable to create PDF because something went wrong. Try again.');\n });\n });\n }\n getExportPDFOptionsAsync() {\n const verb = api_internal_contract_js_1.VerbId.GetExportPdfOptions;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'getExportPdfOptionsAsync',\n };\n return this.execute(verb, parameters).then((response) => {\n const result = response.result;\n return result;\n });\n }\n reportExtensionRenderComplete(mediaBlob) {\n const params = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: api_internal_contract_js_1.VerbId.ReportExtensionRenderComplete,\n [api_internal_contract_js_1.ParameterId.HasExtensionRenderingTimedOut]: false,\n };\n if (mediaBlob) {\n params[api_internal_contract_js_1.ParameterId.ExtensionMediaBlob] = mediaBlob;\n }\n return this.execute(api_internal_contract_js_1.VerbId.ReportExtensionRenderComplete, params).then(() => {\n return;\n });\n }\n}\nexports.ExportServiceImpl = ExportServiceImpl;\n//# sourceMappingURL=ExportServiceImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StoryImpl = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst ServiceRegistry_1 = require(\"../Services/ServiceRegistry\");\nconst TableauError_1 = require(\"../TableauError\");\nconst ErrorHelpers_1 = require(\"../Utils/ErrorHelpers\");\nconst ShortLivedDeferred_1 = require(\"../Utils/ShortLivedDeferred\");\nconst SheetImpl_1 = require(\"./SheetImpl\");\nconst StoryPointImpl_1 = require(\"./StoryPointImpl\");\nconst StoryPointInfoImpl_1 = require(\"./StoryPointInfoImpl\");\nclass StoryImpl extends SheetImpl_1.SheetImpl {\n constructor(_sheetInfoImpl, storyModel, _publishedSheetInfos, _registryId) {\n super(_sheetInfoImpl, _registryId);\n this._sheetInfoImpl = _sheetInfoImpl;\n this._publishedSheetInfos = _publishedSheetInfos;\n this._registryId = _registryId;\n this._storyPointInfoImpls = [];\n this._deferred = new ShortLivedDeferred_1.ShortLivedDeferred();\n this.initializeStory(storyModel);\n }\n initializeStory(storyModel) {\n storyModel.storyPoints.forEach((storyPointModel) => {\n const isActive = storyPointModel.index === storyModel.activeStoryPointIndex;\n const storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(storyPointModel.caption, storyPointModel.index, storyPointModel.storyPointId, isActive, storyPointModel.updated, this);\n this._storyPointInfoImpls.push(storyPointInfoImpl);\n if (isActive) {\n this._activeStoryPointImpl = new StoryPointImpl_1.StoryPointImpl(storyPointInfoImpl, this._publishedSheetInfos, this._registryId, storyPointModel.containedSheetInfo);\n }\n });\n }\n updateStoryInfo(index, storyPointModel) {\n if (!this._storyPointInfoImpls) {\n return;\n }\n let storyInfoImpl = this._storyPointInfoImpls[index];\n if (storyInfoImpl.storyPointId !== storyPointModel.storyPointId) {\n 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}`);\n }\n storyInfoImpl.caption = storyPointModel.caption;\n storyInfoImpl.updated = storyPointModel.updated;\n if (this._activeStoryPointImpl.storyPointId === storyPointModel.storyPointId) {\n this._activeStoryPointImpl.updated = storyInfoImpl.updated;\n }\n }\n updateStory(storyPointModel) {\n if (!this._storyPointInfoImpls) {\n return;\n }\n this._storyPointInfoImpls.forEach((storyPointInfoImpl) => {\n const isActive = storyPointInfoImpl.storyPointId === storyPointModel.storyPointId;\n if (isActive) {\n // update the state\n storyPointInfoImpl.caption = storyPointModel.caption;\n storyPointInfoImpl.index = storyPointModel.index;\n storyPointInfoImpl.active = true;\n storyPointInfoImpl.updated = storyPointModel.updated;\n // re-initialize activeStoryPointImpl\n this._activeStoryPointImpl = new StoryPointImpl_1.StoryPointImpl(storyPointInfoImpl, this._publishedSheetInfos, this._registryId, storyPointModel.containedSheetInfo);\n }\n else {\n // set old ones to false\n storyPointInfoImpl.active = false;\n }\n });\n if (this.activeStoryPoint) {\n this._deferred.resolve(this.activeStoryPoint);\n }\n }\n get activeStoryPoint() {\n return this._activeStoryPointImpl;\n }\n get storyPointsInfo() {\n return this._storyPointInfoImpls;\n }\n get isActive() {\n return this._sheetInfoImpl.active;\n }\n get isHidden() {\n return !!this._sheetInfoImpl.isHidden;\n }\n activateNextStoryPointAsync() {\n if (this._activeStoryPointImpl.index === this._storyPointInfoImpls.length - 1) {\n return Promise.resolve(this._activeStoryPointImpl);\n }\n let promise = this._deferred.getNewPromiseOrThrowIfBusy();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"story-activation-service\" /* ServiceNames.StoryActivation */);\n service.activateNextStoryPointAsync();\n return promise;\n }\n activatePreviousStoryPointAsync() {\n if (this._activeStoryPointImpl.index === 0) {\n return Promise.resolve(this._activeStoryPointImpl);\n }\n let promise = this._deferred.getNewPromiseOrThrowIfBusy();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"story-activation-service\" /* ServiceNames.StoryActivation */);\n service.activatePreviousStoryPointAsync();\n return promise;\n }\n activateStoryPointAsync(index) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(index, 'index');\n ErrorHelpers_1.ErrorHelpers.verifyParameterType(index, 'number', 'index');\n if (index < 0 || index >= this._storyPointInfoImpls.length) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.IndexOutOfRange, 'The index passed to this command is out of range.');\n }\n if (index === this._activeStoryPointImpl.index) {\n return Promise.resolve(this._activeStoryPointImpl);\n }\n let promise = this._deferred.getNewPromiseOrThrowIfBusy();\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"story-activation-service\" /* ServiceNames.StoryActivation */);\n service.activateStoryPointAsync(index);\n return promise;\n }\n revertStoryPointAsync(index) {\n ErrorHelpers_1.ErrorHelpers.verifyParameter(index, 'index');\n ErrorHelpers_1.ErrorHelpers.verifyParameterType(index, 'number', 'index');\n if (index < 0 || index >= this._storyPointInfoImpls.length) {\n throw new TableauError_1.TableauError(Contract.EmbeddingErrorCodes.IndexOutOfRange, 'The index passed to this command is out of range.');\n }\n const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService(\"story-activation-service\" /* ServiceNames.StoryActivation */);\n return service.revertStoryPointAsync(index).then((response) => {\n this.updateStoryInfo(response.index, response);\n const storyPointInfoImpl = new StoryPointInfoImpl_1.StoryPointInfoImpl(response.caption, response.index, response.storyPointId, false, response.updated, this);\n return storyPointInfoImpl;\n });\n }\n clearPendingPromises() {\n if (this._deferred) {\n this._deferred.reject('All pending promises cleared');\n }\n }\n}\nexports.StoryImpl = StoryImpl;\n//# sourceMappingURL=StoryImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Worksheet = void 0;\nconst Contract = require(\"@tableau/api-external-contract-js\");\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\nconst FilterChangedEvent_1 = require(\"../Events/FilterChangedEvent\");\nconst MarksSelectedEvent_1 = require(\"../Events/MarksSelectedEvent\");\nconst SummaryDataChangedEvent_1 = require(\"../Events/SummaryDataChangedEvent\");\nconst WorksheetFormattingChangedEvent_1 = require(\"../Events/WorksheetFormattingChangedEvent\");\nconst ServiceRegistryUtil_1 = require(\"../Services/ServiceRegistryUtil\");\nconst Dashboard_1 = require(\"./Dashboard\");\nconst Sheet_1 = require(\"./Sheet\");\nclass Worksheet extends Sheet_1.Sheet {\n constructor(_worksheetImpl) {\n super(_worksheetImpl);\n this._worksheetImpl = _worksheetImpl;\n // Call to initialize events and then call down to the event listener manager to handle things\n this.initializeEvents().forEach((e) => this.addNewEventType(e));\n }\n get parentDashboard() {\n // This should never happen for Extensions if the DashboardImpls are created correctly\n if (this._worksheetImpl.parentDashboard == null) {\n throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Parent dashboard not implemented`);\n }\n return new Dashboard_1.Dashboard(this._worksheetImpl.parentDashboard);\n }\n get backgroundColor() {\n if (this._worksheetImpl.backgroundColor == null) {\n throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Worksheet background color is not available`);\n }\n return this._worksheetImpl.backgroundColor;\n }\n get formatting() {\n if (this._worksheetImpl.formatting == null) {\n throw new api_shared_js_1.TableauError(Contract.SharedErrorCodes.ImplementationError, `Worksheet formatting information is not available`);\n }\n return this._worksheetImpl.formatting;\n }\n /**\n * Helper method which goes through and registers each event type this impl knows about\n * with the NotificationService. It returns an array of SingleEventManager objects which\n * can then be passed to an EventListenerManager to handle user registration / unregistration.\n *\n * @param {Worksheet} worksheet The worksheet object which will be included with the event notifications\n * @returns {Array} Collection of event managers to pass to an EventListenerManager\n */\n initializeEvents() {\n const results = new Array();\n let notificationService;\n try {\n notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService(\"notification-service\" /* ServiceNames.Notification */);\n }\n catch (e) {\n // If we don't have this service registered, just return\n return results;\n }\n // Initialize all of the event managers we'll need (one for each event type)\n const marksEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.MarkSelectionChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SelectedMarksChanged, (model) => {\n const visualId = model;\n return this.visualIdsAreEqual(visualId, this._worksheetImpl.visualId);\n }, () => marksEvent.triggerEvent(() => new MarksSelectedEvent_1.MarksSelectedEvent(this)));\n const filterEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.FilterChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.FilterChanged, (model) => {\n const filterEventResponse = model;\n return this._worksheetImpl.visualId.worksheet === filterEventResponse.visualId.worksheet;\n }, (event) => {\n filterEvent.triggerEvent(() => new FilterChangedEvent_1.FilterChangedEvent(this, event.fieldName, event.fieldId));\n });\n const summaryDataEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.SummaryDataChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.SummaryDataChanged, (model) => {\n const summaryDataEventResponse = model;\n return this._worksheetImpl.visualId.worksheet === summaryDataEventResponse.visualId.worksheet;\n }, (event) => {\n summaryDataEvent.triggerEvent(() => new SummaryDataChangedEvent_1.SummaryDataChangedEvent(this));\n });\n const worksheetFormattingChangedEvent = new api_shared_js_1.SingleEventManagerImpl(api_external_contract_js_1.TableauEventType.WorksheetFormattingChanged);\n notificationService.registerHandler(api_internal_contract_js_1.NotificationId.WorksheetFormattingChanged, (model) => {\n const worksheetFormattingChangedEvent = model;\n return this._worksheetImpl.visualId.worksheet === worksheetFormattingChangedEvent.visualId.worksheet;\n }, (eventFormatting) => {\n worksheetFormattingChangedEvent.triggerEvent(() => new WorksheetFormattingChangedEvent_1.WorksheetFormattingChangedEvent(this, eventFormatting));\n });\n results.push(marksEvent);\n results.push(filterEvent);\n results.push(summaryDataEvent);\n results.push(worksheetFormattingChangedEvent);\n return results;\n }\n applyFilterAsync(fieldName, values, updateType, options) {\n return this._worksheetImpl.applyFilterAsync(fieldName, values, updateType, options);\n }\n applyRangeFilterAsync(fieldName, filterOptions) {\n return this._worksheetImpl.applyRangeFilterAsync(fieldName, filterOptions);\n }\n applyHierarchicalFilterAsync(fieldName, values, updateType, options) {\n return this._worksheetImpl.applyHierarchicalFilterAsync(fieldName, values, updateType, options);\n }\n applyRelativeDateFilterAsync(fieldName, options) {\n return this._worksheetImpl.applyRelativeDateFilterAsync(fieldName, options);\n }\n clearFilterAsync(fieldName) {\n return this._worksheetImpl.clearFilterAsync(fieldName);\n }\n getDataSourcesAsync() {\n return this._worksheetImpl.getDataSourcesAsync();\n }\n getFiltersAsync() {\n return this._worksheetImpl.getFiltersAsync();\n }\n getSelectedMarksAsync() {\n return this._worksheetImpl.getSelectedMarksAsync();\n }\n getHighlightedMarksAsync() {\n return this._worksheetImpl.getHighlightedMarksAsync();\n }\n getSummaryDataAsync(options) {\n return this._worksheetImpl.getSummaryDataAsync(options);\n }\n getSummaryDataReaderAsync(pageRowCount, options) {\n return this._worksheetImpl.getSummaryDataReaderAsync(pageRowCount, options);\n }\n getSummaryColumnsInfoAsync() {\n return this._worksheetImpl.getSummaryColumnsInfoAsync();\n }\n getUnderlyingDataAsync(options) {\n console.warn('Worksheet.getUnderlyingDataAsync is deprecated. Please use ' +\n 'Worksheet.getUnderlyingTablesAsync and Worksheet.getUnderlyingTableDataAsync');\n return this._worksheetImpl.getUnderlyingDataAsync(options);\n }\n getUnderlyingTablesAsync() {\n return this._worksheetImpl.getUnderlyingTablesAsync();\n }\n getUnderlyingTableDataAsync(logicalTableId, options) {\n return this._worksheetImpl.getUnderlyingTableDataAsync(logicalTableId, options);\n }\n getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options) {\n return this._worksheetImpl.getUnderlyingTableDataReaderAsync(logicalTableId, pageRowCount, options);\n }\n getVisualSpecificationAsync() {\n return this._worksheetImpl.getVisualSpecificationAsync();\n }\n addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex) {\n return this._worksheetImpl.addMarksCardFieldsAsync(marksCardIndex, encodingType, columns, startIndex);\n }\n moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount = 1) {\n return this._worksheetImpl.moveMarksCardFieldAsync(marksCardIndex, fromIndex, toIndex, fieldCount);\n }\n spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns) {\n return this._worksheetImpl.spliceMarksCardFieldsAsync(marksCardIndex, encodingType, startIndex, deleteCount, columns);\n }\n clearSelectedMarksAsync() {\n return this._worksheetImpl.clearSelectedMarksAsync();\n }\n selectMarksByIDAsync(marksInfo, updateType) {\n return this._worksheetImpl.selectMarksByIdAsync(marksInfo, updateType);\n }\n selectMarksByValueAsync(selections, selectionUpdateType) {\n return this._worksheetImpl.selectMarksByValueAsync(selections, selectionUpdateType);\n }\n selectMarksByIdAsync(selections, selectionUpdateType) {\n return this._worksheetImpl.selectMarksByIdAsync(selections, selectionUpdateType);\n }\n annotateMarkAsync(mark, annotationText) {\n return this._worksheetImpl.annotateMarkAsync(mark, annotationText);\n }\n getAnnotationsAsync() {\n return this._worksheetImpl.getAnnotationsAsync();\n }\n removeAnnotationAsync(annotation) {\n return this._worksheetImpl.removeAnnotationAsync(annotation);\n }\n hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions = true) {\n return this._worksheetImpl.hoverTupleAsync(hoveredTuple, tooltip, allowHoverActions);\n }\n selectTuplesAsync(selectedTuples, selectOption, tooltip) {\n return this._worksheetImpl.selectTuplesAsync(selectedTuples, selectOption, tooltip);\n }\n getTooltipTextAsync(tupleId) {\n return this._worksheetImpl.getTooltipTextAsync(tupleId);\n }\n leaveMarkNavigationAsync() {\n return this._worksheetImpl.leaveMarkNavigationAsync();\n }\n editAliasesDialogAsync(fieldName) {\n return this._worksheetImpl.editAliasesDialogAsync(fieldName);\n }\n visualIdsAreEqual(a, b) {\n return (a &&\n b &&\n a.worksheet === b.worksheet &&\n a.dashboard === b.dashboard &&\n a.storyboard === b.storyboard &&\n a.storyPointID === b.storyPointID);\n }\n}\nexports.Worksheet = Worksheet;\n//# sourceMappingURL=Worksheet.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.VersionedExternalApiDispatcher = void 0;\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\n/**\n * Implementation of the InternalApiDispatcher which supports upgrading and downgrading the input\n * internal contract to the version that this module is built against\n *\n * @class VersionedExternalApiDispatcher\n * @implements {InternalApiDispatcher}\n */\nclass VersionedExternalApiDispatcher {\n /**\n * Creates a new instance of the VersionedExternalApiDispatcher\n * We have multiple version converting dispatchers that work together.\n * If needed, the VersionedExternalApiDispatcher wraps either the InternalApiDispatcher (desktop)\n * or the CrossFrameDispatcher (server).\n * The Internal/CrossFrame dispatchers handle an updated platform with an older external library.\n * (The CrossFrameDispatcher sends messages across the frame, and it is handled by the PresLayerHandler.)\n * Meanwhile, the VersionedExternalApiDispatcher handles an updated external library with an older platform.\n \n * @param _apiDelegateDispatcher The delegate that does the actual work.\n * @param platformVersionNumber The version of the internal contract which the platform module is using.\n * This number will be used to figure out how to downgrade incoming commands and upgrade the results\n */\n constructor(_apiDelegateDispatcher, platformVersionNumber) {\n this._apiDelegateDispatcher = _apiDelegateDispatcher;\n this._versionConverter = (0, api_internal_contract_js_1.CreateExternalCompatibleVersionConverter)(api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION, platformVersionNumber);\n this._notificationHandlers = [];\n _apiDelegateDispatcher.registerNotificationHandler((notification) => {\n if (this._notificationHandlers.length === 0) {\n return;\n }\n const upgradedNotification = this._versionConverter.upgradeNotification(notification);\n this._notificationHandlers.forEach((handler) => {\n handler(upgradedNotification);\n });\n });\n }\n static needsVersionConverter(platformVersion) {\n // If our platform is less than external library version, then we need a converter\n return (0, api_internal_contract_js_1.VersionLessThan)(platformVersion, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION);\n }\n execute(verb, parameters) {\n try {\n const downgradeParameters = this._versionConverter.downgradeExecuteCall(verb, parameters);\n return this._apiDelegateDispatcher.execute(downgradeParameters.verb, downgradeParameters.parameters).then((response) => {\n const upgradeResponse = this._versionConverter.upgradeExecuteReturn(response, verb, parameters);\n return upgradeResponse;\n });\n }\n catch (e) {\n return Promise.reject(e);\n }\n }\n registerNotificationHandler(handler) {\n this._notificationHandlers.push(handler);\n }\n unregisterNotificationHandler(handler) {\n this._notificationHandlers = this._notificationHandlers.filter((h) => h !== handler);\n }\n}\nexports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher;\n//# sourceMappingURL=VersionedExternalApiDispatcher.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SheetInfoImpl = void 0;\nconst api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nclass SheetInfoImpl {\n constructor(_name, _sheetType, _sheetSize, _index, _isActive, _isHidden, _url) {\n this._name = _name;\n this._sheetType = _sheetType;\n this._sheetSize = _sheetSize;\n this._index = _index;\n this._isActive = _isActive;\n this._isHidden = _isHidden;\n this._url = _url;\n }\n get name() {\n return this._name;\n }\n set name(sheetName) {\n this._name = sheetName;\n }\n get sheetSize() {\n return this._sheetSize;\n }\n set sheetSize(value) {\n this._sheetSize = value;\n }\n get sheetType() {\n return this._sheetType;\n }\n get sheetPath() {\n return {\n sheetName: this.name,\n isDashboard: this.sheetType === api_external_contract_js_1.SheetType.Dashboard,\n // TODO - Stories\n };\n }\n get index() {\n return this._index;\n }\n get isActive() {\n return this._isActive;\n }\n set active(active) {\n this._isActive = active;\n }\n get isHidden() {\n return this._isHidden;\n }\n get url() {\n return this._url;\n }\n}\nexports.SheetInfoImpl = SheetInfoImpl;\n//# sourceMappingURL=SheetInfoImpl.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\n//# sourceMappingURL=EnvironmentInterfaces.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.StoryActivationServiceImpl = void 0;\nconst api_internal_contract_js_1 = require(\"@tableau/api-internal-contract-js\");\nconst ServiceImplBase_1 = require(\"./ServiceImplBase\");\nclass StoryActivationServiceImpl extends ServiceImplBase_1.ServiceImplBase {\n get serviceName() {\n return \"story-activation-service\" /* ServiceNames.StoryActivation */;\n }\n activateNextStoryPointAsync() {\n const verb = api_internal_contract_js_1.VerbId.ActivateNextStoryPoint;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateNextStoryPointAsync',\n };\n return this.execute(verb, parameters).then((response) => {\n return;\n });\n }\n activatePreviousStoryPointAsync() {\n const verb = api_internal_contract_js_1.VerbId.ActivatePreviousStoryPoint;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'activatePreviousStoryPointAsync',\n };\n return this.execute(verb, parameters).then((response) => {\n return;\n });\n }\n activateStoryPointAsync(index) {\n const verb = api_internal_contract_js_1.VerbId.ActivateStoryPoint;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateStoryPointAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index;\n return this.execute(verb, parameters).then((response) => {\n return;\n });\n }\n revertStoryPointAsync(index) {\n const verb = api_internal_contract_js_1.VerbId.RevertStoryPoint;\n const parameters = {\n [api_internal_contract_js_1.ParameterId.FunctionName]: 'revertStoryPointAsync',\n };\n parameters[api_internal_contract_js_1.ParameterId.StoryPointIndex] = index;\n return this.execute(verb, parameters).then((response) => {\n return response.result;\n });\n }\n}\nexports.StoryActivationServiceImpl = StoryActivationServiceImpl;\n//# sourceMappingURL=StoryActivationServiceImpl.js.map","\"use strict\";\n// This file re-exports everything which is part of the shared api public interface\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __exportStar = (this && this.__exportStar) || function(m, exports) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ZoneVisibilityType = exports.TrendLineModelType = exports.SortDirection = exports.SheetType = exports.SelectOptions = exports.SelectionUpdateType = exports.ReplaySpeedType = exports.QuickTableCalcType = exports.PeriodType = exports.ParameterValueType = exports.NumberFormatUnits = exports.NegativeNumberFormat = exports.MarkType = exports.IncludeDataValuesOption = exports.HierarchicalLevelSelectionState = exports.FilterUpdateType = exports.FilterType = exports.FilterNullOption = exports.FilterDomainType = exports.FieldRoleType = exports.FieldAggregationType = exports.EncodingType = exports.DialogStyle = exports.DateRangeType = exports.DataType = exports.DataFormatType = exports.DashboardObjectVisibilityType = exports.DashboardObjectType = exports.DashboardLayoutChange = exports.ColumnType = exports.ClassNameKey = exports.AnnotationType = exports.AnalyticsObjectType = void 0;\n__exportStar(require(\"./ExternalContract/Shared/AnnotationInterfaces\"), exports);\n__exportStar(require(\"./ExternalContract/Shared/DataSourceInterfaces\"), exports);\n__exportStar(require(\"./ExternalContract/Shared/DataTableInterfaces\"), exports);\n__exportStar(require(\"./ExternalContract/Shared/Enums\"), exports);\n__exportStar(require(\"./ExternalContract/Shared/EnvironmentInterfaces\"), exports);\n__exportStar(require(\"./ExternalContract/Shared/FilterInterfaces\"), exports);\nvar Tableau_1 = require(\"./ExternalContract/Shared/Namespaces/Tableau\");\nObject.defineProperty(exports, \"AnalyticsObjectType\", { enumerable: true, get: function () { return Tableau_1.AnalyticsObjectType; } });\nObject.defineProperty(exports, \"AnnotationType\", { enumerable: true, get: function () { return Tableau_1.AnnotationType; } });\nObject.defineProperty(exports, \"ClassNameKey\", { enumerable: true, get: function () { return Tableau_1.ClassNameKey; } });\nObject.defineProperty(exports, \"ColumnType\", { enumerable: true, get: function () { return Tableau_1.ColumnType; } });\nObject.defineProperty(exports, \"DashboardLayoutChange\", { enumerable: true, get: function () { return Tableau_1.DashboardLayoutChange; } });\nObject.defineProperty(exports, \"DashboardObjectType\", { enumerable: true, get: function () { return Tableau_1.DashboardObjectType; } });\nObject.defineProperty(exports, \"DashboardObjectVisibilityType\", { enumerable: true, get: function () { return Tableau_1.DashboardObjectVisibilityType; } });\nObject.defineProperty(exports, \"DataFormatType\", { enumerable: true, get: function () { return Tableau_1.DataFormatType; } });\nObject.defineProperty(exports, \"DataType\", { enumerable: true, get: function () { return Tableau_1.DataType; } });\nObject.defineProperty(exports, \"DateRangeType\", { enumerable: true, get: function () { return Tableau_1.DateRangeType; } });\nObject.defineProperty(exports, \"DialogStyle\", { enumerable: true, get: function () { return Tableau_1.DialogStyle; } });\nObject.defineProperty(exports, \"EncodingType\", { enumerable: true, get: function () { return Tableau_1.EncodingType; } });\nObject.defineProperty(exports, \"FieldAggregationType\", { enumerable: true, get: function () { return Tableau_1.FieldAggregationType; } });\nObject.defineProperty(exports, \"FieldRoleType\", { enumerable: true, get: function () { return Tableau_1.FieldRoleType; } });\nObject.defineProperty(exports, \"FilterDomainType\", { enumerable: true, get: function () { return Tableau_1.FilterDomainType; } });\nObject.defineProperty(exports, \"FilterNullOption\", { enumerable: true, get: function () { return Tableau_1.FilterNullOption; } });\nObject.defineProperty(exports, \"FilterType\", { enumerable: true, get: function () { return Tableau_1.FilterType; } });\nObject.defineProperty(exports, \"FilterUpdateType\", { enumerable: true, get: function () { return Tableau_1.FilterUpdateType; } });\nObject.defineProperty(exports, \"HierarchicalLevelSelectionState\", { enumerable: true, get: function () { return Tableau_1.HierarchicalLevelSelectionState; } });\nObject.defineProperty(exports, \"IncludeDataValuesOption\", { enumerable: true, get: function () { return Tableau_1.IncludeDataValuesOption; } });\nObject.defineProperty(exports, \"MarkType\", { enumerable: true, get: function () { return Tableau_1.MarkType; } });\nObject.defineProperty(exports, \"NegativeNumberFormat\", { enumerable: true, get: function () { return Tableau_1.NegativeNumberFormat; } });\nObject.defineProperty(exports, \"NumberFormatUnits\", { enumerable: true, get: function () { return Tableau_1.NumberFormatUnits; } });\nObject.defineProperty(exports, \"ParameterValueType\", { enumerable: true, get: function () { return Tableau_1.ParameterValueType; } });\nObject.defineProperty(exports, \"PeriodType\", { enumerable: true, get: function () { return Tableau_1.PeriodType; } });\nObject.defineProperty(exports, \"QuickTableCalcType\", { enumerable: true, get: function () { return Tableau_1.QuickTableCalcType; } });\nObject.defineProperty(exports, \"ReplaySpeedType\", { enumerable: true, get: function () { return Tableau_1.ReplaySpeedType; } });\nObject.defineProperty(exports, \"SelectionUpdateType\", { enumerable: true, get: function () { return Tableau_1.SelectionUpdateType; } });\nObject.defineProperty(exports, \"SelectOptions\", { enumerable: true, get: function () { return Tableau_1.SelectOptions; } });\nObject.defineProperty(exports, \"SheetType\", { enumerable: true, get: function () { return Tableau_1.SheetType; } });\nObject.defineProperty(exports, \"SortDirection\", { enumerable: true, get: function () { return Tableau_1.SortDirection; } });\nObject.defineProperty(exports, \"TrendLineModelType\", { enumerable: true, get: function () { return Tableau_1.TrendLineModelType; } });\nObject.defineProperty(exports, \"ZoneVisibilityType\", { enumerable: true, get: function () { return Tableau_1.ZoneVisibilityType; } });\n__exportStar(require(\"./ExternalContract/Shared/SelectionInterfaces\"), exports);\n__exportStar(require(\"./ExternalContract/Shared/SheetInterfaces\"), exports);\n__exportStar(require(\"./ExternalContract/Shared/VisualModelInterface\"), exports);\n__exportStar(require(\"./ExternalContract/Shared/WorkbookFormattingInterfaces\"), exports);\n//# sourceMappingURL=SharedApiExternalContract.js.map","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.NegativeNumberFormat = exports.NumberFormatUnits = exports.DataFormatType = exports.PulseErrorMessageVisibility = exports.PulseTimeDimension = exports.EncodingType = exports.FitPages = exports.PageScalingOption = exports.ScaleMode = exports.PageOrientation = exports.PageSizeOption = exports.ApiShowDataTableFormat = exports.ExtensionDialogResult = exports.DateRangeType = exports.FilterType = exports.MarkType = exports.HierarchicalLevelSelectionState = exports.QuantitativeIncludedValues = exports.SelectOptions = exports.SelectionUpdateType = exports.FilterDomainType = exports.FilterNullOption = exports.DateStepPeriod = exports.DomainRestrictionType = exports.SheetType = exports.FilterUpdateType = exports.FieldRoleType = exports.FieldAggregationType = exports.ErrorCodes = exports.EncodedDataType = exports.DialogStyle = exports.DataType = exports.DashboardObjectType = exports.ColumnType = exports.AnnotateEnum = exports.ExportedMediaType = exports.ExtensionMode = exports.ExtensionContext = void 0;\nvar ExtensionContext;\n(function (ExtensionContext) {\n ExtensionContext[\"Desktop\"] = \"desktop\";\n ExtensionContext[\"Server\"] = \"server\";\n ExtensionContext[\"Unknown\"] = \"unknown\";\n ExtensionContext[\"Cloud\"] = \"cloud\";\n ExtensionContext[\"PublicWeb\"] = \"public-web\";\n ExtensionContext[\"PublicDesktop\"] = \"public-desktop\";\n})(ExtensionContext || (exports.ExtensionContext = ExtensionContext = {}));\nvar ExtensionMode;\n(function (ExtensionMode) {\n ExtensionMode[\"Authoring\"] = \"authoring\";\n ExtensionMode[\"Viewing\"] = \"viewing\";\n ExtensionMode[\"Unknown\"] = \"unknown\";\n})(ExtensionMode || (exports.ExtensionMode = ExtensionMode = {}));\nvar ExportedMediaType;\n(function (ExportedMediaType) {\n ExportedMediaType[\"Image\"] = \"image\";\n ExportedMediaType[\"Pdf\"] = \"pdf\";\n ExportedMediaType[\"Svg\"] = \"svg\";\n ExportedMediaType[\"Html\"] = \"html\";\n ExportedMediaType[\"PowerPoint\"] = \"powerpoint\";\n ExportedMediaType[\"Excel\"] = \"excel\";\n})(ExportedMediaType || (exports.ExportedMediaType = ExportedMediaType = {}));\nvar AnnotateEnum;\n(function (AnnotateEnum) {\n AnnotateEnum[\"Mark\"] = \"mark\";\n AnnotateEnum[\"Point\"] = \"point\";\n AnnotateEnum[\"Area\"] = \"area\";\n})(AnnotateEnum || (exports.AnnotateEnum = AnnotateEnum = {}));\nvar ColumnType;\n(function (ColumnType) {\n ColumnType[\"Discrete\"] = \"discrete\";\n ColumnType[\"Continuous\"] = \"continuous\";\n ColumnType[\"Unknown\"] = \"unknown\";\n})(ColumnType || (exports.ColumnType = ColumnType = {}));\nvar DashboardObjectType;\n(function (DashboardObjectType) {\n DashboardObjectType[\"Blank\"] = \"blank\";\n DashboardObjectType[\"Worksheet\"] = \"worksheet\";\n DashboardObjectType[\"QuickFilter\"] = \"quick-filter\";\n DashboardObjectType[\"ParameterControl\"] = \"parameter-control\";\n DashboardObjectType[\"PageFilter\"] = \"page-filter\";\n DashboardObjectType[\"Legend\"] = \"legend\";\n DashboardObjectType[\"Title\"] = \"title\";\n DashboardObjectType[\"Text\"] = \"text\";\n DashboardObjectType[\"Image\"] = \"image\";\n DashboardObjectType[\"WebPage\"] = \"web-page\";\n DashboardObjectType[\"Extension\"] = \"extension\";\n})(DashboardObjectType || (exports.DashboardObjectType = DashboardObjectType = {}));\nvar DataType;\n(function (DataType) {\n DataType[\"String\"] = \"string\";\n DataType[\"Int\"] = \"int\";\n DataType[\"Float\"] = \"float\";\n DataType[\"Bool\"] = \"bool\";\n DataType[\"Date\"] = \"date\";\n DataType[\"DateTime\"] = \"date-time\";\n DataType[\"Spatial\"] = \"spatial\";\n DataType[\"Unknown\"] = \"unknown\";\n})(DataType || (exports.DataType = DataType = {}));\nvar DialogStyle;\n(function (DialogStyle) {\n DialogStyle[\"Window\"] = \"window\";\n DialogStyle[\"Modal\"] = \"modal\";\n DialogStyle[\"Modeless\"] = \"modeless\";\n})(DialogStyle || (exports.DialogStyle = DialogStyle = {}));\nvar EncodedDataType;\n(function (EncodedDataType) {\n EncodedDataType[\"Number\"] = \"number\";\n EncodedDataType[\"String\"] = \"string\";\n EncodedDataType[\"Date\"] = \"date\";\n EncodedDataType[\"Boolean\"] = \"boolean\";\n})(EncodedDataType || (exports.EncodedDataType = EncodedDataType = {}));\nvar ErrorCodes;\n(function (ErrorCodes) {\n ErrorCodes[\"INITIALIZATION_ERROR\"] = \"initialization-error\";\n ErrorCodes[\"INTERNAL_ERROR\"] = \"internal-error\";\n ErrorCodes[\"MISSING_ENUM_MAPPING\"] = \"missing-enum-mapping\";\n ErrorCodes[\"MISSING_PARAMETER\"] = \"missing-parameter\";\n ErrorCodes[\"PERMISSION_DENIED\"] = \"permission-denied\";\n ErrorCodes[\"PRES_MODEL_PARSING_ERROR\"] = \"pres-model-parsing-error\";\n ErrorCodes[\"VERSION_NOT_CONFIGURED\"] = \"version-not-configured\";\n ErrorCodes[\"VISIBILITY_ERROR\"] = \"visibility-error\";\n ErrorCodes[\"UNKNOWN_VERB_ID\"] = \"unknown-verb-id\";\n})(ErrorCodes || (exports.ErrorCodes = ErrorCodes = {}));\nvar FieldAggregationType;\n(function (FieldAggregationType) {\n FieldAggregationType[\"Sum\"] = \"sum\";\n FieldAggregationType[\"Avg\"] = \"avg\";\n FieldAggregationType[\"Min\"] = \"min\";\n FieldAggregationType[\"Max\"] = \"max\";\n FieldAggregationType[\"Stdev\"] = \"stdev\";\n FieldAggregationType[\"Stdevp\"] = \"stdevp\";\n FieldAggregationType[\"Var\"] = \"var\";\n FieldAggregationType[\"Varp\"] = \"varp\";\n FieldAggregationType[\"Collect\"] = \"collect\";\n FieldAggregationType[\"Count\"] = \"count\";\n FieldAggregationType[\"Countd\"] = \"countd\";\n FieldAggregationType[\"Median\"] = \"median\";\n FieldAggregationType[\"Attr\"] = \"attr\";\n FieldAggregationType[\"None\"] = \"none\";\n FieldAggregationType[\"Year\"] = \"year\";\n FieldAggregationType[\"Qtr\"] = \"qtr\";\n FieldAggregationType[\"Month\"] = \"month\";\n FieldAggregationType[\"Day\"] = \"day\";\n FieldAggregationType[\"Hour\"] = \"hour\";\n FieldAggregationType[\"Minute\"] = \"minute\";\n FieldAggregationType[\"Second\"] = \"second\";\n FieldAggregationType[\"Week\"] = \"week\";\n FieldAggregationType[\"Weekday\"] = \"weekday\";\n FieldAggregationType[\"MonthYear\"] = \"month-year\";\n FieldAggregationType[\"Mdy\"] = \"mdy\";\n FieldAggregationType[\"End\"] = \"end\";\n FieldAggregationType[\"TruncYear\"] = \"trunc-year\";\n FieldAggregationType[\"TruncQtr\"] = \"trunc-qtr\";\n FieldAggregationType[\"TruncMonth\"] = \"trunc-month\";\n FieldAggregationType[\"TruncWeek\"] = \"trunc-week\";\n FieldAggregationType[\"TruncDay\"] = \"trunc-day\";\n FieldAggregationType[\"TruncHour\"] = \"trunc-hour\";\n FieldAggregationType[\"TruncMinute\"] = \"trunc-minute\";\n FieldAggregationType[\"TruncSecond\"] = \"trunc-second\";\n FieldAggregationType[\"Quart1\"] = \"quart1\";\n FieldAggregationType[\"Quart3\"] = \"quart3\";\n FieldAggregationType[\"Skewness\"] = \"skewness\";\n FieldAggregationType[\"Kurtosis\"] = \"kurtosis\";\n FieldAggregationType[\"InOut\"] = \"in-out\";\n FieldAggregationType[\"User\"] = \"user\";\n})(FieldAggregationType || (exports.FieldAggregationType = FieldAggregationType = {}));\nvar FieldRoleType;\n(function (FieldRoleType) {\n FieldRoleType[\"Dimension\"] = \"dimension\";\n FieldRoleType[\"Measure\"] = \"measure\";\n FieldRoleType[\"Unknown\"] = \"unknown\";\n})(FieldRoleType || (exports.FieldRoleType = FieldRoleType = {}));\n/**\n * The different update types for applying filter.\n */\nvar FilterUpdateType;\n(function (FilterUpdateType) {\n FilterUpdateType[\"Add\"] = \"add\";\n FilterUpdateType[\"All\"] = \"all\";\n FilterUpdateType[\"Replace\"] = \"replace\";\n FilterUpdateType[\"Remove\"] = \"remove\";\n})(FilterUpdateType || (exports.FilterUpdateType = FilterUpdateType = {}));\nvar SheetType;\n(function (SheetType) {\n SheetType[\"Dashboard\"] = \"dashboard\";\n SheetType[\"Story\"] = \"story\";\n SheetType[\"Worksheet\"] = \"worksheet\";\n})(SheetType || (exports.SheetType = SheetType = {}));\nvar DomainRestrictionType;\n(function (DomainRestrictionType) {\n DomainRestrictionType[\"All\"] = \"all\";\n DomainRestrictionType[\"List\"] = \"list\";\n DomainRestrictionType[\"Range\"] = \"range\";\n})(DomainRestrictionType || (exports.DomainRestrictionType = DomainRestrictionType = {}));\nvar DateStepPeriod;\n(function (DateStepPeriod) {\n DateStepPeriod[\"Years\"] = \"years\";\n DateStepPeriod[\"Quarters\"] = \"quarters\";\n DateStepPeriod[\"Months\"] = \"months\";\n DateStepPeriod[\"Weeks\"] = \"weeks\";\n DateStepPeriod[\"Days\"] = \"days\";\n DateStepPeriod[\"Hours\"] = \"hours\";\n DateStepPeriod[\"Minutes\"] = \"minutes\";\n DateStepPeriod[\"Seconds\"] = \"seconds\";\n DateStepPeriod[\"IsoYears\"] = \"iso-years\";\n DateStepPeriod[\"IsoQuarters\"] = \"iso-quarters\";\n DateStepPeriod[\"IsoWeeks\"] = \"iso-weeks\";\n})(DateStepPeriod || (exports.DateStepPeriod = DateStepPeriod = {}));\n/**\n * The option for specifying which values to include for filtering.\n */\nvar FilterNullOption;\n(function (FilterNullOption) {\n FilterNullOption[\"NullValues\"] = \"nullvalues\";\n FilterNullOption[\"NonNullValues\"] = \"nonnullvalues\";\n FilterNullOption[\"AllValues\"] = \"allvalues\";\n})(FilterNullOption || (exports.FilterNullOption = FilterNullOption = {}));\n/**\n * The type of filter domain\n */\nvar FilterDomainType;\n(function (FilterDomainType) {\n FilterDomainType[\"Relevant\"] = \"relevant\";\n FilterDomainType[\"Database\"] = \"database\";\n})(FilterDomainType || (exports.FilterDomainType = FilterDomainType = {}));\n/**\n * Internal enum for specifying the selection type for select marks api.\n */\nvar SelectionUpdateType;\n(function (SelectionUpdateType) {\n SelectionUpdateType[\"Replace\"] = \"select-replace\";\n SelectionUpdateType[\"Add\"] = \"select-add\";\n SelectionUpdateType[\"Remove\"] = \"select-remove\";\n})(SelectionUpdateType || (exports.SelectionUpdateType = SelectionUpdateType = {}));\n/**\n * Internal enum for specifying the select option for the select tuples api.\n */\nvar SelectOptions;\n(function (SelectOptions) {\n SelectOptions[\"Simple\"] = \"select-options-simple\";\n SelectOptions[\"Toggle\"] = \"select-options-toggle\";\n SelectOptions[\"Menu\"] = \"select-options-menu\";\n SelectOptions[\"Range\"] = \"select-options-range\";\n SelectOptions[\"Search\"] = \"select-options-search\";\n})(SelectOptions || (exports.SelectOptions = SelectOptions = {}));\n/**\n * Internal enum for specifying the included values type for range selection.\n */\nvar QuantitativeIncludedValues;\n(function (QuantitativeIncludedValues) {\n QuantitativeIncludedValues[\"IncludeNull\"] = \"include-null\";\n QuantitativeIncludedValues[\"IncludeNonNull\"] = \"include-non-null\";\n QuantitativeIncludedValues[\"IncludeAll\"] = \"include-all\";\n})(QuantitativeIncludedValues || (exports.QuantitativeIncludedValues = QuantitativeIncludedValues = {}));\n/**\n * Internal enum for specifying a hierarchical level selection state.\n */\nvar HierarchicalLevelSelectionState;\n(function (HierarchicalLevelSelectionState) {\n HierarchicalLevelSelectionState[\"AllSelected\"] = \"all-selected\";\n HierarchicalLevelSelectionState[\"NoneSelected\"] = \"none-selected\";\n HierarchicalLevelSelectionState[\"SomeSelected\"] = \"some-selected\";\n HierarchicalLevelSelectionState[\"UnknownSelected\"] = \"unknown-selected\";\n})(HierarchicalLevelSelectionState || (exports.HierarchicalLevelSelectionState = HierarchicalLevelSelectionState = {}));\n/**\n * Type of mark for a given marks card in a viz.\n */\nvar MarkType;\n(function (MarkType) {\n MarkType[\"Bar\"] = \"bar\";\n MarkType[\"Line\"] = \"line\";\n MarkType[\"Area\"] = \"area\";\n MarkType[\"Square\"] = \"square\";\n MarkType[\"Circle\"] = \"circle\";\n MarkType[\"Shape\"] = \"shape\";\n MarkType[\"Text\"] = \"text\";\n MarkType[\"Map\"] = \"map\";\n MarkType[\"Pie\"] = \"pie\";\n MarkType[\"GanttBar\"] = \"gantt-bar\";\n MarkType[\"Polygon\"] = \"polygon\";\n MarkType[\"Heatmap\"] = \"heatmap\";\n MarkType[\"VizExtension\"] = \"viz-extension\";\n})(MarkType || (exports.MarkType = MarkType = {}));\n/**\n * Internal enum for specifying the type of filter\n */\nvar FilterType;\n(function (FilterType) {\n FilterType[\"Categorical\"] = \"categorical\";\n FilterType[\"Range\"] = \"range\";\n FilterType[\"RelativeDate\"] = \"relativeDate\";\n FilterType[\"Hierarchical\"] = \"hierarchical\";\n})(FilterType || (exports.FilterType = FilterType = {}));\n/**\n * Internal enum for specifying the DateRangeType of a relative date filter\n */\nvar DateRangeType;\n(function (DateRangeType) {\n /**\n * Refers to the last day, week, month, etc. of the date period.\n */\n DateRangeType[\"Last\"] = \"last\";\n /**\n * Refers to the last N days, weeks, months, etc. of the date period.\n */\n DateRangeType[\"LastN\"] = \"lastN\";\n /**\n * Refers to the next day, week, month, etc. of the date period.\n */\n DateRangeType[\"Next\"] = \"next\";\n /**\n * Refers to the next N days, weeks, months, etc. of the date period.\n */\n DateRangeType[\"NextN\"] = \"nextN\";\n /**\n * Refers to the current day, week, month, etc. of the date period.\n */\n DateRangeType[\"Current\"] = \"current\";\n /**\n * Refers to everything up to and including the current day, week, month, etc. of the date period.\n */\n DateRangeType[\"ToDate\"] = \"toDate\";\n})(DateRangeType || (exports.DateRangeType = DateRangeType = {}));\n/**\n * Used to determine if the launching of an extension dialog succeeded or failed.\n */\nvar ExtensionDialogResult;\n(function (ExtensionDialogResult) {\n ExtensionDialogResult[\"DialogAlreadyOpen\"] = \"dialog-already-open\";\n ExtensionDialogResult[\"InvalidDomain\"] = \"invalid-domain\";\n ExtensionDialogResult[\"Success\"] = \"success\";\n})(ExtensionDialogResult || (exports.ExtensionDialogResult = ExtensionDialogResult = {}));\n/**\n * Used to optimize the getSummaryData/getUnderlyingTableData results\n * Mapped from external IncludeDataValuesOption\n */\nvar ApiShowDataTableFormat;\n(function (ApiShowDataTableFormat) {\n ApiShowDataTableFormat[\"NativeValuesOnly\"] = \"native-values-only\";\n ApiShowDataTableFormat[\"FormattedValuesOnly\"] = \"formatted-values-only\";\n ApiShowDataTableFormat[\"NativeAndFormattedValues\"] = \"native-and-formatted-values\";\n})(ApiShowDataTableFormat || (exports.ApiShowDataTableFormat = ApiShowDataTableFormat = {}));\n/**\n * Used to set page size for export layout options.\n */\nvar PageSizeOption;\n(function (PageSizeOption) {\n PageSizeOption[\"Letter\"] = \"letter\";\n PageSizeOption[\"Legal\"] = \"legal\";\n PageSizeOption[\"Note\"] = \"note\";\n PageSizeOption[\"Folio\"] = \"folio\";\n PageSizeOption[\"Tabloid\"] = \"tabloid\";\n PageSizeOption[\"Ledger\"] = \"ledger\";\n PageSizeOption[\"Statement\"] = \"statement\";\n PageSizeOption[\"Executive\"] = \"executive\";\n PageSizeOption[\"A3\"] = \"a3\";\n PageSizeOption[\"A4\"] = \"a4\";\n PageSizeOption[\"A5\"] = \"a5\";\n PageSizeOption[\"B4\"] = \"b4\";\n PageSizeOption[\"B5\"] = \"b5\";\n PageSizeOption[\"Quarto\"] = \"quarto\";\n PageSizeOption[\"Unspecified\"] = \"unspecified\";\n})(PageSizeOption || (exports.PageSizeOption = PageSizeOption = {}));\n/**\n * Used to set the page orientation mode for export layout options.\n */\nvar PageOrientation;\n(function (PageOrientation) {\n PageOrientation[\"Printer\"] = \"printer\";\n PageOrientation[\"Portrait\"] = \"portrait\";\n PageOrientation[\"Landscape\"] = \"landscape\";\n})(PageOrientation || (exports.PageOrientation = PageOrientation = {}));\n/**\n * Used to set scale mode for export layout options.\n */\nvar ScaleMode;\n(function (ScaleMode) {\n ScaleMode[\"ScaleAuto\"] = \"auto\";\n ScaleMode[\"ScalePercentage\"] = \"percent\";\n ScaleMode[\"ScaleFitPages\"] = \"fit-pages\";\n})(ScaleMode || (exports.ScaleMode = ScaleMode = {}));\n/**\n * Used by setFitAndScaleValues to scale percent values\n */\nvar PageScalingOption;\n(function (PageScalingOption) {\n PageScalingOption[\"ScalePctAuto\"] = \"auto\";\n PageScalingOption[\"ScalePct400\"] = \"pct400\";\n PageScalingOption[\"ScalePct200\"] = \"pct200\";\n PageScalingOption[\"ScalePct100\"] = \"pct100\";\n PageScalingOption[\"ScalePct90\"] = \"pct90\";\n PageScalingOption[\"ScalePct80\"] = \"pct80\";\n PageScalingOption[\"ScalePct75\"] = \"pct75\";\n PageScalingOption[\"ScalePct60\"] = \"pct60\";\n PageScalingOption[\"ScalePct50\"] = \"pct50\";\n PageScalingOption[\"ScalePct25\"] = \"pct25\";\n})(PageScalingOption || (exports.PageScalingOption = PageScalingOption = {}));\n/**\n * Used by setFitAndScaleValues to scale fit page values\n */\nvar FitPages;\n(function (FitPages) {\n FitPages[\"FitOneHigh\"] = \"fit0x1\";\n FitPages[\"FitTwoHigh\"] = \"fit0x2\";\n FitPages[\"FitOneWide\"] = \"fit1x0\";\n FitPages[\"FitTwoWide\"] = \"fit2x0\";\n})(FitPages || (exports.FitPages = FitPages = {}));\n/**\n * Used by getVisualSpecificationAsync\n */\nvar EncodingType;\n(function (EncodingType) {\n EncodingType[\"Color\"] = \"color\";\n EncodingType[\"Size\"] = \"size\";\n EncodingType[\"Label\"] = \"label\";\n EncodingType[\"Detail\"] = \"detail\";\n EncodingType[\"Tooltip\"] = \"tooltip\";\n EncodingType[\"Shape\"] = \"shape\";\n EncodingType[\"Path\"] = \"path\";\n EncodingType[\"Angle\"] = \"angle\";\n EncodingType[\"Geometry\"] = \"geometry\";\n EncodingType[\"Custom\"] = \"custom\";\n})(EncodingType || (exports.EncodingType = EncodingType = {}));\nvar PulseTimeDimension;\n(function (PulseTimeDimension) {\n PulseTimeDimension[\"Today\"] = \"Today\";\n PulseTimeDimension[\"Yesterday\"] = \"Yesterday\";\n PulseTimeDimension[\"WeekToDate\"] = \"WeekToDate\";\n PulseTimeDimension[\"LastWeek\"] = \"LastWeek\";\n PulseTimeDimension[\"MonthToDate\"] = \"MonthToDate\";\n PulseTimeDimension[\"LastMonth\"] = \"LastMonth\";\n PulseTimeDimension[\"QuarterToDate\"] = \"QuarterToDate\";\n PulseTimeDimension[\"LastQuarter\"] = \"LastQuarter\";\n PulseTimeDimension[\"YearToDate\"] = \"YearToDate\";\n PulseTimeDimension[\"LastYear\"] = \"LastYear\";\n})(PulseTimeDimension || (exports.PulseTimeDimension = PulseTimeDimension = {}));\nvar PulseErrorMessageVisibility;\n(function (PulseErrorMessageVisibility) {\n PulseErrorMessageVisibility[\"Visible\"] = \"visible\";\n PulseErrorMessageVisibility[\"Hidden\"] = \"hidden\";\n PulseErrorMessageVisibility[\"Suppressed\"] = \"suppressed\";\n})(PulseErrorMessageVisibility || (exports.PulseErrorMessageVisibility = PulseErrorMessageVisibility = {}));\nvar DataFormatType;\n(function (DataFormatType) {\n DataFormatType[\"AutoFormat\"] = \"auto-format\";\n DataFormatType[\"SystemNumber\"] = \"system-number\";\n DataFormatType[\"SystemCurrency\"] = \"system-currency\";\n DataFormatType[\"SystemLongDate\"] = \"system-long-date\";\n DataFormatType[\"SystemShortDate\"] = \"system-short-date\";\n DataFormatType[\"SystemTime\"] = \"system-time\";\n DataFormatType[\"Custom\"] = \"custom\";\n DataFormatType[\"CustomNumber\"] = \"custom-number\";\n DataFormatType[\"CustomCurrency\"] = \"custom-currency\";\n DataFormatType[\"CustomScientific\"] = \"custom-scientific\";\n DataFormatType[\"CustomPercentage\"] = \"custom-percentage\";\n})(DataFormatType || (exports.DataFormatType = DataFormatType = {}));\nvar NumberFormatUnits;\n(function (NumberFormatUnits) {\n NumberFormatUnits[\"None\"] = \"units-none\";\n NumberFormatUnits[\"Thousands\"] = \"units-thousands\";\n NumberFormatUnits[\"Millions\"] = \"units-millions\";\n NumberFormatUnits[\"BillionsEnglish\"] = \"units-billions-english\";\n NumberFormatUnits[\"BillionsStandard\"] = \"units-billions-standard\";\n})(NumberFormatUnits || (exports.NumberFormatUnits = NumberFormatUnits = {}));\nvar NegativeNumberFormat;\n(function (NegativeNumberFormat) {\n NegativeNumberFormat[\"Automatic\"] = \"automatic\";\n NegativeNumberFormat[\"Parentheses\"] = \"parentheses\";\n NegativeNumberFormat[\"OuterPrefix\"] = \"outer-prefix\";\n NegativeNumberFormat[\"OuterSuffix\"] = \"outer-suffix\";\n NegativeNumberFormat[\"InnerPrefix\"] = \"inner-prefix\";\n NegativeNumberFormat[\"InnerSuffix\"] = \"inner-suffix\";\n})(NegativeNumberFormat || (exports.NegativeNumberFormat = NegativeNumberFormat = {}));\n//# sourceMappingURL=Enums.js.map","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","\"use strict\";\n/**\n * This is your main. This is where you re-export everything you want to be publicly available.\n *\n * The build enforces that the file has the same name as the global variable that is exported.\n */\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ZoneVisibilityType = exports.VizImageSortDirectionType = exports.VizImageSizeSettingType = exports.VizImageSizeSettingAlignmentType = exports.VizImagePaletteType = exports.VizImageEncodingType = exports.TrendLineModelType = exports.TableauEventType = exports.SortDirection = exports.SheetType = exports.SelectOptions = exports.SelectionUpdateType = exports.ReplaySpeedType = exports.QuickTableCalcType = exports.PeriodType = exports.ParameterValueType = exports.MarkType = exports.IncludeDataValuesOption = exports.HierarchicalLevelSelectionState = exports.FilterUpdateType = exports.FilterType = exports.FilterNullOption = exports.FilterDomainType = exports.FieldRoleType = exports.FieldAggregationType = exports.ExtensionMode = exports.ExtensionContext = exports.ExportedMediaType = exports.ErrorCodes = exports.EncodingType = exports.DialogStyle = exports.DateRangeType = exports.DataType = exports.DashboardObjectVisibilityType = exports.DashboardObjectType = exports.DashboardLayoutChange = exports.ColumnType = exports.ClassNameKey = exports.AnnotationType = exports.AnalyticsObjectType = exports.extensions = void 0;\nconst api_shared_js_1 = require(\"@tableau/api-shared-js\");\n// Due to the way we configured webpack, we should be exporting things which will be under\n// a global variable called \"tableau\". Export everything we want to be visible under tableau\n// from this file.\nconst ExtensionsImpl_1 = require(\"./ExtensionsApi/Impl/ExtensionsImpl\");\nconst Extensions_1 = require(\"./ExtensionsApi/Namespaces/Extensions\");\nconst isAlpha = typeof VERSION_IS_ALPHA !== 'undefined' ? VERSION_IS_ALPHA : false;\napi_shared_js_1.ApiVersion.SetVersionNumber(typeof API_VERSION_NUMBER !== 'undefined' ? API_VERSION_NUMBER : '0.0.0', isAlpha);\nconst extensionImpl = new ExtensionsImpl_1.ExtensionsImpl();\nexports.extensions = new Extensions_1.Extensions(extensionImpl);\n// Export Enums\n// These show up under the tableau object. I.e. tableau.ExtensionContext.Server\nvar api_external_contract_js_1 = require(\"@tableau/api-external-contract-js\");\nObject.defineProperty(exports, \"AnalyticsObjectType\", { enumerable: true, get: function () { return api_external_contract_js_1.AnalyticsObjectType; } });\nObject.defineProperty(exports, \"AnnotationType\", { enumerable: true, get: function () { return api_external_contract_js_1.AnnotationType; } });\nObject.defineProperty(exports, \"ClassNameKey\", { enumerable: true, get: function () { return api_external_contract_js_1.ClassNameKey; } });\nObject.defineProperty(exports, \"ColumnType\", { enumerable: true, get: function () { return api_external_contract_js_1.ColumnType; } });\nObject.defineProperty(exports, \"DashboardLayoutChange\", { enumerable: true, get: function () { return api_external_contract_js_1.DashboardLayoutChange; } });\nObject.defineProperty(exports, \"DashboardObjectType\", { enumerable: true, get: function () { return api_external_contract_js_1.DashboardObjectType; } });\nObject.defineProperty(exports, \"DashboardObjectVisibilityType\", { enumerable: true, get: function () { return api_external_contract_js_1.DashboardObjectVisibilityType; } });\nObject.defineProperty(exports, \"DataType\", { enumerable: true, get: function () { return api_external_contract_js_1.DataType; } });\nObject.defineProperty(exports, \"DateRangeType\", { enumerable: true, get: function () { return api_external_contract_js_1.DateRangeType; } });\nObject.defineProperty(exports, \"DialogStyle\", { enumerable: true, get: function () { return api_external_contract_js_1.DialogStyle; } });\nObject.defineProperty(exports, \"EncodingType\", { enumerable: true, get: function () { return api_external_contract_js_1.EncodingType; } });\nObject.defineProperty(exports, \"ErrorCodes\", { enumerable: true, get: function () { return api_external_contract_js_1.ErrorCodes; } });\nObject.defineProperty(exports, \"ExportedMediaType\", { enumerable: true, get: function () { return api_external_contract_js_1.ExportedMediaType; } });\nObject.defineProperty(exports, \"ExtensionContext\", { enumerable: true, get: function () { return api_external_contract_js_1.ExtensionContext; } });\nObject.defineProperty(exports, \"ExtensionMode\", { enumerable: true, get: function () { return api_external_contract_js_1.ExtensionMode; } });\nObject.defineProperty(exports, \"FieldAggregationType\", { enumerable: true, get: function () { return api_external_contract_js_1.FieldAggregationType; } });\nObject.defineProperty(exports, \"FieldRoleType\", { enumerable: true, get: function () { return api_external_contract_js_1.FieldRoleType; } });\nObject.defineProperty(exports, \"FilterDomainType\", { enumerable: true, get: function () { return api_external_contract_js_1.FilterDomainType; } });\nObject.defineProperty(exports, \"FilterNullOption\", { enumerable: true, get: function () { return api_external_contract_js_1.FilterNullOption; } });\nObject.defineProperty(exports, \"FilterType\", { enumerable: true, get: function () { return api_external_contract_js_1.FilterType; } });\nObject.defineProperty(exports, \"FilterUpdateType\", { enumerable: true, get: function () { return api_external_contract_js_1.FilterUpdateType; } });\nObject.defineProperty(exports, \"HierarchicalLevelSelectionState\", { enumerable: true, get: function () { return api_external_contract_js_1.HierarchicalLevelSelectionState; } });\nObject.defineProperty(exports, \"IncludeDataValuesOption\", { enumerable: true, get: function () { return api_external_contract_js_1.IncludeDataValuesOption; } });\nObject.defineProperty(exports, \"MarkType\", { enumerable: true, get: function () { return api_external_contract_js_1.MarkType; } });\nObject.defineProperty(exports, \"ParameterValueType\", { enumerable: true, get: function () { return api_external_contract_js_1.ParameterValueType; } });\nObject.defineProperty(exports, \"PeriodType\", { enumerable: true, get: function () { return api_external_contract_js_1.PeriodType; } });\nObject.defineProperty(exports, \"QuickTableCalcType\", { enumerable: true, get: function () { return api_external_contract_js_1.QuickTableCalcType; } });\nObject.defineProperty(exports, \"ReplaySpeedType\", { enumerable: true, get: function () { return api_external_contract_js_1.ReplaySpeedType; } });\nObject.defineProperty(exports, \"SelectionUpdateType\", { enumerable: true, get: function () { return api_external_contract_js_1.SelectionUpdateType; } });\nObject.defineProperty(exports, \"SelectOptions\", { enumerable: true, get: function () { return api_external_contract_js_1.SelectOptions; } });\nObject.defineProperty(exports, \"SheetType\", { enumerable: true, get: function () { return api_external_contract_js_1.SheetType; } });\nObject.defineProperty(exports, \"SortDirection\", { enumerable: true, get: function () { return api_external_contract_js_1.SortDirection; } });\nObject.defineProperty(exports, \"TableauEventType\", { enumerable: true, get: function () { return api_external_contract_js_1.TableauEventType; } });\nObject.defineProperty(exports, \"TrendLineModelType\", { enumerable: true, get: function () { return api_external_contract_js_1.TrendLineModelType; } });\nObject.defineProperty(exports, \"VizImageEncodingType\", { enumerable: true, get: function () { return api_external_contract_js_1.VizImageEncodingType; } });\nObject.defineProperty(exports, \"VizImagePaletteType\", { enumerable: true, get: function () { return api_external_contract_js_1.VizImagePaletteType; } });\nObject.defineProperty(exports, \"VizImageSizeSettingAlignmentType\", { enumerable: true, get: function () { return api_external_contract_js_1.VizImageSizeSettingAlignmentType; } });\nObject.defineProperty(exports, \"VizImageSizeSettingType\", { enumerable: true, get: function () { return api_external_contract_js_1.VizImageSizeSettingType; } });\nObject.defineProperty(exports, \"VizImageSortDirectionType\", { enumerable: true, get: function () { return api_external_contract_js_1.VizImageSortDirectionType; } });\nObject.defineProperty(exports, \"ZoneVisibilityType\", { enumerable: true, get: function () { return api_external_contract_js_1.ZoneVisibilityType; } });\n//# sourceMappingURL=ExtensionsApi.js.map"],"names":["__awaiter","this","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","e","rejected","result","done","then","apply","Object","defineProperty","exports","ExtensionsImpl","api_external_contract_js_1","api_internal_contract_js_1","api_shared_js_1","Dashboard_1","Workbook_1","Worksheet_1","DashboardContent_1","Environment_1","Settings_1","UI_1","WorkbookFormattingEnvUtil_1","WorksheetContent_1","RegisterAllExtensionsServices_1","ServiceRegistryUtil_1","BentonSansFontNameConstants_1","ExtensionWorkbookImpl_1","LegacyInternalApiDispatcherHolder_1","SettingsImpl_1","TableauBookFontNameConstants_1","UIImpl_1","initializeAsync","isExtensionDialog","contextMenuCallbacks","_initializationPromise","initOptions","isAlpha","ApiVersion","Instance","LegacyInternalApiDispatcherHolder","hasDesktopApiDispatcherPromise","desktopDispatcherPromise","getDesktopDispatcherPromise","dispatcherFactory","onDispatcherReceived","openPayload","catch","error","onDispatcherReceivedCallback","bind","doCrossFrameBootstrap","window","INTERNAL_CONTRACT_VERSION","factory","reportExtensionRenderComplete","mediaBlob","ApiServiceRegistry","get","ExtensionsRegistryId","getService","createVizImageAsync","inputSpec","setClickThroughAsync","clickThroughEnabled","extensionZoneId","isDashboardExtensionLocator","locator","dashboardPath","TableauError","ErrorCodes","InternalError","contextMenuFunctions","dispatcher","registerInitializationExtensionsServices","initializationService","callbackMapKeys","keys","initializeDashboardExtensionsAsync","platformVersion","extensionEnvironment","major","minor","fix","VersionedExternalApiDispatcher","needsVersionConverter","registerAllSharedServices","registerAllExtensionsServices","extensionDashboardInfo","extensionInstance","dashboardContent","initializeDashboardContent","extensionWorksheetInfo","worksheetContent","initializeWorksheetContent","environment","Environment","settings","initializeSettings","extensionSettingsInfo","ui","UI","UIImpl","workbook","Workbook","ExtensionWorkbookImpl","workbookFormatting","initializeTableauFonts","applyAllFormatting","initializeContextMenuCallbacks","initializeWorkbookFormattingChangedEventCallback","extensionDialogPayload","formattingModel","_styleElement","document","createElement","id","head","appendChild","sheet","stylesheet","cssRules","length","deleteRule","formattingSheets","map","currentFormattingSheet","applyFormattingSheetToStyleSheet","styleInfo","cssProperties","fontFamily","toString","fontSize","fontWeight","fontStyle","textDecoration","color","rule","classNameKey","insertRule","registerHandler","NotificationId","WorkbookFormattingChanged","eventFormatting","fontNames","SupportedBentonSansFontFaces","SupportedTableauFontFaces","forEach","formattingSheet","push","parameters","ParameterId","FontNameListItems","execute","VerbId","GetFonts","response","loadFonts","fonts","fontNameAndInfo","includes","fontName","loadTableauFonts","loadBentonSansFonts","add","FontFace","fontBinaryInfo","info","sheetPath","sheetInfoImpl","SheetInfoImpl","name","SheetType","Dashboard","width","size","w","height","h","undefined","dashboardImpl","DashboardImpl","zones","activeDashboardObjectId","dashboard","DashboardContent","visualId","worksheet","Worksheet","worksheetImpl","WorksheetImpl","backgroundColor","WorkbookFormattingEnvUtil","convertToWorkbookFormatting","formatting","WorksheetContent","settingsInfo","settingsImpl","SettingsImpl","Settings","ContextMenuClick","event","TableauBookFontFaceName","TableauBookFontFamilyName","weight","style","TableauLightFontFaceName","TableauLightFontFamilyName","TableauRegularFontFaceName","TableauRegularFontFamilyName","TableauSemiBoldFontFaceName","TableauSemiboldFontFamilyName","TableauBoldFontFaceName","TableauBoldFontFamilyName","TableauMediumFontFamilyName","TableauMediumFontFaceName","BentonSansBookFontFaceName","BentonSansFontFamilyName","BentonSansLowDPIFontFamilyName","BentonSansLightFontFaceName","BentonSansMediumFontFaceName","BentonSansSemiDemiFontFaceName","BentonSansBookItalicFontFaceName","BentonSansSemiDemiItalicFontFaceName","ShouldThrow","EnumConverter","TableauError_1","constructor","_mappings","_defaultVal","convert","enumVal","throwIfMissing","Yes","hasOwnProperty","Tableau","ExtensionContext","ExtensionMode","ExportedMediaType","TableauEventType","VizImageEncodingType","VizImageSortDirectionType","VizImagePaletteType","VizImageSizeSettingType","VizImageSizeSettingAlignmentType","module","SharedErrorCodes","CrossFrameMessenger","guid","JsApiInternalContract_1","CrossFramePreparedMessage_1","MessageTypeChecks_1","MessageTypes_1","thisWindow","otherWindow","otherWindowOrigin","startListening","unregisterFunction","boundHandler","onMessageReceived","addEventListener","removeEventListener","stopListening","setInitializeMessageHandler","handler","initializeMessageHandler","setCommandResponseMessageHandler","commandResponseMessageHandler","setCommandMessageHandler","commandMessageHandler","setNotificationMessageHandler","notificationMessageHandler","setHandshakeMessageHandler","handshakeMessageHandler","prepareInitializationMessage","apiVersion","crossFrameVersion","options","message","msgGuid","raw","msgType","MessageType","Initialize","prepareMessage","prepareCommandMessage","verbId","Command","prepareCommandResponseMessage","commandGuid","data","CommandResponse","JSON","parse","stringify","prepareNotificationMessage","notificationId","Notification","prepareAckMessage","Ack","msg","CrossFramePreparedMessage","source","isMessage","isInitMessage","isCommandResponseMessage","isCommandMessage","isNotificationMessage","Handshake","isHandshakeMessage","setOtherWindow","setOtherWindowOrigin","origin","ExternalStackingVersionConverter","_externalVersion","_platformVersion","_downgradeExecuteCallTranslations","_upgradeExecuteReturnTranslations","_upgradeNotificationTranslations","Error","downgradeExecuteCall","verb","downgraded","downgradeTranslation","upgradeExecuteReturn","executeResponse","upgraded","upgradeTranslation","upgradeNotification","notification","SettingsServiceImpl","ServiceImplBase","serviceName","saveSettingsAsync","FunctionName","SettingsValues","SaveExtensionSettings","settingsValues","__createBinding","create","o","m","k","k2","desc","getOwnPropertyDescriptor","__esModule","writable","configurable","enumerable","__exportStar","p","prototype","call","Toolbar","TableauDialogType","SheetSizeBehavior","PulseTimeDimension","PulseLayout","PulseErrorMessageVisibility","PrintScaling","PrintPageSize","PrintOrientation","EmbeddingTableauEventType","EmbeddingErrorCodes","DeviceType","CrosstabFileFormat","ApiMenuType","Enums_1","_workbookImpl","getAllDataSourcesAsync","_message","_target","_origin","messageGuid","send","postMessage","DataValue","Column","MarkInfo","DataTable","_data","_columns","_totalRowCount","_isTotalRowCountLimited","_isSummaryData","_marksInfo","_name","columns","marksInfo","totalRowCount","isTotalRowCountLimited","isSummaryData","_type","_color","_tupleId","type","tupleId","_fieldName","_fieldId","_dataType","_isReferenced","_index","fieldName","fieldId","dataType","isReferenced","index","_value","_nativeValue","_formattedValue","_aliasValue","_hasAlias","nativeValue","formattedValue","aliasValue","hasAlias","SheetUtils","Contract","getSheetSizeFromSizeConstraints","sizeConstraint","minWidth","minHeight","maxWidth","maxHeight","behavior","Automatic","AtMost","maxSize","AtLeast","minSize","Exactly","isDsdLayout","Range","createAutomaticSize","getPublishedSheetInfoByName","sheetInfos","find","getSheetTypeEnum","internalSheetType","sheetType","Story","ServerError","isValidSheetSize","sizeObject","WorkbookFormattingChangedEvent","TableauEvent_1","TableauEvent","_formatting","super","ExternalContextMenuServiceImpl","ServiceImplBase_1","appendContextMenuAsync","sheetName","targetMenu","config","AppendExternalMenuItem","WorksheetName","ExternalMenuItemDisplayName","displayName","removeContextMenuAsync","menuItemId","RemoveExternalMenuItem","ExternalMenuItemId","executeContextMenuAsync","ExecuteExternalMenuItem","renameContextMenuAsync","menuHeader","menuDescription","RenameExternalMenu","ExternalMenuHeader","ExternalMenuDescription","Param","ErrorHelpers_1","serializeDateForPlatform","date","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","serializeBooleanForPlatform","bool","serializeNumberForPlatform","num","isTypeNumber","input","Number","isTypeDate","Date","isTypeString","String","isTypeBool","Boolean","isNullOrUndefined","serializeParameterValue","convertParameterToMap","param","paramName","ErrorHelpers","verifyParameterType","Array","isArray","InvalidParameter","Map","entries","tryParseNumber","success","parsed","valueString","NaN","parseFloat","isNaN","Sheet","Parameter_1","EventListenerManager","_sheetImpl","isValidSize","ImplementationError","testSize","findParameterAsync","parameterName","parameterImpl","Parameter","getParametersAsync","parametersImpl","TableauWorksheetEvent","TableauSheetEvent_1","TableauSheetEvent","_worksheet","WorkbookImpl","VqlParameterNames","PublicParameterNames","VizOptionNames","DashboardObject","_dashboardObjectImpl","position","isFloating","isVisible","_sheet","ExternalIdentityVersionConverter","GetDataType","DataSourceServiceImpl","DataSource_1","Field_1","DataSourceImpl_1","FieldImpl_1","registryId","refreshAsync","dataSourceId","DeltaTimeMs","ShouldRefreshDS","DataSourceId","RefreshDataSource","getActiveTablesAsync","joinParameters","GetActiveTables","joinResponse","tableInfos","tables","UnsupportedMethodForDataSourceType","getDataSourcesAsync","VisualId","GetDataSources","GetAllDataSources","getConnectionSummariesAsync","params","GetConnectionDescriptionSummaries","getFieldAsync","globalfieldName","GetFieldAndDataSource","FieldId","dataSource","DataSource","field","Field","convertField","convertDataSource","getLogicalTablesAsync","GetLogicalTables","getUnderlyingTablesAsync","GetUnderlyingTables","FieldImpl","DataSourceImpl","_registryId","StoryPointInfoImpl","_caption","_storyPointId","_active","_updated","_parentStoryImpl","caption","storyPointId","active","isActive","updated","isUpdated","parentStory","TooltipTextRequestModel","visualIdPresModel","NotificationServiceImpl","NotificationServiceImplBase_1","NotificationServiceImplBase","ClientInfoServiceImpl","getClientInfoAsync","GetEmbeddingClientInfo","AskDataOptionNames","TableSummary","_tableInfo","connectionId","customSQL","InternalToExternalEnumMappings_1","EnumConverter_1","_dispatcher","internalError","externalErrorCode","InternalToExternalEnumMappings","errorCode","No","validator","RegExp","gen","count","out","i","Math","random","substring","Guid","TypeError","EMPTY","isGuid","equals","other","isEmpty","toJSON","test","join","HoverTupleInteractionModel","SelectTuplesInteractionModel","SelectionModelsContainer","TupleSelectionModel","DimensionSelectionModel","RangeSelectionModel","HierarchicalSelectionModel","ValueSelectionModel","SelectionModel","arguments","selectValues","objectIds","hierModelArr","dimModelArr","quantModelArr","tupleIds","selectOptions","tooltipContext","allowHoverActions","__tableauApiServiceRegistry","ServiceRegistryImpl","_services","registerService","service","setInstance","serviceRegistry","clearRegistry","GetDataServiceImpl","uuid_1","ApiShared_1","ExternalToInternalEnumMappings_1","GetDataModels_1","GetDataTableReaderModels_1","DataValueFactory_1","GetDataService_1","viewDataTableCacheId","v4","getMaxRowLimit","getViewDataTableCacheId","getLimitedMaxRows","requestedRows","rowCountLimit","getUnderlyingDataAsync","getType","ignoreAliases","ignoreSelection","includeAllColumns","columnsToIncludeById","maxRows","includeDataValuesOption","applyWorksheetFormatting","summaryData","Summary","functionName","GetDataSummaryData","GetUnderlyingData","requestMaxRows","IgnoreAliases","IgnoreSelection","IncludeAllColumns","ColumnsToIncludeById","verifyIncludeColumnArray","MaxRows","ShowDataTableFormat","ExternalToInternalEnumMappings","showDataTableFormatType","ApplyWorksheetFormatting","responseData","processResultsTable","isSummary","getSummaryDataReaderAsync","pageRowCount","ViewDataTableCacheId","PageRowCount","GetDataSummaryDataReader","DataTableReader","getSummaryColumnsInfoAsync","ApiShowDataTableFormat","NativeValuesOnly","headers","fieldCaption","getSelectedMarksAsync","GetSelectedMarks","table","getHighlightedMarksAsync","GetHighlightedMarks","getDataSourceDataAsync","columnsToInclude","ColumnsToInclude","GetDataSourceData","getLogicalTableDataAsync","datasourceId","logicalTableId","LogicalTableId","GetLogicalTableData","getLogicalTableDataReaderAsync","GetLogicalTableDataReader","getUnderlyingTableDataAsync","GetUnderlyingTableData","getUnderlyingTableDataReaderAsync","GetUnderlyingTableDataReader","getPageAsync","tableId","pageNumber","pageSize","ViewDataTableId","DataRowIndex","GetDataTableReaderPage","processResultsPage","summaryTableId","releaseAsync","ReleaseDataTableReader","columnsAsSet","Set","from","marks","dataTable","row","cell","DataValueFactory","MakeTableDataValue","VersionNumber","versionString","partStr","split","build","getBuildNumber","parts","parseInt","preReleaseString","fullFormattedValue","UIServiceImpl","DEFAULT_DIALOG_STYLE","DialogStyle","Window","displayDialogAsync","url","payload","ExtensionDialogUrl","ExtensionDialogPayload","ExtensionDialogUrlSource","location","href","dialogStyle","ExtensionDialogH","ExtensionDialogW","verifyEnumValue","ExtensionDialogStyle","dialogStyles","DisplayDialog","ExtensionDialogResult","DialogAlreadyOpen","InvalidDomain","InvalidDomainDialog","closeDialog","dialogUrl","CloseDialog","sendDialogMessageAsync","targetDialogUrl","ExtensionDialogMessage","SendDialogMessage","sendDialogMessageToParentAsync","SendMessageToParent","ExtensionZoneId","ClickThroughEnabled","SetClickThrough","Point_1","ServiceRegistry_1","DashboardObjectImpl_1","SheetImpl_1","SheetInfoImpl_1","WorksheetImpl_1","SheetImpl","_sheetInfo","_zones","_sheetPath","_parentStoryPointImpl","_activeDashboardObjectId","worksheetsImpl","_worksheetsImpl","objects","_objects","parentStoryPoint","activeDashboardName","initializeWithPublicInterfaces","zoneMap","zone","zoneSize","zoneType","DashboardObjectType","QuickFilter","worksheetName","worksheetUrl","isHidden","sheetInfo","vizId","_sheetInfoImpl","storyboard","flipboardZoneID","storyPointID","zonePoint","Point","x","y","dashboardObjectImpl","DashboardObjectImpl","dashboardObjectType","zoneId","set","setDashboardObjectVisibilityAsync","dashboardObjectVisibilityMap","setVisibilityAsync","getDashboardObjectById","dashboardObjectId","updateZones","newZones","newActiveZoneId","newActiveDashboardName","oldDashboardObjects","oldZoneMap","oldActiveZoneId","oldActiveDashboardName","newDashboardObjects","newZoneMap","zoneChanges","oldObject","oldId","has","addChange","DashboardLayoutChange","Removed","newObject","IsFloatingChanged","IsVisibleChanged","NameChanged","PositionChanged","SizeChanged","Added","Selected","Deselected","DashboardChanged","change","moveAndResizeDashboardObjectsAsync","dashboardObjectPositionAndSizeUpdateArray","moveAndResizeAsync","replayAnimationAsync","replaySpeed","replayAsync","getFiltersAsync","verifyActiveSheetOrEmbeddedInActiveStoryPoint","getDashboardFiltersAsync","applyFilterAsync","values","updateType","FilterUpdateType","verifyStringParameter","applyDashboardFilterAsync","getWorksheetNamesFromZones","worksheetNames","isRootAndActiveDashboard","isWithinActiveStoryPoint","NotActiveSheet","Param_1","apiNotImplemented","apiName","verifyInternalValue","argumentValue","argumentName","verifyParameter","expectedType","isValidEnumValue","enumValue","enumType","isValid","enumKey","enumName","verifyRange","min","max","verifyRangeParamType","isMinDefined","isMaxDefined","verifyZoneIsValid","dashboardZoneMap","zoneID","verifyZoneIsValidAndFloating","verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate","dashboardObjectPositionAndSizeUpdate","dashboardObjectID","verifySheetName","exportableSheetNames","InvalidSelectionSheet","verifyExportDataOptions","verifySheetNamesForPDFAndPPT","sheetNames","exportScenarios","every","exportableSheetNamesFromDashboard","exportableSheetNamesFromWorkbook","currentSheetName","verifyExportPDFOptions","orientation","scaling","_a","CustomViewImpl","customViewModel","_luid","luid","_shared","shared","_isDefault","isDefault","_ownerName","owner","userFriendlyName","_url","ownerName","saveAsync","DataTypeConverter","isSpecial","valueAsString","parseBoolean","booleanString","normalizedBoolean","toLowerCase","specialValueIndicator","parseNumber","parseDate","dateAsString","getTime","parseDateTime","formattedDateString","replace","concat","convertValueAsStringToValue","DataType","Bool","Int","Float","DateTime","Spatial","convertValueToNativeValue","convertStringValueToNativeValue","PulseAttributes","PulseChildElements","PulseChildElementAttributes","_errorCode","setPrototypeOf","VisualModelServiceImpl","getVisualSpecificationAsync","GetVisualSpecification","addMarksCardFieldsAsync","marksCardIndex","encodingType","startIndex","MarksCardIndex","EncodingType","Columns","StartIndex","AddMarksCardFields","moveMarksCardFieldAsync","fromIndex","toIndex","fieldCount","FromIndex","ToIndex","FieldCount","MoveMarksCardField","spliceMarksCardFieldsAsync","deleteCount","DeleteCount","SpliceMarksCardFields","editAliasesDialogAsync","EditAliasesDialog","VizSharedAttributes","VizAttributes","VizAuthoringAttributes","VizChildElements","VizChildElementAttributes","ParameterImpl","parameterInfo","setParameterInfo","_parameterInfo","currentValue","MakeParameterDataValue","_globalFieldName","allowableValues","_allowableValues","changeValueAsync","newValue","coercedValue","changeParameterValueAsync","allowableValuesType","listValues","minValue","maxValue","stepSize","dateStepPeriod","ParameterValueType","List","val","_impl","initializeEvents","addNewEventType","_dashboard","TableauDialogError","DialogMessageEvent","sourceDialogUrl","DialogMessageReceived","uiService","notificationService","unregisterFn","ExtensionDialogUpdate","isCloseEvent","closePayload","DialogClosedByUser","results","dialogMessageEvent","SingleEventManagerImpl","triggerEvent","LogicalTable_1","_visualId","_parentDashboardImpl","_backgroundColor","parentDashboard","getMaxPageRowLimit","verifyActiveSheet","applyRangeFilterAsync","filterOptions","nullOption","FilterNullOption","applyHierarchicalFilterAsync","levels","clearFilterAsync","applyRelativeDateFilterAsync","periodType","PeriodType","rangeType","DateRangeType","dataSchema","worksheetDataSourceInfo","worksheetDataSchemaMap","dataSources","primaryId","primaryDataSource","createDataSourceFromInfo","secondaryId","referencedDataSourceList","getSummaryDataAsync","IncludeDataValuesOption","AllValues","Underlying","logicalTableInfos","logicalTableInfo","LogicalTable","clearSelectedMarksAsync","selectMarksByValueAsync","selections","selectionUpdateType","SelectionUpdateType","selectMarksByIdAsync","annotateMarkAsync","mark","annotationText","getAnnotationsAsync","removeAnnotationAsync","annotation","hoverTupleAsync","hoveredTuple","tooltip","isInsideDashboardExtension","selectTuplesAsync","selectedTuples","selectOption","getTooltipTextAsync","leaveMarkNavigationAsync","dataSourceInfo","dataSourceImpl","isRootAndActiveWorksheet","isInsideActiveDashboard","isInsideActiveStoryPoint","ds","_settingsImpl","erase","key","getAll","isModified","filterDomainType","FilterDomainType","Relevant","Database","nullOptions","NonNullValues","NullValues","filterUpdateType","Add","All","Remove","Replace","setVisibilityType","ZoneVisibilityType","Show","Hide","setReplaySpeedType","ReplaySpeedType","Slow","Normal","Fast","NativeAndFormattedValues","OnlyNativeValues","OnlyFormattedValues","FormattedValuesOnly","Years","DateStepPeriod","Quarters","Months","Weeks","Days","Hours","Minutes","Seconds","IsoYears","IsoQuarters","IsoWeeks","dateRangeType","Last","LastN","Next","NextN","Current","ToDate","Modal","Modeless","ConnectedServer","_userId","_siteId","_siteNamespace","_workbookId","userId","siteId","siteNamespace","workbookId","_dataSourceImpl","fields","extractUpdateTime","isExtract","isPublished","publishedUrl","console","warn","__warningIssued","__platformIsOfficialRelease","__tableauDesktopDispatcher","BlockExtension","FilterChangedEvent","TableauWorksheetEvent_1","FilterChanged","getFilterAsync","filters","eventedFilter","filter","MissingFilter","ExecuteMinorUpgradeNotification","ExecuteMinorUpgradeReturnExternal","ExecuteMinorDowngradeCallExternal","CreateExternalCompatibleVersionConverter","externalVersion","CreateExternalCompatibleVersionConverterWithTranslators","VersionConverterFactory_1","ExternalIdentityVersionConverter_1","ExternalStackingVersionConverter_1","downgrades","upgrades","upgradeNotifications","externalMajorVersion","platformMajorVersion","platformMinorVersion","VersionEqualTo","neededExecuteCallDowngrade","GetNeededExternalTranslations","neededExecuteReturnUpgrades","neededNotificationUpgrades","reverse","majorMinorTranslators","neededTranslations","start","maximumMinorVersion","GetMaximumMinorIndex","ExportHelpers","updateInternalExportPDFOptions","internalExportPdfOptions","externalExportPdfOptions","currentSheet","updateExportLayoutOptions","updateSheetOptions","exportLayoutOptions","imageHeight","DefaultLayoutOptions","imageWidth","Landscape","pageOrientationOption","PageOrientation","Portrait","A3","pageSizeOption","PageSizeOption","A4","A5","B4","B5","Executive","Folio","Ledger","Legal","Letter","Note","Quarto","Statement","Tabloid","Unspecified","AtMost1PageHigh","setFitAndScaleValues","FitPages","FitOneHigh","AtMost1PageWide","FitOneWide","AtMost2PagesHigh","FitTwoHigh","AtMost2PagesWide","FitTwoWide","PageScalingOption","ScalePctAuto","Perc100","ScalePct100","Perc200","ScalePct200","Perc25","ScalePct25","Perc400","ScalePct400","Perc50","ScalePct50","Perc60","ScalePct60","Perc75","ScalePct75","Perc80","ScalePct80","Perc90","ScalePct90","sheetOptions","sheetOption","isSelected","scalingSelection","pageFitHorizontal","pageFitVertical","pageScaleMode","pageScalePercent","fitMatch","fitRegex","exec","percentMatch","pctRegex","slice","ScaleMode","ScaleFitPages","ScalePercentage","DefaultDataOptions","DefaultPDFOptions","ScaleAuto","MarksSelectedEvent","MarkSelectionChanged","getMarksAsync","CrossFrameDispatcher","_messenger","_pendingPromises","_notificationHandlers","onCommandResponse","onNotification","preparedMessage","promise","registerNotificationHandler","unregisterNotificationHandler","indexOf","pendingPromise","notificationMessage","IncompatibleVersionError","NotificationMinorDowngrades","ExecuteMinorDowngrades","ExecuteMinorUpgrades","VersionLessThan","lhs","rhs","CreateVersionConverter","CreateVersionConverterWithTranslators","IdentityVersionConverter_1","StackingVersionConverter_1","VersionTranslations_1","notificationDowngrades","externalMinorVersion","IdentityVersionConverter","neededExecuteUpgrades","GetNeededTranslations","neededExecuteDowngrades","neededNotificationDowngrades","StackingVersionConverter","fromData","minorVersions","a","reduce","b","DowngradeWorksheetNames","DowngradeWorksheetFomatting175","DowngradeExtensionEnvironmentContext","DowngradePeriodType","DowngradeFlipboardZoneID","DowngradeWorksheetFomattingNotification175","InitializationServiceImpl","contextMenuIds","ExtensionContextMenuIds","IsExtensionDialog","InitializeExtension","ParameterChangedEvent_1","parameterEvent","ParameterChanged","model","ParameterChangedEvent","getRandomValues","rnds8","Uint8Array","rng","crypto","msCrypto","uuid","byteToHex","substr","arr","offset","_nodeId","_clockseq","_lastMSecs","_lastNSecs","buf","node","clockseq","seedBytes","msecs","now","nsecs","dt","tl","tmh","n","v","version","hashfunc","generateUUID","namespace","str","unescape","encodeURIComponent","bytes","charCodeAt","stringToBytes","err","DNS","URL","getOutputLength","inputLength8","safeAdd","lsw","md5cmn","q","s","t","cnt","md5ff","c","d","md5gg","md5hh","md5ii","v35","output","length32","hexTab","hex","charAt","md5ToHexEncodedArray","len","olda","oldb","oldc","oldd","wordsToMd5","length8","Uint32Array","bytesToWords","rnds","f","z","ROTL","K","H","l","N","ceil","M","_i","j","pow","floor","_i2","W","_t","_t2","T","AnimationServiceImpl_1","AnimationServiceImpl","DataSourceServiceImpl_1","ExportServiceImpl_1","ExportServiceImpl","GetDataServiceImpl_1","FilterServiceImpl_1","FilterServiceImpl","NotificationServiceImpl_1","ParametersServiceImpl_1","ParametersServiceImpl","SelectionServiceImpl_1","SelectionServiceImpl","AnnotationServiceImpl_1","AnnotationServiceImpl","ZoneServiceImpl_1","ZoneServiceImpl","SizeServiceImpl_1","SizeServiceImpl","VisualModelServiceImpl_1","VizServiceImpl_1","VizServiceImpl","ExternalContextMenuServiceImpl_1","AccessibilityServiceImpl_1","AccessibilityServiceImpl","RangeDomain","CategoricalDomain","RelativeDateFilter","RangeFilter","HierarchicalFilter","HierarchicalLevelDetail","HierarchicalDataValue","CategoricalFilter","Filter","_worksheetName","_filterType","filterType","getAppliedWorksheetsAsync","setAppliedWorksheetsAsync","applyToWorksheets","uniqueWorksheets","_appliedValues","_isExcludeMode","_isAllSelected","isAllSelected","appliedValues","isExcludeMode","getDomainAsync","domainType","getCategoricalDomainAsync","_hierarchicalPath","_level","hierarchicalPath","level","_levelSelectionState","levelSelectionState","_dimensionName","_hierarchyCaption","_numberOfLevels","_levelDetails","dimensionName","hierarchyCaption","numberOfLevels","levelDetails","_min","_max","_includeNullValues","includeNullValues","getRangeDomainAsync","_anchorDate","_periodType","_rangeType","_rangeN","anchorDate","rangeN","_values","_domainType","RevertVizSelection","ToolbarButtons","_id","_pageRowCount","_pageCount","pageCount","getAllPagesAsync","firstPage","rowsRequested","pagesRequested","pagesToFetch","isDataLimited","remainingData","page","fullData","eventType","_eventType","_handlers","beforeCount","eventGenerator","upgradeExecuteCall","downgradeExecuteReturn","downgradeNotification","ReplaySpeed","ReplayAnimation","Tableau_1","changeSizeAsync","newSize","_b","_c","_d","SheetName","MinHeight","MinWidth","MaxHeight","MaxWidth","SetSheetSize","_response","Extensions","extensionImpl","initializeDialogAsync","AnalyticsObjectType","AnnotationType","ColumnType","ClassNameKey","DashboardObjectVisibilityType","FieldAggregationType","FieldRoleType","FilterType","MarkType","DataFormatType","NumberFormatUnits","NegativeNumberFormat","QuickTableCalcType","SelectOptions","SortDirection","TrendLineModelType","HierarchicalLevelSelectionState","assign","bootstrapInfo","Notifications_1","SelectedMarksChanged","visualModel","context","extensionContext","PublicWeb","Cloud","Server","PublicDesktop","Desktop","parameter","HandleDowngradePeriodTypeForParameter","ClassNameKeysToFilter175","DomainRestrictionType","classNames","DowngradeWorksheetFormatting","WorksheetFormattingChanged","DowngradeWorksheetFormattingNotification","MESSAGING_VERSION","internalContractVersion","UnregisterTimeoutInMilliseconds","Deferred","_promise","_resolve","_reject","reason","dataFormatType","AutoFormat","SystemNumber","SystemCurrency","SystemLongDate","SystemShortDate","SystemTime","Custom","CustomNumber","CustomCurrency","numberFormatUnits","None","Thousands","Millions","BillionsEnglish","BillionsStandard","negativeNumberFormat","Parentheses","OuterPrefix","OuterSuffix","InnerPrefix","InnerSuffix","extensionMode","Authoring","Viewing","exportedMediaType","Image","Pdf","Svg","Html","PowerPoint","Excel","columnType","Continuous","Discrete","Unknown","fieldAggregationType","Attr","Avg","Collect","Count","Countd","Day","End","Hour","InOut","Kurtosis","Max","Mdy","Median","Min","Minute","MonthYear","Qtr","Quart1","Quart3","Second","Skewness","Stdev","Stdevp","Sum","TruncDay","TruncHour","TruncMinute","TruncMonth","TruncQtr","TruncSecond","TruncWeek","TruncYear","User","Var","Varp","Week","Weekday","Year","fieldRoleType","Dimension","Measure","Extension","Blank","Legend","PageFilter","ParameterControl","Text","Title","WebPage","INITIALIZATION_ERROR","INTERNAL_ERROR","MISSING_ENUM_MAPPING","MISSING_PARAMETER","PERMISSION_DENIED","PRES_MODEL_PARSING_ERROR","UNKNOWN_VERB_ID","VERSION_NOT_CONFIGURED","APINotInitialized","VISIBILITY_ERROR","VisibilityError","Categorical","RelativeDate","Hierarchical","DashboardTitle","StoryTitle","Tooltip","WorksheetTitle","Pane","RowDividers","ColumnDividers","hierarchicalLevelSelectionState","AllSelected","NoneSelected","SomeSelected","UnknownSelected","annotationType","AnnotateEnum","Area","Mark","markType","Bar","Circle","GanttBar","Heatmap","Line","Pie","Polygon","Shape","Square","VizExtension","AskDataAttributes","WebComponentAttributes","EmbeddedIframeAttributes","WebComponentChildElements","WebComponentChildElementAttributes","getParameterAsync","findParameterByGlobalFieldNameAsync","MissingParameter","ShortLivedDeferred","Deferred_1","_timeoutInMilliseconds","getNewPromiseOrThrowIfBusy","_deferred","ApiExecutionError","_timeoutId","setTimeout","Timeout","clearTimeout","SummaryDataChangedEvent","SummaryDataChanged","StoryActivationServiceImpl","Registration","StoryPointImpl","StoryImpl","ApiVersion_1","CrossFrameDispatcher_1","EventListenerManager_1","CustomViewImpl_1","DashboardImpl_1","ParameterImpl_1","SingleEventManagerImpl_1","StoryImpl_1","StoryPointImpl_1","StoryPointInfoImpl_1","WorkbookImpl_1","ClientInfoServiceImpl_1","StoryActivationServiceImpl_1","ExportHelpers_1","SheetUtils_1","VersionNumber_1","VersionedExternalApiDispatcher_1","zoneVisibilityMap","ZoneIdsVisibilityMap","SetZoneVisibility","DashboardObjectPositionAndSizeUpdateList","dashboardObject","MoveAndResizeZones","_storyPointInfoImpl","containedSheetInfo","_containedSheetImpl","createContainedSheet","containedSheet","publishedSheetInfo","containedSheetSize","isContainedSheetHidden","containedSheetUrl","containedSheetInfoImpl","sheetImpl","isDashboard","dashboardZones","PulseOptionNames","WorksheetFormattingChangedEvent","SettingsServiceImpl_1","UIServiceImpl_1","InitializationServiceImpl_1","getParametersForSheetAsync","SheetPath","getAllParametersAsync","inputParameters","GetParametersForSheet","ParameterFieldName","ParameterValue","ChangeParameterValue","findParameterByNameAsync","ParameterCaption","FindParameter","InternalContract","_fieldInfo","_parentDataSource","description","aggregation","role","definedValue","isCalculatedField","isCombinedField","isGenerated","isGeospatial","isPresentOnPublishedDatasource","semanticRole","dataFormat","FilterModels_1","ApplyCategoricalFilter","FieldName","FilterValues","IsExcludeMode","ApplyRangeFilter","FilterRangeMin","FilterRangeMax","FilterRangeNullOption","apiFilterHandlerCheckForCommandError","hierarchicalLevels","FilterLevels","ClearFilter","resposne","ApplyRelativeDateFilter","MissingRangeNForRelativeDateFilters","RangeN","AnchorDate","convertAnchorDate","GetFilters","convertDomainFilters","GetCategoricalDomain","DomainType","domain","convertCategoricalDomain","GetRangeDomain","convertRangeDomain","GetDashboardFilters","DashboardCategoricalFilter","sharedFilterModel","executeGetAppliedWorksheets","worksheets","worksheetInfo","allowedWorksheets","activeWorksheet","isEnabled","ChangeSharedFilter","SharedFilterSheets","telemetryFunctionName","GetSharedFilter","domainFilters","domainFilter","convertCategoricalFilter","convertHierarchicalFilter","convertRangeFilter","convertRelativeDateFilter","dv","MakeFilterDataValue","isExclude","hierarchicalDataValue","levelInfo","aLevel","anchorDateValue","domainDv","year","month","day","hh","mm","sec","InvalidDateParameter","serverPm","ParameterError","InvalidFieldCaption","InvalidFilterFieldName","InvalidValues","InvalidFilterFieldValue","InvalidAggFieldName","InvalidAggregationFieldName","ConnectedServer_1","_apiVersion","_context","_isExporting","isExporting","_language","extensionLanguage","_country","extensionCountry","_locale","extensionLocale","_workbookLocale","workbookLocale","_mode","_operatingSystem","operatingSystem","_tableauVersion","tableauVersion","_uniqueUserId","uniqueUserId","_exportedMediaType","connectedServer","featureFlags","language","country","locale","mode","ConnectionSummary_1","TableSummary_1","_dataSourceInfo","_fields","fieldModel","fieldImpl","summaries","summary","ConnectionSummary","tableInfo","DashboardLayoutChangedEvent_1","WorkbookFormattingChangedEvent_1","DashboardObject_1","Sheet_1","_dashboardImpl","setZoneVisibilityAsync","dashboardLayoutChangedEvent","DashboardLayoutChanged","dashboardObjectChanges","activeZoneId","DashboardLayoutChangedEvent","workbookFormattingChangedEvent","SettingsChangedEvent","_newSettings","SettingsChanged","newSettings","_saveInProgress","_currentSettings","verifySettingsAreUnlocked","_isModified","settingsChangedEvent","SettingSaveInProgress","ASYNC_SAVE_IN_PROGRESS","_fieldImpl","_filterFn","_callbackFn","notificationModel","filterFn","handlers","registration","removeRegistration","hasHandlersForNotificationType","reg","_connectionInfo","serverURI","workbookFormattingModel","borderColor","borderStyle","borderWidth","isVersion","initMessage","crMessage","commandMessage","expectedEmptyNotifications","EditButtonClicked","EditInDesktopButtonClicked","WorkbookPublished","WorkbookReadyToClose","ReadyToReceiveAuthToken","versionNumber","_logicalTable","_eventListenerManagers","UnsupportedEventName","eventManager","sheetSize","hidden","getSheetSize","invalidSizeError","InvalidSize","partialSheetSize","normalizeSheetSize","isAutomatic","InvalidSizeBehaviorOnWorksheet","processedNewSize","processNewSize","publishedSheets","parseDimensions","minSizeMaybe","maxSizeMaybe","hasMinWidth","hasMinHeight","hasMaxWidth","hasMaxHeight","hasValidMinSize","hasValidMaxSize","MissingMaxSize","MissingMinSize","MissingMinMaxSize","empty","widthParsed","parsedWidth","heightParsed","parsedHeight","internalDataValue","aliasedValue","AccessibilityModels_1","tooltipTextRequest","TooltipTextRequest","GetTooltipText","RaiseLeaveMarkNavNotification","SelectionModels_1","selectionModelContainer","parseMarkSelectionIds","formattedText","TargetPoint","SelectionList","selection","FormattedText","CreateAnnotation","GetAnnotations","annotationsList","annotationFilterMap","parseAnnotationSelectionIds","RemoveAnnotation","ids","tupleSelectionModel","selectionType","annotations","annotationId","mapAnnotation","annotationHTML","annotationPlainText","annotateEnum","parent","self","inIframe","opener","messenger","initializationMessage","ClearSelectedMarks","selectionCriterias","validateSelectionUpdateType","parseSelectionMarks","HierValSelectionModels","QuantRangeSelectionModels","DimValSelectionModels","SelectByValue","interactionModel","ensureTupleIDIsNonNegative","HoverTupleInteraction","RaiseHoverTupleNotification","SelectTuplesInteraction","RaiseSelectTuplesNotification","InvalidFields","InvalidSelectionFieldName","InvalidSelectionValue","InvalidDates","InvalidSelectionDate","parseSelectionIds","Selection","st","catRegex","rangeOption","hierModel","addToParamsList","quantModel","addToRangeParamsList","dimModel","valueSelectionModel","markValues","valueArr","qualifiedFieldCaption","rangeSelectionModel","included","validateNullOptionType","QuantitativeIncludedValues","IncludeNull","IncludeNonNull","IncludeAll","_instance","SetVersionNumber","numString","_x","_y","_dashboardLayoutChangeDetails","dashboardLayoutChangeDetails","upgradeExecuteTranslations","downgradeExecuteTranslations","downgradeNotificationTranslations","_externalMajorVersion","_platformMajorVersion","_upgradeExecuteTranslations","_downgradeExecuteTranslations","_downgradeNotificationTranslations","_position","_size","_worksheetImpl","_isFloating","_isVisible","VizAPIInputJson","VizAPI","activateSheetAsync","SwitchToSheetName","ActivateSheet","getCustomViewsAsync","GetCustomViews","customView","showCustomViewAsync","customViewName","CustomViewName","ShowCustomView","removeCustomViewAsync","RemoveCustomView","saveCustomViewAsync","CustomViewIsDefault","SaveWorkbookAsCustomView","setActiveCustomViewAsDefaultAsync","SetActiveCustomViewAsDefault","CustomViewLuid","CustomViewIsPublic","UpdateCustomView","getCurrentSrcAsync","GetCurrentSrc","getExportCrosstabSheetMapAsync","currentSheetType","GetExportCrosstabSheetMap","CurrentSheetType","exportCrosstabAsync","format","exportableWorksheetNames","sheetNameToIdMap","SheetIdentifier","SendNotifications","CSV","ExportCrosstabCsvDownload","UseTabDelimiters","ExportCrosstabExcelDownload","CrosstabCreationError","exportDataAsync","ExportDataDownload","DataCreationError","exportPowerPointAsync","ExportPowerpointDownload","ExportOriginUrl","SelectedSheetNames","PowerPointCreationError","exportPDFAsync","getExportPDFOptionsAsync","ExportPdfDownload","ExportPdfOptions","PDFCreationError","GetExportPdfOptions","ReportExtensionRenderComplete","HasExtensionRenderingTimedOut","ExtensionMediaBlob","ShortLivedDeferred_1","storyModel","_publishedSheetInfos","_storyPointInfoImpls","initializeStory","storyPoints","storyPointModel","activeStoryPointIndex","storyPointInfoImpl","_activeStoryPointImpl","updateStoryInfo","storyInfoImpl","StoryPointIdMismatch","updateStory","activeStoryPoint","storyPointsInfo","activateNextStoryPointAsync","activatePreviousStoryPointAsync","activateStoryPointAsync","IndexOutOfRange","revertStoryPointAsync","clearPendingPromises","FilterChangedEvent_1","MarksSelectedEvent_1","SummaryDataChangedEvent_1","WorksheetFormattingChangedEvent_1","marksEvent","visualIdsAreEqual","filterEvent","filterEventResponse","summaryDataEvent","summaryDataEventResponse","worksheetFormattingChangedEvent","selectMarksByIDAsync","_apiDelegateDispatcher","platformVersionNumber","_versionConverter","upgradedNotification","downgradeParameters","_sheetType","_sheetSize","_isActive","_isHidden","ActivateNextStoryPoint","ActivatePreviousStoryPoint","ActivateStoryPoint","StoryPointIndex","RevertStoryPoint","EncodedDataType","__webpack_module_cache__","__webpack_require__","moduleId","cachedModule","__webpack_modules__","definition","obj","prop","r","Symbol","toStringTag","extensions","ExtensionsImpl_1","Extensions_1","VERSION_IS_ALPHA"],"sourceRoot":""} \ No newline at end of file diff --git a/lib/tableau.extensions.1.17.0.js b/lib/tableau.extensions.1.17.0.js new file mode 100644 index 00000000..a3383044 --- /dev/null +++ b/lib/tableau.extensions.1.17.0.js @@ -0,0 +1,13936 @@ +/******/ (() => { // 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"; +__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 */ "../../node_modules/uuid/dist/esm-browser/v1.js"); +/* harmony import */ var _v3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v3.js */ "../../node_modules/uuid/dist/esm-browser/v3.js"); +/* harmony import */ var _v4_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v4.js */ "../../node_modules/uuid/dist/esm-browser/v4.js"); +/* harmony import */ var _v5_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v5.js */ "../../node_modules/uuid/dist/esm-browser/v5.js"); +/* harmony import */ var _nil_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./nil.js */ "../../node_modules/uuid/dist/esm-browser/nil.js"); +/* harmony import */ var _version_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./version.js */ "../../node_modules/uuid/dist/esm-browser/version.js"); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./validate.js */ "../../node_modules/uuid/dist/esm-browser/validate.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./stringify.js */ "../../node_modules/uuid/dist/esm-browser/stringify.js"); +/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./parse.js */ "../../node_modules/uuid/dist/esm-browser/parse.js"); + + + + + + + + + + +/***/ }), + +/***/ "../../node_modules/uuid/dist/esm-browser/md5.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); + +/***/ }), + +/***/ "../../node_modules/uuid/dist/esm-browser/nil.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'); + +/***/ }), + +/***/ "../../node_modules/uuid/dist/esm-browser/parse.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 */ "../../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); + +/***/ }), + +/***/ "../../node_modules/uuid/dist/esm-browser/regex.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); + +/***/ }), + +/***/ "../../node_modules/uuid/dist/esm-browser/rng.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); +} + +/***/ }), + +/***/ "../../node_modules/uuid/dist/esm-browser/sha1.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); + +/***/ }), + +/***/ "../../node_modules/uuid/dist/esm-browser/stringify.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 */ "../../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); + +/***/ }), + +/***/ "../../node_modules/uuid/dist/esm-browser/v1.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 */ "../../node_modules/uuid/dist/esm-browser/rng.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.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); + +/***/ }), + +/***/ "../../node_modules/uuid/dist/esm-browser/v3.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 */ "../../node_modules/uuid/dist/esm-browser/v35.js"); +/* harmony import */ var _md5_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./md5.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); + +/***/ }), + +/***/ "../../node_modules/uuid/dist/esm-browser/v35.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 */ "../../node_modules/uuid/dist/esm-browser/stringify.js"); +/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./parse.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; +} + +/***/ }), + +/***/ "../../node_modules/uuid/dist/esm-browser/v4.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 */ "../../node_modules/uuid/dist/esm-browser/rng.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.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); + +/***/ }), + +/***/ "../../node_modules/uuid/dist/esm-browser/v5.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 */ "../../node_modules/uuid/dist/esm-browser/v35.js"); +/* harmony import */ var _sha1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sha1.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); + +/***/ }), + +/***/ "../../node_modules/uuid/dist/esm-browser/validate.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 */ "../../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); + +/***/ }), + +/***/ "../../node_modules/uuid/dist/esm-browser/version.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 */ "../../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-external-contract-js/lib/src/EmbeddingApiExternalContract.js": +/*!***************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js ***! + \***************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +// This file re-exports everything which is part of the extensions api public interface +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Toolbar = exports.TableauDialogType = exports.SheetSizeBehavior = exports.PulseTimeDimension = exports.PulseLayout = exports.PulseErrorMessageVisibility = exports.PrintScaling = exports.PrintPageSize = exports.PrintOrientation = exports.EmbeddingTableauEventType = exports.EmbeddingErrorCodes = exports.DeviceType = exports.CrosstabFileFormat = exports.ApiMenuType = void 0; +__exportStar(__webpack_require__(/*! ./ExternalContract/Embedding/AskDataInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js"), exports); +var Enums_1 = __webpack_require__(/*! ./ExternalContract/Embedding/Enums */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js"); +Object.defineProperty(exports, "ApiMenuType", ({ enumerable: true, get: function () { return Enums_1.ApiMenuType; } })); +Object.defineProperty(exports, "CrosstabFileFormat", ({ enumerable: true, get: function () { return Enums_1.CrosstabFileFormat; } })); +Object.defineProperty(exports, "DeviceType", ({ enumerable: true, get: function () { return Enums_1.DeviceType; } })); +Object.defineProperty(exports, "EmbeddingErrorCodes", ({ enumerable: true, get: function () { return Enums_1.EmbeddingErrorCodes; } })); +Object.defineProperty(exports, "EmbeddingTableauEventType", ({ enumerable: true, get: function () { return Enums_1.TableauEventType; } })); +Object.defineProperty(exports, "PrintOrientation", ({ enumerable: true, get: function () { return Enums_1.PrintOrientation; } })); +Object.defineProperty(exports, "PrintPageSize", ({ enumerable: true, get: function () { return Enums_1.PrintPageSize; } })); +Object.defineProperty(exports, "PrintScaling", ({ enumerable: true, get: function () { return Enums_1.PrintScaling; } })); +Object.defineProperty(exports, "PulseErrorMessageVisibility", ({ enumerable: true, get: function () { return Enums_1.PulseErrorMessageVisibility; } })); +Object.defineProperty(exports, "PulseLayout", ({ enumerable: true, get: function () { return Enums_1.PulseLayout; } })); +Object.defineProperty(exports, "PulseTimeDimension", ({ enumerable: true, get: function () { return Enums_1.PulseTimeDimension; } })); +Object.defineProperty(exports, "SheetSizeBehavior", ({ enumerable: true, get: function () { return Enums_1.SheetSizeBehavior; } })); +Object.defineProperty(exports, "TableauDialogType", ({ enumerable: true, get: function () { return Enums_1.TableauDialogType; } })); +Object.defineProperty(exports, "Toolbar", ({ enumerable: true, get: function () { return Enums_1.Toolbar; } })); +__exportStar(__webpack_require__(/*! ./ExternalContract/Embedding/PulseInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Embedding/TableauError */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/TableauError.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Embedding/VizInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Embedding/VizQLDataServiceInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/VizQLDataServiceInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Embedding/WebComponentInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./SharedApiExternalContract */ "../api-external-contract-js/lib/src/SharedApiExternalContract.js"), exports); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js": +/*!****************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js ***! + \****************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +// This file re-exports everything which is part of the extensions api public interface +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VizImageSortDirectionType = exports.VizImageSizeSettingType = exports.VizImageSizeSettingAlignmentType = exports.VizImagePaletteType = exports.VizImageEncodingType = exports.TableauEventType = exports.ExtensionMode = exports.ExtensionContext = exports.ExportedMediaType = exports.ErrorCodes = void 0; +__exportStar(__webpack_require__(/*! ./ExternalContract/Extensions/EventInterface */ "../api-external-contract-js/lib/src/ExternalContract/Extensions/EventInterface.js"), exports); +var Tableau_1 = __webpack_require__(/*! ./ExternalContract/Extensions/Namespaces/Tableau */ "../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js"); +Object.defineProperty(exports, "ErrorCodes", ({ enumerable: true, get: function () { return Tableau_1.ErrorCodes; } })); +Object.defineProperty(exports, "ExportedMediaType", ({ enumerable: true, get: function () { return Tableau_1.ExportedMediaType; } })); +Object.defineProperty(exports, "ExtensionContext", ({ enumerable: true, get: function () { return Tableau_1.ExtensionContext; } })); +Object.defineProperty(exports, "ExtensionMode", ({ enumerable: true, get: function () { return Tableau_1.ExtensionMode; } })); +Object.defineProperty(exports, "TableauEventType", ({ enumerable: true, get: function () { return Tableau_1.TableauEventType; } })); +Object.defineProperty(exports, "VizImageEncodingType", ({ enumerable: true, get: function () { return Tableau_1.VizImageEncodingType; } })); +Object.defineProperty(exports, "VizImagePaletteType", ({ enumerable: true, get: function () { return Tableau_1.VizImagePaletteType; } })); +Object.defineProperty(exports, "VizImageSizeSettingAlignmentType", ({ enumerable: true, get: function () { return Tableau_1.VizImageSizeSettingAlignmentType; } })); +Object.defineProperty(exports, "VizImageSizeSettingType", ({ enumerable: true, get: function () { return Tableau_1.VizImageSizeSettingType; } })); +Object.defineProperty(exports, "VizImageSortDirectionType", ({ enumerable: true, get: function () { return Tableau_1.VizImageSortDirectionType; } })); +__exportStar(__webpack_require__(/*! ./ExternalContract/Extensions/Namespaces/UI */ "../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/UI.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Extensions/ParameterInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Extensions/ParameterInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Extensions/TableauError */ "../api-external-contract-js/lib/src/ExternalContract/Extensions/TableauError.js"), exports); +__exportStar(__webpack_require__(/*! ./SharedApiExternalContract */ "../api-external-contract-js/lib/src/SharedApiExternalContract.js"), exports); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract.js": +/*!***************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract.js ***! + \***************************************************************/ +/***/ (function(__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. + */ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +__exportStar(__webpack_require__(/*! ./EmbeddingApiExternalContract */ "../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js"), exports); +__exportStar(__webpack_require__(/*! ./ExtensionsApiExternalContract */ "../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js"), exports); + + +/***/ }), + +/***/ "../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 })); +exports.AskDataAttributes = void 0; +/** + * 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 = 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 })); +exports.TableauDialogType = exports.ApiMenuType = exports.TableauEventType = exports.PulseErrorMessageVisibility = exports.PulseTimeDimension = exports.PulseLayout = exports.SheetSizeBehavior = exports.Toolbar = exports.ToolbarButtons = exports.RevertVizSelection = exports.PrintScaling = exports.PrintPageSize = exports.PrintOrientation = exports.EmbeddingErrorCodes = exports.DeviceType = exports.CrosstabFileFormat = void 0; +/** + * Crosstab file formats available to use with {@link Viz.exportCrosstabAsync} + */ +var CrosstabFileFormat; +(function (CrosstabFileFormat) { + CrosstabFileFormat["CSV"] = "csv"; + CrosstabFileFormat["Excel"] = "xlsx"; +})(CrosstabFileFormat || (exports.CrosstabFileFormat = 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 = 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"; + /** + * @hidden (not implemented) + */ + 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 = EmbeddingErrorCodes = {})); +var PrintOrientation; +(function (PrintOrientation) { + PrintOrientation["Portrait"] = "portrait"; + PrintOrientation["Landscape"] = "landscape"; +})(PrintOrientation || (exports.PrintOrientation = 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 = 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 = PrintScaling = {})); +var RevertVizSelection; +(function (RevertVizSelection) { + RevertVizSelection["All"] = "all"; + RevertVizSelection["Axes"] = "axes"; + RevertVizSelection["Filters"] = "filters"; + RevertVizSelection["Sorts"] = "sorts"; + RevertVizSelection["Shelves"] = "shelves"; +})(RevertVizSelection || (exports.RevertVizSelection = 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 = ToolbarButtons = {})); +var Toolbar; +(function (Toolbar) { + Toolbar["Top"] = "top"; + Toolbar["Bottom"] = "bottom"; + Toolbar["Hidden"] = "hidden"; +})(Toolbar || (exports.Toolbar = Toolbar = {})); +var SheetSizeBehavior; +(function (SheetSizeBehavior) { + SheetSizeBehavior["Automatic"] = "automatic"; + SheetSizeBehavior["Exactly"] = "exactly"; + SheetSizeBehavior["Range"] = "range"; + SheetSizeBehavior["AtLeast"] = "atleast"; + SheetSizeBehavior["AtMost"] = "atmost"; +})(SheetSizeBehavior || (exports.SheetSizeBehavior = SheetSizeBehavior = {})); +var PulseLayout; +(function (PulseLayout) { + PulseLayout["Default"] = "default"; + PulseLayout["Card"] = "card"; + PulseLayout["Ban"] = "ban"; +})(PulseLayout || (exports.PulseLayout = 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 = PulseTimeDimension = {})); +var PulseErrorMessageVisibility; +(function (PulseErrorMessageVisibility) { + PulseErrorMessageVisibility["Visible"] = "visible"; + PulseErrorMessageVisibility["Hidden"] = "hidden"; + PulseErrorMessageVisibility["Suppressed"] = "suppressed"; +})(PulseErrorMessageVisibility || (exports.PulseErrorMessageVisibility = 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 = 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 = 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 = 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 })); +exports.PulseChildElementAttributes = exports.PulseChildElements = exports.PulseAttributes = void 0; +/** + * 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 = 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 = 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 = PulseChildElementAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/TableauError.js": +/*!**************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/TableauError.js ***! + \**************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../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 })); +exports.VizChildElementAttributes = exports.VizChildElements = exports.VizAuthoringAttributes = exports.VizAttributes = exports.VizSharedAttributes = void 0; +/** + * 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 = 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 = 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 = 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 = VizChildElements = {})); +var VizChildElementAttributes; +(function (VizChildElementAttributes) { + VizChildElementAttributes["Field"] = "field"; + VizChildElementAttributes["Value"] = "value"; + VizChildElementAttributes["Name"] = "name"; +})(VizChildElementAttributes || (exports.VizChildElementAttributes = VizChildElementAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/VizQLDataServiceInterfaces.js": +/*!****************************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/VizQLDataServiceInterfaces.js ***! + \****************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../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 })); +exports.WebComponentChildElementAttributes = exports.WebComponentChildElements = exports.EmbeddedIframeAttributes = exports.WebComponentAttributes = void 0; +/** + * 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 = 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 = 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 = WebComponentChildElements = {})); +var WebComponentChildElementAttributes; +(function (WebComponentChildElementAttributes) { + WebComponentChildElementAttributes["Field"] = "field"; + WebComponentChildElementAttributes["Value"] = "value"; + WebComponentChildElementAttributes["Name"] = "name"; +})(WebComponentChildElementAttributes || (exports.WebComponentChildElementAttributes = WebComponentChildElementAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Extensions/EventInterface.js": +/*!*****************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Extensions/EventInterface.js ***! + \*****************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../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 extension. + */ + 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 = {})); + /** + * The media type of the exported content. + */ + let ExportedMediaType; + (function (ExportedMediaType) { + ExportedMediaType["Image"] = "image"; + ExportedMediaType["Pdf"] = "pdf"; + ExportedMediaType["Svg"] = "svg"; + ExportedMediaType["Html"] = "html"; + ExportedMediaType["PowerPoint"] = "powerpoint"; + ExportedMediaType["Excel"] = "excel"; + })(ExportedMediaType = Tableau.ExportedMediaType || (Tableau.ExportedMediaType = {})); + /** + * 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 {@link Parameter} objects. */ + TableauEventType["ParameterChanged"] = "parameter-changed"; + /** Settings have been changed for this extension. You can use this event type with {@link 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/Extensions/Namespaces/UI.js": +/*!****************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/UI.js ***! + \****************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Extensions/ParameterInterfaces.js": +/*!**********************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Extensions/ParameterInterfaces.js ***! + \**********************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Extensions/TableauError.js": +/*!***************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Extensions/TableauError.js ***! + \***************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/AnnotationInterfaces.js": +/*!*******************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/AnnotationInterfaces.js ***! + \*******************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/DataSourceInterfaces.js": +/*!*******************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/DataSourceInterfaces.js ***! + \*******************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/DataTableInterfaces.js": +/*!******************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/DataTableInterfaces.js ***! + \******************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../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 })); +exports.SharedErrorCodes = void 0; +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 = SharedErrorCodes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/EnvironmentInterfaces.js": +/*!********************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/EnvironmentInterfaces.js ***! + \********************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/FilterInterfaces.js": +/*!***************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/FilterInterfaces.js ***! + \***************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../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 = {})); + let DataFormatType; + (function (DataFormatType) { + DataFormatType["AutoFormat"] = "auto-format"; + DataFormatType["SystemNumber"] = "system-number"; + DataFormatType["SystemCurrency"] = "system-currency"; + DataFormatType["SystemLongDate"] = "system-long-date"; + DataFormatType["SystemShortDate"] = "system-short-date"; + DataFormatType["SystemTime"] = "system-time"; + DataFormatType["Custom"] = "custom"; + DataFormatType["CustomNumber"] = "custom-number"; + DataFormatType["CustomCurrency"] = "custom-currency"; + DataFormatType["CustomScientific"] = "custom-scientific"; + DataFormatType["CustomPercentage"] = "custom-percentage"; + })(DataFormatType = Tableau.DataFormatType || (Tableau.DataFormatType = {})); + let NumberFormatUnits; + (function (NumberFormatUnits) { + NumberFormatUnits["None"] = "units-none"; + NumberFormatUnits["Thousands"] = "units-thousands"; + NumberFormatUnits["Millions"] = "units-millions"; + NumberFormatUnits["BillionsEnglish"] = "units-billions-english"; + NumberFormatUnits["BillionsStandard"] = "units-billions-standard"; + })(NumberFormatUnits = Tableau.NumberFormatUnits || (Tableau.NumberFormatUnits = {})); + let NegativeNumberFormat; + (function (NegativeNumberFormat) { + NegativeNumberFormat["Automatic"] = "automatic"; + NegativeNumberFormat["Parentheses"] = "parentheses"; + NegativeNumberFormat["OuterPrefix"] = "outer-prefix"; + NegativeNumberFormat["OuterSuffix"] = "outer-suffix"; + NegativeNumberFormat["InnerPrefix"] = "inner-prefix"; + NegativeNumberFormat["InnerSuffix"] = "inner-suffix"; + })(NegativeNumberFormat = Tableau.NegativeNumberFormat || (Tableau.NegativeNumberFormat = {})); + /** + * 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["IsoYears"] = "iso-years"; + PeriodType["IsoQuarters"] = "iso-quarters"; + PeriodType["IsoWeeks"] = "iso-weeks"; + })(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/ExternalContract/Shared/SelectionInterfaces.js": +/*!******************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/SelectionInterfaces.js ***! + \******************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/SheetInterfaces.js": +/*!**************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/SheetInterfaces.js ***! + \**************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/VisualModelInterface.js": +/*!*******************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/VisualModelInterface.js ***! + \*******************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/WorkbookFormattingInterfaces.js": +/*!***************************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/WorkbookFormattingInterfaces.js ***! + \***************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/SharedApiExternalContract.js": +/*!************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/SharedApiExternalContract.js ***! + \************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +// This file re-exports everything which is part of the shared api public interface +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ZoneVisibilityType = exports.TrendLineModelType = exports.SortDirection = exports.SheetType = exports.SelectOptions = exports.SelectionUpdateType = exports.ReplaySpeedType = exports.QuickTableCalcType = exports.PeriodType = exports.ParameterValueType = exports.NumberFormatUnits = exports.NegativeNumberFormat = exports.MarkType = exports.IncludeDataValuesOption = exports.HierarchicalLevelSelectionState = exports.FilterUpdateType = exports.FilterType = exports.FilterNullOption = exports.FilterDomainType = exports.FieldRoleType = exports.FieldAggregationType = exports.EncodingType = exports.DialogStyle = exports.DateRangeType = exports.DataType = exports.DataFormatType = exports.DashboardObjectVisibilityType = exports.DashboardObjectType = exports.DashboardLayoutChange = exports.ColumnType = exports.ClassNameKey = exports.AnnotationType = exports.AnalyticsObjectType = void 0; +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/AnnotationInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Shared/AnnotationInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/DataSourceInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Shared/DataSourceInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/DataTableInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Shared/DataTableInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/Enums */ "../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/EnvironmentInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Shared/EnvironmentInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/FilterInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Shared/FilterInterfaces.js"), exports); +var Tableau_1 = __webpack_require__(/*! ./ExternalContract/Shared/Namespaces/Tableau */ "../api-external-contract-js/lib/src/ExternalContract/Shared/Namespaces/Tableau.js"); +Object.defineProperty(exports, "AnalyticsObjectType", ({ enumerable: true, get: function () { return Tableau_1.AnalyticsObjectType; } })); +Object.defineProperty(exports, "AnnotationType", ({ enumerable: true, get: function () { return Tableau_1.AnnotationType; } })); +Object.defineProperty(exports, "ClassNameKey", ({ enumerable: true, get: function () { return Tableau_1.ClassNameKey; } })); +Object.defineProperty(exports, "ColumnType", ({ enumerable: true, get: function () { return Tableau_1.ColumnType; } })); +Object.defineProperty(exports, "DashboardLayoutChange", ({ enumerable: true, get: function () { return Tableau_1.DashboardLayoutChange; } })); +Object.defineProperty(exports, "DashboardObjectType", ({ enumerable: true, get: function () { return Tableau_1.DashboardObjectType; } })); +Object.defineProperty(exports, "DashboardObjectVisibilityType", ({ enumerable: true, get: function () { return Tableau_1.DashboardObjectVisibilityType; } })); +Object.defineProperty(exports, "DataFormatType", ({ enumerable: true, get: function () { return Tableau_1.DataFormatType; } })); +Object.defineProperty(exports, "DataType", ({ enumerable: true, get: function () { return Tableau_1.DataType; } })); +Object.defineProperty(exports, "DateRangeType", ({ enumerable: true, get: function () { return Tableau_1.DateRangeType; } })); +Object.defineProperty(exports, "DialogStyle", ({ enumerable: true, get: function () { return Tableau_1.DialogStyle; } })); +Object.defineProperty(exports, "EncodingType", ({ enumerable: true, get: function () { return Tableau_1.EncodingType; } })); +Object.defineProperty(exports, "FieldAggregationType", ({ enumerable: true, get: function () { return Tableau_1.FieldAggregationType; } })); +Object.defineProperty(exports, "FieldRoleType", ({ enumerable: true, get: function () { return Tableau_1.FieldRoleType; } })); +Object.defineProperty(exports, "FilterDomainType", ({ enumerable: true, get: function () { return Tableau_1.FilterDomainType; } })); +Object.defineProperty(exports, "FilterNullOption", ({ enumerable: true, get: function () { return Tableau_1.FilterNullOption; } })); +Object.defineProperty(exports, "FilterType", ({ enumerable: true, get: function () { return Tableau_1.FilterType; } })); +Object.defineProperty(exports, "FilterUpdateType", ({ enumerable: true, get: function () { return Tableau_1.FilterUpdateType; } })); +Object.defineProperty(exports, "HierarchicalLevelSelectionState", ({ enumerable: true, get: function () { return Tableau_1.HierarchicalLevelSelectionState; } })); +Object.defineProperty(exports, "IncludeDataValuesOption", ({ enumerable: true, get: function () { return Tableau_1.IncludeDataValuesOption; } })); +Object.defineProperty(exports, "MarkType", ({ enumerable: true, get: function () { return Tableau_1.MarkType; } })); +Object.defineProperty(exports, "NegativeNumberFormat", ({ enumerable: true, get: function () { return Tableau_1.NegativeNumberFormat; } })); +Object.defineProperty(exports, "NumberFormatUnits", ({ enumerable: true, get: function () { return Tableau_1.NumberFormatUnits; } })); +Object.defineProperty(exports, "ParameterValueType", ({ enumerable: true, get: function () { return Tableau_1.ParameterValueType; } })); +Object.defineProperty(exports, "PeriodType", ({ enumerable: true, get: function () { return Tableau_1.PeriodType; } })); +Object.defineProperty(exports, "QuickTableCalcType", ({ enumerable: true, get: function () { return Tableau_1.QuickTableCalcType; } })); +Object.defineProperty(exports, "ReplaySpeedType", ({ enumerable: true, get: function () { return Tableau_1.ReplaySpeedType; } })); +Object.defineProperty(exports, "SelectionUpdateType", ({ enumerable: true, get: function () { return Tableau_1.SelectionUpdateType; } })); +Object.defineProperty(exports, "SelectOptions", ({ enumerable: true, get: function () { return Tableau_1.SelectOptions; } })); +Object.defineProperty(exports, "SheetType", ({ enumerable: true, get: function () { return Tableau_1.SheetType; } })); +Object.defineProperty(exports, "SortDirection", ({ enumerable: true, get: function () { return Tableau_1.SortDirection; } })); +Object.defineProperty(exports, "TrendLineModelType", ({ enumerable: true, get: function () { return Tableau_1.TrendLineModelType; } })); +Object.defineProperty(exports, "ZoneVisibilityType", ({ enumerable: true, get: function () { return Tableau_1.ZoneVisibilityType; } })); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/SelectionInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Shared/SelectionInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/SheetInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Shared/SheetInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/VisualModelInterface */ "../api-external-contract-js/lib/src/ExternalContract/Shared/VisualModelInterface.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/WorkbookFormattingInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Shared/WorkbookFormattingInterfaces.js"), exports); + + +/***/ }), + +/***/ "../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":196,"fix":0}'); + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/JsApiInternalContract.js": +/*!********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/JsApiInternalContract.js ***! + \********************************************************************/ +/***/ (function(__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. + */ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.MESSAGING_VERSION = exports.INTERNAL_CONTRACT_VERSION = void 0; +// 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; +__exportStar(__webpack_require__(/*! ./contract/DataTypeConverter */ "../api-internal-contract-js/lib/src/contract/DataTypeConverter.js"), exports); +__exportStar(__webpack_require__(/*! ./contract/Enums */ "../api-internal-contract-js/lib/src/contract/Enums.js"), exports); +__exportStar(__webpack_require__(/*! ./contract/Models */ "../api-internal-contract-js/lib/src/contract/Models.js"), exports); +__exportStar(__webpack_require__(/*! ./contract/Notifications */ "../api-internal-contract-js/lib/src/contract/Notifications.js"), exports); +__exportStar(__webpack_require__(/*! ./contract/Parameters */ "../api-internal-contract-js/lib/src/contract/Parameters.js"), exports); +__exportStar(__webpack_require__(/*! ./contract/Verbs */ "../api-internal-contract-js/lib/src/contract/Verbs.js"), exports); +__exportStar(__webpack_require__(/*! ./interface/AskDataInterface */ "../api-internal-contract-js/lib/src/interface/AskDataInterface.js"), exports); +__exportStar(__webpack_require__(/*! ./interface/InitializationOptions */ "../api-internal-contract-js/lib/src/interface/InitializationOptions.js"), exports); +__exportStar(__webpack_require__(/*! ./interface/InternalApiDispatcher */ "../api-internal-contract-js/lib/src/interface/InternalApiDispatcher.js"), exports); +__exportStar(__webpack_require__(/*! ./interface/PulseInterface */ "../api-internal-contract-js/lib/src/interface/PulseInterface.js"), exports); +__exportStar(__webpack_require__(/*! ./interface/VersionNumber */ "../api-internal-contract-js/lib/src/interface/VersionNumber.js"), exports); +__exportStar(__webpack_require__(/*! ./interface/VqlInterface */ "../api-internal-contract-js/lib/src/interface/VqlInterface.js"), exports); +__exportStar(__webpack_require__(/*! ./messaging/CrossFrameMessenger */ "../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js"), exports); +__exportStar(__webpack_require__(/*! ./messaging/interface/MessageDispatcher */ "../api-internal-contract-js/lib/src/messaging/interface/MessageDispatcher.js"), exports); +__exportStar(__webpack_require__(/*! ./messaging/interface/MessageListener */ "../api-internal-contract-js/lib/src/messaging/interface/MessageListener.js"), exports); +__exportStar(__webpack_require__(/*! ./messaging/interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"), exports); +__exportStar(__webpack_require__(/*! ./messaging/interface/Messenger */ "../api-internal-contract-js/lib/src/messaging/interface/Messenger.js"), exports); +__exportStar(__webpack_require__(/*! ./messaging/interface/PreparedMessage */ "../api-internal-contract-js/lib/src/messaging/interface/PreparedMessage.js"), exports); +__exportStar(__webpack_require__(/*! ./versioning/external/ExternalContractVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalContractVersionConverter.js"), exports); +__exportStar(__webpack_require__(/*! ./versioning/external/ExternalIdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js"), exports); +__exportStar(__webpack_require__(/*! ./versioning/external/ExternalVersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js"), exports); +__exportStar(__webpack_require__(/*! ./versioning/InternalContractVersionConverter */ "../api-internal-contract-js/lib/src/versioning/InternalContractVersionConverter.js"), exports); +__exportStar(__webpack_require__(/*! ./versioning/VersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js"), exports); +// 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 })); +exports.DataTypeConverter = void 0; +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 })); +exports.NegativeNumberFormat = exports.NumberFormatUnits = exports.DataFormatType = exports.PulseErrorMessageVisibility = exports.PulseTimeDimension = exports.EncodingType = exports.FitPages = exports.PageScalingOption = exports.ScaleMode = exports.PageOrientation = exports.PageSizeOption = exports.ApiShowDataTableFormat = exports.ExtensionDialogResult = exports.DateRangeType = exports.FilterType = exports.MarkType = exports.HierarchicalLevelSelectionState = exports.QuantitativeIncludedValues = exports.SelectOptions = exports.SelectionUpdateType = exports.FilterDomainType = exports.FilterNullOption = exports.DateStepPeriod = exports.DomainRestrictionType = exports.SheetType = exports.FilterUpdateType = exports.FieldRoleType = exports.FieldAggregationType = exports.ErrorCodes = exports.EncodedDataType = exports.DialogStyle = exports.DataType = exports.DashboardObjectType = exports.ColumnType = exports.AnnotateEnum = exports.ExportedMediaType = exports.ExtensionMode = exports.ExtensionContext = void 0; +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 = ExtensionContext = {})); +var ExtensionMode; +(function (ExtensionMode) { + ExtensionMode["Authoring"] = "authoring"; + ExtensionMode["Viewing"] = "viewing"; + ExtensionMode["Unknown"] = "unknown"; +})(ExtensionMode || (exports.ExtensionMode = ExtensionMode = {})); +var ExportedMediaType; +(function (ExportedMediaType) { + ExportedMediaType["Image"] = "image"; + ExportedMediaType["Pdf"] = "pdf"; + ExportedMediaType["Svg"] = "svg"; + ExportedMediaType["Html"] = "html"; + ExportedMediaType["PowerPoint"] = "powerpoint"; + ExportedMediaType["Excel"] = "excel"; +})(ExportedMediaType || (exports.ExportedMediaType = ExportedMediaType = {})); +var AnnotateEnum; +(function (AnnotateEnum) { + AnnotateEnum["Mark"] = "mark"; + AnnotateEnum["Point"] = "point"; + AnnotateEnum["Area"] = "area"; +})(AnnotateEnum || (exports.AnnotateEnum = AnnotateEnum = {})); +var ColumnType; +(function (ColumnType) { + ColumnType["Discrete"] = "discrete"; + ColumnType["Continuous"] = "continuous"; + ColumnType["Unknown"] = "unknown"; +})(ColumnType || (exports.ColumnType = 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 = 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 = DataType = {})); +var DialogStyle; +(function (DialogStyle) { + DialogStyle["Window"] = "window"; + DialogStyle["Modal"] = "modal"; + DialogStyle["Modeless"] = "modeless"; +})(DialogStyle || (exports.DialogStyle = DialogStyle = {})); +var EncodedDataType; +(function (EncodedDataType) { + EncodedDataType["Number"] = "number"; + EncodedDataType["String"] = "string"; + EncodedDataType["Date"] = "date"; + EncodedDataType["Boolean"] = "boolean"; +})(EncodedDataType || (exports.EncodedDataType = 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 = 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 = FieldAggregationType = {})); +var FieldRoleType; +(function (FieldRoleType) { + FieldRoleType["Dimension"] = "dimension"; + FieldRoleType["Measure"] = "measure"; + FieldRoleType["Unknown"] = "unknown"; +})(FieldRoleType || (exports.FieldRoleType = 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 = FilterUpdateType = {})); +var SheetType; +(function (SheetType) { + SheetType["Dashboard"] = "dashboard"; + SheetType["Story"] = "story"; + SheetType["Worksheet"] = "worksheet"; +})(SheetType || (exports.SheetType = SheetType = {})); +var DomainRestrictionType; +(function (DomainRestrictionType) { + DomainRestrictionType["All"] = "all"; + DomainRestrictionType["List"] = "list"; + DomainRestrictionType["Range"] = "range"; +})(DomainRestrictionType || (exports.DomainRestrictionType = 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["IsoYears"] = "iso-years"; + DateStepPeriod["IsoQuarters"] = "iso-quarters"; + DateStepPeriod["IsoWeeks"] = "iso-weeks"; +})(DateStepPeriod || (exports.DateStepPeriod = 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 = FilterNullOption = {})); +/** + * The type of filter domain + */ +var FilterDomainType; +(function (FilterDomainType) { + FilterDomainType["Relevant"] = "relevant"; + FilterDomainType["Database"] = "database"; +})(FilterDomainType || (exports.FilterDomainType = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = 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 = PulseTimeDimension = {})); +var PulseErrorMessageVisibility; +(function (PulseErrorMessageVisibility) { + PulseErrorMessageVisibility["Visible"] = "visible"; + PulseErrorMessageVisibility["Hidden"] = "hidden"; + PulseErrorMessageVisibility["Suppressed"] = "suppressed"; +})(PulseErrorMessageVisibility || (exports.PulseErrorMessageVisibility = PulseErrorMessageVisibility = {})); +var DataFormatType; +(function (DataFormatType) { + DataFormatType["AutoFormat"] = "auto-format"; + DataFormatType["SystemNumber"] = "system-number"; + DataFormatType["SystemCurrency"] = "system-currency"; + DataFormatType["SystemLongDate"] = "system-long-date"; + DataFormatType["SystemShortDate"] = "system-short-date"; + DataFormatType["SystemTime"] = "system-time"; + DataFormatType["Custom"] = "custom"; + DataFormatType["CustomNumber"] = "custom-number"; + DataFormatType["CustomCurrency"] = "custom-currency"; + DataFormatType["CustomScientific"] = "custom-scientific"; + DataFormatType["CustomPercentage"] = "custom-percentage"; +})(DataFormatType || (exports.DataFormatType = DataFormatType = {})); +var NumberFormatUnits; +(function (NumberFormatUnits) { + NumberFormatUnits["None"] = "units-none"; + NumberFormatUnits["Thousands"] = "units-thousands"; + NumberFormatUnits["Millions"] = "units-millions"; + NumberFormatUnits["BillionsEnglish"] = "units-billions-english"; + NumberFormatUnits["BillionsStandard"] = "units-billions-standard"; +})(NumberFormatUnits || (exports.NumberFormatUnits = NumberFormatUnits = {})); +var NegativeNumberFormat; +(function (NegativeNumberFormat) { + NegativeNumberFormat["Automatic"] = "automatic"; + NegativeNumberFormat["Parentheses"] = "parentheses"; + NegativeNumberFormat["OuterPrefix"] = "outer-prefix"; + NegativeNumberFormat["OuterSuffix"] = "outer-suffix"; + NegativeNumberFormat["InnerPrefix"] = "inner-prefix"; + NegativeNumberFormat["InnerSuffix"] = "inner-suffix"; +})(NegativeNumberFormat || (exports.NegativeNumberFormat = NegativeNumberFormat = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Models.js": +/*!**************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Models.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../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 })); +exports.NotificationId = void 0; +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 = 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 })); +exports.ParameterId = void 0; +// 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["ExtensionDialogUrlSource"] = "extension-dialog-url-source"; + ParameterId["ExtensionDialogW"] = "extension-dialog-width"; + ParameterId["ExtensionLocator"] = "extension-locator"; + ParameterId["ExtensionSettingsInfo"] = "extension-settings-info"; + ParameterId["ExtensionZoneId"] = "extension-zone-id"; + ParameterId["ExtensionMediaBlob"] = "extension-media-blob"; + ParameterId["HasExtensionRenderingTimedOut"] = "has-extension-rendering-timed-out"; + 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 = 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 })); +exports.VerbId = void 0; +// 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["ReportExtensionRenderComplete"] = "report-extension-render-complete"; + 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["SendMessageToParent"] = "send-message-to-parent"; + 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 = 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 })); +exports.AskDataOptionNames = void 0; +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 = AskDataOptionNames = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/InitializationOptions.js": +/*!******************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/InitializationOptions.js ***! + \******************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/InternalApiDispatcher.js": +/*!******************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/InternalApiDispatcher.js ***! + \******************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../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 })); +exports.PulseOptionNames = void 0; +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["EmbedCount"] = ":embcount"; + PulseOptionNames["PulseWebComponent"] = ":pulseWebComponent"; +})(PulseOptionNames || (exports.PulseOptionNames = PulseOptionNames = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/VersionNumber.js": +/*!**********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/VersionNumber.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../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 })); +exports.VizOptionNames = void 0; +/** + * 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_COUNT"] = ":embcount"; + 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["EmbedCount"] = ":embcount"; + 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 = 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 })); +exports.CrossFrameMessenger = void 0; +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 (!(0, 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 (!(0, MessageTypeChecks_1.isInitMessage)(message) || !this.initializeMessageHandler) { + return; + } + this.initializeMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.CommandResponse: { + if (!(0, MessageTypeChecks_1.isCommandResponseMessage)(message) || !this.commandResponseMessageHandler) { + return; + } + this.commandResponseMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Command: { + if (!(0, MessageTypeChecks_1.isCommandMessage)(message) || !this.commandMessageHandler) { + return; + } + this.commandMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Notification: { + if (!(0, MessageTypeChecks_1.isNotificationMessage)(message) || !this.notificationMessageHandler) { + return; + } + this.notificationMessageHandler(message, event.source); + break; + } + case MessageTypes_1.MessageType.Handshake: { + if (!(0, 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 })); +exports.CrossFramePreparedMessage = void 0; +/** + * 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 })); +exports.isMessage = isMessage; +exports.isVersion = isVersion; +exports.isInitMessage = isInitMessage; +exports.isCommandResponseMessage = isCommandResponseMessage; +exports.isCommandMessage = isCommandMessage; +exports.isNotificationMessage = isNotificationMessage; +exports.isHandshakeMessage = isHandshakeMessage; +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; +} +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; +} +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; +} +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; +} +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; +} +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; +} +function isHandshakeMessage(message) { + if (!isMessage(message)) { + return false; + } + const handshakeMessage = message; + if (handshakeMessage.msgType !== MessageTypes_1.MessageType.Handshake) { + return false; + } + return true; +} + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/interface/MessageDispatcher.js": +/*!************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/interface/MessageDispatcher.js ***! + \************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/interface/MessageListener.js": +/*!**********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/interface/MessageListener.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../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 })); +exports.MessageType = void 0; +/** + * 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 = MessageType = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/interface/Messenger.js": +/*!****************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/interface/Messenger.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/interface/PreparedMessage.js": +/*!**********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/interface/PreparedMessage.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../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 })); +exports.IdentityVersionConverter = void 0; +// 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/InternalContractVersionConverter.js": +/*!******************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/InternalContractVersionConverter.js ***! + \******************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../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 })); +exports.StackingVersionConverter = void 0; +// 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 _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); + } + /** + * 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}`); + } + } + 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 })); +exports.NotificationMinorDowngrades = exports.ExecuteMinorDowngrades = exports.ExecuteMinorUpgrades = void 0; +exports.VersionLessThan = VersionLessThan; +exports.VersionEqualTo = VersionEqualTo; +exports.CreateVersionConverter = CreateVersionConverter; +exports.CreateVersionConverterWithTranslators = CreateVersionConverterWithTranslators; +exports.GetMaximumMinorIndex = GetMaximumMinorIndex; +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; +} +/** + * @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; +} +// 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: [], // Note that we put upgrades from 1.9 to 1.10 in the [1][9] bucket + }, +}; +exports.ExecuteMinorDowngrades = { + 1: { + 5: [VersionTranslations_1.DowngradeWorksheetNames], + 9: [], + 175: [VersionTranslations_1.DowngradeWorksheetFomatting175], + 182: [VersionTranslations_1.DowngradeExtensionEnvironmentContext], + 189: [VersionTranslations_1.DowngradePeriodType], + }, +}; +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); +} +/** + * 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); +} +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)); +} + + +/***/ }), + +/***/ "../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 })); +exports.DowngradeWorksheetFomattingNotification175 = exports.DowngradeWorksheetFomatting175 = void 0; +exports.DowngradeWorksheetNames = DowngradeWorksheetNames; +exports.DowngradeFlipboardZoneID = DowngradeFlipboardZoneID; +exports.DowngradeExtensionEnvironmentContext = DowngradeExtensionEnvironmentContext; +exports.DowngradePeriodType = DowngradePeriodType; +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; +} +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; +} +// Filter out formatting sheets that are specified in the classNames list +function DowngradeWorksheetFormatting(executeResponse, classNames) { + var _a; + const bootstrapInfo = executeResponse.result; + if ((_a = bootstrapInfo === null || bootstrapInfo === void 0 ? void 0 : bootstrapInfo.extensionWorksheetInfo) === null || _a === void 0 ? void 0 : _a.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" /* ClassNameKey.RowDividers */, "tableau-column-dividers" /* ClassNameKey.ColumnDividers */, "tableau-pane" /* ClassNameKey.Pane */]; +const DowngradeWorksheetFomatting175 = (response) => DowngradeWorksheetFormatting(response, ClassNameKeysToFilter175); +exports.DowngradeWorksheetFomatting175 = DowngradeWorksheetFomatting175; +const DowngradeWorksheetFomattingNotification175 = (notification) => DowngradeWorksheetFormattingNotification(notification, ClassNameKeysToFilter175); +exports.DowngradeWorksheetFomattingNotification175 = DowngradeWorksheetFomattingNotification175; +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; +} +function HandleDowngradePeriodTypeForParameter(parameter) { + if (parameter.allowableValuesType === JsApiInternalContract_1.DomainRestrictionType.Range) { + if (parameter.dateStepPeriod === JsApiInternalContract_1.DateStepPeriod.IsoYears) { + parameter.dateStepPeriod = JsApiInternalContract_1.DateStepPeriod.Years; + } + else if (parameter.dateStepPeriod === JsApiInternalContract_1.DateStepPeriod.IsoQuarters) { + parameter.dateStepPeriod = JsApiInternalContract_1.DateStepPeriod.Quarters; + } + else if (parameter.dateStepPeriod === JsApiInternalContract_1.DateStepPeriod.IsoWeeks) { + parameter.dateStepPeriod = JsApiInternalContract_1.DateStepPeriod.Weeks; + } + } +} +function DowngradePeriodType(executeResponse) { + if (Array.isArray(executeResponse.result)) { + const parameters = executeResponse.result; + for (const parameter of parameters) { + HandleDowngradePeriodTypeForParameter(parameter); + } + } + else { + const parameter = executeResponse.result; + HandleDowngradePeriodTypeForParameter(parameter); + } + return executeResponse; +} + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalContractVersionConverter.js": +/*!***************************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalContractVersionConverter.js ***! + \***************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../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 })); +exports.ExternalIdentityVersionConverter = void 0; +// 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 })); +exports.ExternalStackingVersionConverter = void 0; +// 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 })); +exports.ExecuteMinorUpgradeNotification = exports.ExecuteMinorUpgradeReturnExternal = exports.ExecuteMinorDowngradeCallExternal = void 0; +exports.CreateExternalCompatibleVersionConverter = CreateExternalCompatibleVersionConverter; +exports.CreateExternalCompatibleVersionConverterWithTranslators = CreateExternalCompatibleVersionConverterWithTranslators; +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: [], // Note that we put downgrades from 1.10 to 1.9 in the [1][9] bucket + }, +}; +exports.ExecuteMinorUpgradeReturnExternal = { + 1: { + 9: [], // Note that we put upgrades from 1.9 to 1.10 in the [1][9] bucket + }, +}; +exports.ExecuteMinorUpgradeNotification = { + 1: { + 9: [], // Note that we put upgrades from 1.9 to 1.10 in the [1][9] bucket + }, +}; +/** + * 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); +} +/** + * 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 || (0, 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); +} +function GetNeededExternalTranslations(platformMajorVersion, platformMinorVersion, majorMinorTranslators) { + const neededTranslations = []; + if (platformMajorVersion in majorMinorTranslators) { + const start = platformMinorVersion; + const maximumMinorVersion = (0, 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 ***! + \*********************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { + +"use strict"; + +// Export everything which had been previously in the api-shared module +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VersionedExternalApiDispatcher = exports.VersionNumber = exports.SheetUtils = exports.ExportHelpers = exports.ErrorHelpers = exports.Deferred = exports.TableauError = exports.StoryActivationServiceImpl = exports.SizeServiceImpl = exports.ServiceImplBase = exports.Registration = exports.NotificationServiceImplBase = exports.NotificationServiceImpl = exports.ClientInfoServiceImpl = exports.Point = exports.WorksheetImpl = exports.WorkbookImpl = exports.StoryPointInfoImpl = exports.StoryPointImpl = exports.StoryImpl = exports.SingleEventManagerImpl = exports.SheetInfoImpl = exports.SheetImpl = exports.ParameterImpl = exports.DataSourceImpl = exports.DashboardObjectImpl = exports.DashboardImpl = exports.CustomViewImpl = exports.Field = exports.EventListenerManager = exports.InternalToExternalEnumMappings = exports.ExternalToInternalEnumMappings = exports.DataSource = exports.CrossFrameDispatcher = exports.ApiVersion = void 0; +var ApiVersion_1 = __webpack_require__(/*! ./ApiShared/ApiVersion */ "../api-shared-js/lib/src/ApiShared/ApiVersion.js"); +Object.defineProperty(exports, "ApiVersion", ({ enumerable: true, get: function () { return ApiVersion_1.ApiVersion; } })); +__exportStar(__webpack_require__(/*! ./ApiShared/CrossFrame/CrossFrameBootstrap */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js"), exports); +var CrossFrameDispatcher_1 = __webpack_require__(/*! ./ApiShared/CrossFrame/CrossFrameDispatcher */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js"); +Object.defineProperty(exports, "CrossFrameDispatcher", ({ enumerable: true, get: function () { return CrossFrameDispatcher_1.CrossFrameDispatcher; } })); +var DataSource_1 = __webpack_require__(/*! ./ApiShared/DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); +Object.defineProperty(exports, "DataSource", ({ enumerable: true, get: function () { return DataSource_1.DataSource; } })); +var ExternalToInternalEnumMappings_1 = __webpack_require__(/*! ./ApiShared/EnumMappings/ExternalToInternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/ExternalToInternalEnumMappings.js"); +Object.defineProperty(exports, "ExternalToInternalEnumMappings", ({ enumerable: true, get: function () { return ExternalToInternalEnumMappings_1.ExternalToInternalEnumMappings; } })); +var InternalToExternalEnumMappings_1 = __webpack_require__(/*! ./ApiShared/EnumMappings/InternalToExternalEnumMappings */ "../api-shared-js/lib/src/ApiShared/EnumMappings/InternalToExternalEnumMappings.js"); +Object.defineProperty(exports, "InternalToExternalEnumMappings", ({ enumerable: true, get: function () { return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings; } })); +var EventListenerManager_1 = __webpack_require__(/*! ./ApiShared/EventListenerManager */ "../api-shared-js/lib/src/ApiShared/EventListenerManager.js"); +Object.defineProperty(exports, "EventListenerManager", ({ enumerable: true, get: function () { return EventListenerManager_1.EventListenerManager; } })); +var Field_1 = __webpack_require__(/*! ./ApiShared/Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); +Object.defineProperty(exports, "Field", ({ enumerable: true, get: function () { return Field_1.Field; } })); +var CustomViewImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/CustomViewImpl */ "../api-shared-js/lib/src/ApiShared/Impl/CustomViewImpl.js"); +Object.defineProperty(exports, "CustomViewImpl", ({ enumerable: true, get: function () { return CustomViewImpl_1.CustomViewImpl; } })); +var DashboardImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DashboardImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardImpl.js"); +Object.defineProperty(exports, "DashboardImpl", ({ enumerable: true, get: function () { return DashboardImpl_1.DashboardImpl; } })); +var DashboardObjectImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DashboardObjectImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DashboardObjectImpl.js"); +Object.defineProperty(exports, "DashboardObjectImpl", ({ enumerable: true, get: function () { return DashboardObjectImpl_1.DashboardObjectImpl; } })); +var DataSourceImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/DataSourceImpl */ "../api-shared-js/lib/src/ApiShared/Impl/DataSourceImpl.js"); +Object.defineProperty(exports, "DataSourceImpl", ({ enumerable: true, get: function () { return DataSourceImpl_1.DataSourceImpl; } })); +var ParameterImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/ParameterImpl */ "../api-shared-js/lib/src/ApiShared/Impl/ParameterImpl.js"); +Object.defineProperty(exports, "ParameterImpl", ({ enumerable: true, get: function () { return ParameterImpl_1.ParameterImpl; } })); +var SheetImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetImpl.js"); +Object.defineProperty(exports, "SheetImpl", ({ enumerable: true, get: function () { return SheetImpl_1.SheetImpl; } })); +var SheetInfoImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SheetInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SheetInfoImpl.js"); +Object.defineProperty(exports, "SheetInfoImpl", ({ enumerable: true, get: function () { return SheetInfoImpl_1.SheetInfoImpl; } })); +var SingleEventManagerImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/SingleEventManagerImpl */ "../api-shared-js/lib/src/ApiShared/Impl/SingleEventManagerImpl.js"); +Object.defineProperty(exports, "SingleEventManagerImpl", ({ enumerable: true, get: function () { return SingleEventManagerImpl_1.SingleEventManagerImpl; } })); +var StoryImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryImpl.js"); +Object.defineProperty(exports, "StoryImpl", ({ enumerable: true, get: function () { return StoryImpl_1.StoryImpl; } })); +var StoryPointImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryPointImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointImpl.js"); +Object.defineProperty(exports, "StoryPointImpl", ({ enumerable: true, get: function () { return StoryPointImpl_1.StoryPointImpl; } })); +var StoryPointInfoImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/StoryPointInfoImpl */ "../api-shared-js/lib/src/ApiShared/Impl/StoryPointInfoImpl.js"); +Object.defineProperty(exports, "StoryPointInfoImpl", ({ enumerable: true, get: function () { return StoryPointInfoImpl_1.StoryPointInfoImpl; } })); +var WorkbookImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/WorkbookImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorkbookImpl.js"); +Object.defineProperty(exports, "WorkbookImpl", ({ enumerable: true, get: function () { return WorkbookImpl_1.WorkbookImpl; } })); +var WorksheetImpl_1 = __webpack_require__(/*! ./ApiShared/Impl/WorksheetImpl */ "../api-shared-js/lib/src/ApiShared/Impl/WorksheetImpl.js"); +Object.defineProperty(exports, "WorksheetImpl", ({ enumerable: true, get: function () { return WorksheetImpl_1.WorksheetImpl; } })); +var Point_1 = __webpack_require__(/*! ./ApiShared/Point */ "../api-shared-js/lib/src/ApiShared/Point.js"); +Object.defineProperty(exports, "Point", ({ enumerable: true, get: function () { return Point_1.Point; } })); +__exportStar(__webpack_require__(/*! ./ApiShared/Services/RegisterAllSharedServices */ "../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js"), exports); +__exportStar(__webpack_require__(/*! ./ApiShared/Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"), exports); +var ClientInfoServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/ClientInfoServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js"); +Object.defineProperty(exports, "ClientInfoServiceImpl", ({ enumerable: true, get: function () { return ClientInfoServiceImpl_1.ClientInfoServiceImpl; } })); +var NotificationServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/NotificationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js"); +Object.defineProperty(exports, "NotificationServiceImpl", ({ enumerable: true, get: function () { return NotificationServiceImpl_1.NotificationServiceImpl; } })); +var NotificationServiceImplBase_1 = __webpack_require__(/*! ./ApiShared/Services/impl/NotificationServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js"); +Object.defineProperty(exports, "NotificationServiceImplBase", ({ enumerable: true, get: function () { return NotificationServiceImplBase_1.NotificationServiceImplBase; } })); +Object.defineProperty(exports, "Registration", ({ enumerable: true, get: function () { return NotificationServiceImplBase_1.Registration; } })); +var ServiceImplBase_1 = __webpack_require__(/*! ./ApiShared/Services/impl/ServiceImplBase */ "../api-shared-js/lib/src/ApiShared/Services/impl/ServiceImplBase.js"); +Object.defineProperty(exports, "ServiceImplBase", ({ enumerable: true, get: function () { return ServiceImplBase_1.ServiceImplBase; } })); +var SizeServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/SizeServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js"); +Object.defineProperty(exports, "SizeServiceImpl", ({ enumerable: true, get: function () { return SizeServiceImpl_1.SizeServiceImpl; } })); +var StoryActivationServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/StoryActivationServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/StoryActivationServiceImpl.js"); +Object.defineProperty(exports, "StoryActivationServiceImpl", ({ enumerable: true, get: function () { return StoryActivationServiceImpl_1.StoryActivationServiceImpl; } })); +var TableauError_1 = __webpack_require__(/*! ./ApiShared/TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); +Object.defineProperty(exports, "TableauError", ({ enumerable: true, get: function () { return TableauError_1.TableauError; } })); +var Deferred_1 = __webpack_require__(/*! ./ApiShared/Utils/Deferred */ "../api-shared-js/lib/src/ApiShared/Utils/Deferred.js"); +Object.defineProperty(exports, "Deferred", ({ enumerable: true, get: function () { return Deferred_1.Deferred; } })); +var ErrorHelpers_1 = __webpack_require__(/*! ./ApiShared/Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +Object.defineProperty(exports, "ErrorHelpers", ({ enumerable: true, get: function () { return ErrorHelpers_1.ErrorHelpers; } })); +var ExportHelpers_1 = __webpack_require__(/*! ./ApiShared/Utils/ExportHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js"); +Object.defineProperty(exports, "ExportHelpers", ({ enumerable: true, get: function () { return ExportHelpers_1.ExportHelpers; } })); +var SheetUtils_1 = __webpack_require__(/*! ./ApiShared/Utils/SheetUtils */ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js"); +Object.defineProperty(exports, "SheetUtils", ({ enumerable: true, get: function () { return SheetUtils_1.SheetUtils; } })); +var VersionNumber_1 = __webpack_require__(/*! ./ApiShared/VersionNumber */ "../api-shared-js/lib/src/ApiShared/VersionNumber.js"); +Object.defineProperty(exports, "VersionNumber", ({ enumerable: true, get: function () { return VersionNumber_1.VersionNumber; } })); +var VersionedExternalApiDispatcher_1 = __webpack_require__(/*! ./VersionedExternalApiDispatcher */ "../api-shared-js/lib/src/VersionedExternalApiDispatcher.js"); +Object.defineProperty(exports, "VersionedExternalApiDispatcher", ({ enumerable: true, get: function () { return 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 })); +exports.ApiVersion = void 0; +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 })); +exports.ConnectionSummary = void 0; +/** + * 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 })); +exports.doCrossFrameBootstrap = doCrossFrameBootstrap; +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(); + }); +} + + +/***/ }), + +/***/ "../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 })); +exports.CrossFrameDispatcher = void 0; +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 })); +exports.DataSource = void 0; +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 })); +exports.ExternalToInternalEnumMappings = void 0; +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, + [api_external_contract_js_1.PeriodType.IsoYears]: api_internal_contract_js_1.DateStepPeriod.IsoYears, + [api_external_contract_js_1.PeriodType.IsoQuarters]: api_internal_contract_js_1.DateStepPeriod.IsoQuarters, + [api_external_contract_js_1.PeriodType.IsoWeeks]: api_internal_contract_js_1.DateStepPeriod.IsoWeeks, +}); +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 })); +exports.InternalToExternalEnumMappings = void 0; +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.dataFormatType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.DataFormatType.AutoFormat]: api_external_contract_js_1.DataFormatType.AutoFormat, + [api_internal_contract_js_1.DataFormatType.SystemNumber]: api_external_contract_js_1.DataFormatType.SystemNumber, + [api_internal_contract_js_1.DataFormatType.SystemCurrency]: api_external_contract_js_1.DataFormatType.SystemCurrency, + [api_internal_contract_js_1.DataFormatType.SystemLongDate]: api_external_contract_js_1.DataFormatType.SystemLongDate, + [api_internal_contract_js_1.DataFormatType.SystemShortDate]: api_external_contract_js_1.DataFormatType.SystemShortDate, + [api_internal_contract_js_1.DataFormatType.SystemTime]: api_external_contract_js_1.DataFormatType.SystemTime, + [api_internal_contract_js_1.DataFormatType.Custom]: api_external_contract_js_1.DataFormatType.Custom, + [api_internal_contract_js_1.DataFormatType.CustomNumber]: api_external_contract_js_1.DataFormatType.CustomNumber, + [api_internal_contract_js_1.DataFormatType.CustomCurrency]: api_external_contract_js_1.DataFormatType.CustomCurrency, +}); +InternalToExternalEnumMappings.numberFormatUnits = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.NumberFormatUnits.None]: api_external_contract_js_1.NumberFormatUnits.None, + [api_internal_contract_js_1.NumberFormatUnits.Thousands]: api_external_contract_js_1.NumberFormatUnits.Thousands, + [api_internal_contract_js_1.NumberFormatUnits.Millions]: api_external_contract_js_1.NumberFormatUnits.Millions, + [api_internal_contract_js_1.NumberFormatUnits.BillionsEnglish]: api_external_contract_js_1.NumberFormatUnits.BillionsEnglish, + [api_internal_contract_js_1.NumberFormatUnits.BillionsStandard]: api_external_contract_js_1.NumberFormatUnits.BillionsStandard, +}); +InternalToExternalEnumMappings.negativeNumberFormat = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.NegativeNumberFormat.Automatic]: api_external_contract_js_1.NegativeNumberFormat.Automatic, + [api_internal_contract_js_1.NegativeNumberFormat.Parentheses]: api_external_contract_js_1.NegativeNumberFormat.Parentheses, + [api_internal_contract_js_1.NegativeNumberFormat.OuterPrefix]: api_external_contract_js_1.NegativeNumberFormat.OuterPrefix, + [api_internal_contract_js_1.NegativeNumberFormat.OuterSuffix]: api_external_contract_js_1.NegativeNumberFormat.OuterSuffix, + [api_internal_contract_js_1.NegativeNumberFormat.InnerPrefix]: api_external_contract_js_1.NegativeNumberFormat.InnerPrefix, + [api_internal_contract_js_1.NegativeNumberFormat.InnerSuffix]: api_external_contract_js_1.NegativeNumberFormat.InnerSuffix, +}); +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.exportedMediaType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.ExportedMediaType.Image]: api_external_contract_js_1.ExportedMediaType.Image, + [api_internal_contract_js_1.ExportedMediaType.Pdf]: api_external_contract_js_1.ExportedMediaType.Pdf, + [api_internal_contract_js_1.ExportedMediaType.Svg]: api_external_contract_js_1.ExportedMediaType.Svg, + [api_internal_contract_js_1.ExportedMediaType.Html]: api_external_contract_js_1.ExportedMediaType.Html, + [api_internal_contract_js_1.ExportedMediaType.PowerPoint]: api_external_contract_js_1.ExportedMediaType.PowerPoint, + [api_internal_contract_js_1.ExportedMediaType.Excel]: api_external_contract_js_1.ExportedMediaType.Excel, +}); +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, + [api_internal_contract_js_1.DateStepPeriod.IsoYears]: api_external_contract_js_1.PeriodType.IsoYears, + [api_internal_contract_js_1.DateStepPeriod.IsoQuarters]: api_external_contract_js_1.PeriodType.IsoQuarters, + [api_internal_contract_js_1.DateStepPeriod.IsoWeeks]: api_external_contract_js_1.PeriodType.IsoWeeks, +}); +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" /* InternalClassNameKey.DashboardTitle */]: api_external_contract_js_1.ClassNameKey.DashboardTitle, + ["tableau-story-title" /* InternalClassNameKey.StoryTitle */]: api_external_contract_js_1.ClassNameKey.StoryTitle, + ["tableau-tooltip" /* InternalClassNameKey.Tooltip */]: api_external_contract_js_1.ClassNameKey.Tooltip, + ["tableau-worksheet" /* InternalClassNameKey.Worksheet */]: api_external_contract_js_1.ClassNameKey.Worksheet, + ["tableau-worksheet-title" /* InternalClassNameKey.WorksheetTitle */]: api_external_contract_js_1.ClassNameKey.WorksheetTitle, + ["tableau-pane" /* InternalClassNameKey.Pane */]: api_external_contract_js_1.ClassNameKey.Pane, + ["tableau-row-dividers" /* InternalClassNameKey.RowDividers */]: api_external_contract_js_1.ClassNameKey.RowDividers, + ["tableau-column-dividers" /* InternalClassNameKey.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 })); +exports.EventListenerManager = void 0; +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 })); +exports.Field = void 0; +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; + } + get semanticRole() { + return this._fieldImpl.semanticRole; + } + get dataFormat() { + return this._fieldImpl.dataFormat; + } +} +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 })); +exports.CustomViewImpl = void 0; +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" /* ServiceNames.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 })); +exports.DashboardImpl = void 0; +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" /* ServiceNames.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" /* ServiceNames.Zone */); + return zoneService.moveAndResizeAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectPositionAndSizeUpdateArray); + } + replayAnimationAsync(replaySpeed) { + const animationService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("animation-service" /* ServiceNames.Animation */); + return animationService.replayAsync(replaySpeed); + } + getFiltersAsync() { + this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* ServiceNames.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" /* ServiceNames.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 })); +exports.DashboardObjectImpl = void 0; +/** + * 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 })); +exports.DataSourceImpl = void 0; +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" /* ServiceNames.DataSourceService */); + return dataSourceService.refreshAsync(this._dataSourceInfo.id); + } + getConnectionSummariesAsync() { + const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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 })); +exports.FieldImpl = void 0; +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) !== 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; + } + get semanticRole() { + return this._fieldInfo.semanticRole; + } + get dataFormat() { + return this._fieldInfo.dataFormat; + } +} +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 })); +exports.ParameterImpl = void 0; +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" /* ServiceNames.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 })); +exports.SheetImpl = void 0; +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" /* ServiceNames.Parameters */); + return service.findParameterByNameAsync(parameterName); + } + getParametersAsync() { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* ServiceNames.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" /* ServiceNames.Size */); + return sizeService.changeSizeAsync(this.name, processedNewSize).then(() => { + const clientInfoService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("client-info-service" /* ServiceNames.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) { + const { behavior, minSize: minSizeMaybe, maxSize: maxSizeMaybe } = newSize; + const hasMinWidth = !Param_1.Param.isNullOrUndefined(minSizeMaybe === null || minSizeMaybe === void 0 ? void 0 : minSizeMaybe.width); + const hasMinHeight = !Param_1.Param.isNullOrUndefined(minSizeMaybe === null || minSizeMaybe === void 0 ? void 0 : minSizeMaybe.height); + const hasMaxWidth = !Param_1.Param.isNullOrUndefined(maxSizeMaybe === null || maxSizeMaybe === void 0 ? void 0 : maxSizeMaybe.width); + const hasMaxHeight = !Param_1.Param.isNullOrUndefined(maxSizeMaybe === null || maxSizeMaybe === void 0 ? void 0 : maxSizeMaybe.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 })); +exports.SheetInfoImpl = void 0; +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, + // TODO - Stories + }; + } + 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 })); +exports.SingleEventManagerImpl = void 0; +/** + * 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 })); +exports.StoryImpl = void 0; +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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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 })); +exports.StoryPointImpl = void 0; +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 })); +exports.StoryPointInfoImpl = void 0; +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 })); +exports.WorkbookImpl = void 0; +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 })); +exports.WorksheetImpl = void 0; +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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.Filter */); + return service.applyRelativeDateFilterAsync(this.visualId, fieldName, options); + } + getDataSourcesAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* ServiceNames.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" /* ServiceNames.Filter */); + return service.getFiltersAsync(this.visualId); + } + getSelectedMarksAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* ServiceNames.GetData */); + return service.getSelectedMarksAsync(this.visualId); + } + getHighlightedMarksAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* ServiceNames.GetData */); + return service.getHighlightedMarksAsync(this.visualId); + } + getSummaryDataAsync(options) { + var _a; + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* ServiceNames.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) !== 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" /* ServiceNames.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) !== null && _a !== void 0 ? _a : false); + } + getVisualSpecificationAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.GetData */); + return service.getSummaryColumnsInfoAsync(this.visualId); + } + getUnderlyingDataAsync(options) { + var _a; + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* ServiceNames.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) !== null && _a !== void 0 ? _a : false); + } + getUnderlyingTablesAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* ServiceNames.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" /* ServiceNames.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) !== 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" /* ServiceNames.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) !== null && _a !== void 0 ? _a : false); + } + clearSelectedMarksAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.Annotation */); + return service.annotateMarkAsync(this.visualId, mark, annotationText); + } + getAnnotationsAsync() { + this.verifyActiveSheet(); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.Accessibility */); + return service.leaveMarkNavigationAsync(this.visualId); + } + editAliasesDialogAsync(fieldName) { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* ServiceNames.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 })); +exports.LogicalTable = void 0; +/** + * 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 })); +exports.TooltipTextRequestModel = void 0; +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 })); +exports.RangeDomain = exports.CategoricalDomain = exports.RelativeDateFilter = exports.RangeFilter = exports.HierarchicalFilter = exports.HierarchicalLevelDetail = exports.HierarchicalDataValue = exports.CategoricalFilter = exports.Filter = void 0; +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" /* ServiceNames.DataSourceService */); + return service.getFieldAsync(this._fieldId); + } + getAppliedWorksheetsAsync() { + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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" /* ServiceNames.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 })); +exports.DataValue = exports.Column = exports.MarkInfo = exports.DataTable = void 0; +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 })); +exports.DataTableReader = void 0; +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" /* ServiceNames.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" /* ServiceNames.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 })); +exports.HoverTupleInteractionModel = exports.SelectTuplesInteractionModel = exports.SelectionModelsContainer = exports.TupleSelectionModel = exports.DimensionSelectionModel = exports.RangeSelectionModel = exports.HierarchicalSelectionModel = exports.ValueSelectionModel = exports.SelectionModel = void 0; +/** + * 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 })); +exports.Point = void 0; +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 })); +exports.GetDataType = void 0; +/** + * Defines which type of getData call to make. + */ +var GetDataType; +(function (GetDataType) { + GetDataType["Summary"] = "summary"; + GetDataType["Underlying"] = "underlying"; +})(GetDataType || (exports.GetDataType = 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 })); +exports.registerAllSharedServices = registerAllSharedServices; +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)); +} + + +/***/ }), + +/***/ "../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 })); +exports.ApiServiceRegistry = void 0; +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 })); +exports.AccessibilityServiceImpl = void 0; +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" /* ServiceNames.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 })); +exports.AnimationServiceImpl = void 0; +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" /* ServiceNames.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 })); +exports.AnnotationServiceImpl = void 0; +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" /* ServiceNames.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 })); +exports.ClientInfoServiceImpl = void 0; +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" /* ServiceNames.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 })); +exports.DataSourceServiceImpl = void 0; +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" /* ServiceNames.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 })); +exports.ExportServiceImpl = void 0; +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 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 ExportHelpers_1 = __webpack_require__(/*! ../../Utils/ExportHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.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" /* ServiceNames.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, // send notification on pres layer that triggers file download + }; + // 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) !== 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; + }); + } + reportExtensionRenderComplete(mediaBlob) { + const params = { + [api_internal_contract_js_1.ParameterId.FunctionName]: api_internal_contract_js_1.VerbId.ReportExtensionRenderComplete, + [api_internal_contract_js_1.ParameterId.HasExtensionRenderingTimedOut]: false, + }; + if (mediaBlob) { + params[api_internal_contract_js_1.ParameterId.ExtensionMediaBlob] = mediaBlob; + } + return this.execute(api_internal_contract_js_1.VerbId.ReportExtensionRenderComplete, params).then(() => { + return; + }); + } +} +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 })); +exports.ExternalContextMenuServiceImpl = void 0; +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" /* ServiceNames.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 })); +exports.FilterServiceImpl = void 0; +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" /* ServiceNames.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) { + return __awaiter(this, void 0, void 0, function* () { + var _a; + 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_external_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_external_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_external_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 })); +exports.GetDataServiceImpl = void 0; +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 */ "../../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 = (0, uuid_1.v4)(); + } + get serviceName() { + return "get-data-service" /* ServiceNames.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 })); +exports.NotificationServiceImpl = void 0; +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" /* ServiceNames.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 })); +exports.NotificationServiceImplBase = exports.Registration = void 0; +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) { + 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 })); +exports.ParametersServiceImpl = void 0; +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" /* ServiceNames.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 })); +exports.SelectionServiceImpl = void 0; +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" /* ServiceNames.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 })); +exports.ServiceImplBase = void 0; +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 })); +exports.SizeServiceImpl = void 0; +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" /* ServiceNames.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 })); +exports.StoryActivationServiceImpl = void 0; +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" /* ServiceNames.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 })); +exports.VisualModelServiceImpl = void 0; +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" /* ServiceNames.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 })); +exports.VizServiceImpl = void 0; +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" /* ServiceNames.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 || '', // a falsey value means "show original view" + }; + return this.execute(api_internal_contract_js_1.VerbId.ShowCustomView, parameters).then((response) => { + const customView = response.result; + return (customView === null || customView === void 0 ? void 0 : customView.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 })); +exports.ZoneServiceImpl = void 0; +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" /* ServiceNames.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 })); +exports.TableSummary = void 0; +/** + * 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 })); +exports.TableauError = void 0; +/** + * 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 })); +exports.DataValueFactory = void 0; +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 })); +exports.UnregisterTimeoutInMilliseconds = exports.Deferred = void 0; +/** + * 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 })); +exports.ShouldThrow = exports.EnumConverter = void 0; +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 = 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 })); +exports.ErrorHelpers = void 0; +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 })); +exports.ExportHelpers = void 0; +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 })); +exports.Param = void 0; +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 })); +exports.SheetUtils = void 0; +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 })); +exports.ShortLivedDeferred = void 0; +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 })); +exports.VersionNumber = void 0; +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 })); +exports.VersionedExternalApiDispatcher = void 0; +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 = (0, 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 (0, 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; + + +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js": +/*!*********************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DashboardLayoutChangedEvent = void 0; +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 })); +exports.FilterChangedEvent = void 0; +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 })); +exports.MarksSelectedEvent = void 0; +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 })); +exports.ParameterChangedEvent = void 0; +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" /* ServiceNames.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 })); +exports.SummaryDataChangedEvent = void 0; +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 })); +exports.TableauEvent = void 0; +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 })); +exports.TableauSheetEvent = void 0; +const TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +class TableauSheetEvent extends TableauEvent_1.TableauEvent { + get sheet() { + return this._sheet; + } + constructor(type, sheet) { + super(type); + this._sheet = 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 })); +exports.TableauWorksheetEvent = void 0; +const TableauSheetEvent_1 = __webpack_require__(/*! ./TableauSheetEvent */ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js"); +class TableauWorksheetEvent extends TableauSheetEvent_1.TableauSheetEvent { + get worksheet() { + return this._worksheet; + } + constructor(type, _worksheet) { + super(type, _worksheet); + this._worksheet = _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 })); +exports.WorkbookFormattingChangedEvent = void 0; +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 })); +exports.WorksheetFormattingChangedEvent = void 0; +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.SupportedBentonSansFontFaces = exports.BentonSansMediumFontFaceName = exports.BentonSansLightFontFaceName = exports.BentonSansSemiDemiItalicFontFaceName = exports.BentonSansSemiDemiFontFaceName = exports.BentonSansBookItalicFontFaceName = exports.BentonSansBookFontFaceName = exports.BentonSansLowDPIFontFamilyName = exports.BentonSansFontFamilyName = void 0; +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 })); +exports.ConnectedServer = void 0; +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 })); +exports.ExtensionWorkbookImpl = void 0; +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" /* ServiceNames.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 ***! + \******************************************************/ +/***/ (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 })); +exports.ExtensionsImpl = void 0; +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) => { + const initOptions = { isAlpha: api_shared_js_1.ApiVersion.Instance.isAlpha, isExtensionDialog: isExtensionDialog }; + // 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); + desktopDispatcherPromise === null || desktopDispatcherPromise === void 0 ? void 0 : desktopDispatcherPromise.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); + (0, 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; + } + reportExtensionRenderComplete(mediaBlob) { + return __awaiter(this, void 0, void 0, function* () { + const exportService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("export-service" /* ServiceNames.Export */); + return exportService.reportExtensionRenderComplete(mediaBlob); + }); + } + createVizImageAsync(inputSpec) { + const vizService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("viz-service" /* ServiceNames.Viz */); + return vizService.createVizImageAsync(inputSpec); + } + setClickThroughAsync(clickThroughEnabled) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* ExtensionsServiceNames.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 + (0, 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" /* ExtensionsServiceNames.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. + (0, api_shared_js_1.registerAllSharedServices)(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId); + (0, 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(isExtensionDialog)); + 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" /* ServiceNames.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" /* ServiceNames.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 })); +exports.LegacyInternalApiDispatcherHolder = void 0; +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 + */ +var LegacyInternalApiDispatcherHolder; +(function (LegacyInternalApiDispatcherHolder) { + /** + * @param options + */ + function getDesktopDispatcherPromise(options) { + 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 ((options === null || options === void 0 ? void 0 : options.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 = 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 })); +exports.SettingsImpl = void 0; +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" /* ExtensionsServiceNames.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" /* ServiceNames.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) => { + var _a; + this._currentSettings = (_a = event.newSettings) !== null && _a !== void 0 ? _a : {}; + 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.SupportedTableauFontFaces = exports.TableauSemiBoldFontFaceName = exports.TableauRegularFontFaceName = exports.TableauMediumFontFaceName = exports.TableauLightFontFaceName = exports.TableauBoldFontFaceName = exports.TableauBookFontFaceName = exports.TableauBoldFontFamilyName = exports.TableauSemiboldFontFamilyName = exports.TableauMediumFontFamilyName = exports.TableauRegularFontFamilyName = exports.TableauLightFontFamilyName = exports.TableauBookFontFamilyName = void 0; +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 })); +exports.UIImpl = exports.TableauDialogError = exports.DialogMessageEvent = void 0; +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, sourceDialogUrl) { + super(Contract.TableauEventType.DialogMessageReceived); + this.message = message; + this.sourceDialogUrl = sourceDialogUrl; + } +} +exports.DialogMessageEvent = DialogMessageEvent; +/** + * Custom error class that extends the TableauError object. + * Includes context for which dialog caused the exception via its url. + */ +class TableauDialogError extends api_shared_js_1.TableauError { + constructor(_errorCode, message) { + super(_errorCode, message); + /*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, TableauDialogError.prototype); + } +} +exports.TableauDialogError = TableauDialogError; +class UIImpl { + constructor(isExtensionDialog) { + this.isExtensionDialog = isExtensionDialog; + } + displayDialogAsync(url, payload, options) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* ExtensionsServiceNames.UIService */); + const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* ServiceNames.Notification */); + return new Promise((resolve, reject) => { + uiService + .displayDialogAsync(url, payload || '', this.isExtensionDialog, 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 TableauDialogError(Contract.ErrorCodes.InternalError, 'closePayload is undefined'); + } + resolve(event.closePayload); + } + else { + reject(new TableauDialogError(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" /* ExtensionsServiceNames.UIService */); + uiService.sendDialogMessageAsync(message, targetDialogUrl); + } + sendDialogMessageToParentAsync(message) { + if (!this.isExtensionDialog) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'sendDialogMessageToParentAsync can only be called from an extension dialog.'); + } + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* ExtensionsServiceNames.UIService */); + uiService.sendDialogMessageToParentAsync(message); + } + closeDialog(payload, dialogUrl) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* ExtensionsServiceNames.UIService */); + uiService.closeDialog(payload, dialogUrl); + } + /** + * 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" /* ServiceNames.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, event.sourceDialogUrl)); + }); + 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 })); +exports.Dashboard = void 0; +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" /* ServiceNames.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 })); +exports.DashboardObject = void 0; +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 })); +exports.Parameter = void 0; +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" /* ServiceNames.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 })); +exports.Sheet = void 0; +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 })); +exports.Workbook = void 0; +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 })); +exports.Worksheet = void 0; +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" /* ServiceNames.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 })); +exports.DashboardContent = void 0; +/** + * 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 })); +exports.Environment = void 0; +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._isExporting = extensionEnvironment.isExporting; + this._formatting = WorkbookFormattingEnvUtil_1.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(extensionEnvironment.workbookFormatting); + this._language = extensionEnvironment.extensionLanguage; + this._country = extensionEnvironment.extensionCountry; + this._locale = extensionEnvironment.extensionLocale; + this._workbookLocale = extensionEnvironment.workbookLocale; + this._mode = api_shared_js_1.InternalToExternalEnumMappings.extensionMode.convert(extensionEnvironment.extensionMode); + this._operatingSystem = extensionEnvironment.operatingSystem; + this._tableauVersion = extensionEnvironment.tableauVersion; + this._uniqueUserId = extensionEnvironment.uniqueUserId; + this._exportedMediaType = extensionEnvironment.exportedMediaType + ? api_shared_js_1.InternalToExternalEnumMappings.exportedMediaType.convert(extensionEnvironment.exportedMediaType) + : undefined; + // 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 workbookLocale() { + return this._workbookLocale; + } + get mode() { + return this._mode; + } + get operatingSystem() { + return this._operatingSystem; + } + get tableauVersion() { + return this._tableauVersion; + } + get uniqueUserId() { + return this._uniqueUserId; + } + get isExporting() { + return this._isExporting; + } + get exportedMediaType() { + return this._exportedMediaType; + } +} +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 })); +exports.Extensions = void 0; +/** + * 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); + } + reportExtensionRenderComplete(mediaBlob) { + return this.extensionImpl.reportExtensionRenderComplete(mediaBlob); + } +} +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 })); +exports.Settings = void 0; +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 })); +exports.UI = void 0; +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); + } + sendDialogMessageToParentAsync(message) { + return this._impl.sendDialogMessageToParentAsync(message); + } + closeDialog(payload, dialogUrl) { + this._impl.closeDialog(payload, dialogUrl); + } +} +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 })); +exports.WorkbookFormattingEnvUtil = void 0; +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" /* ClassNameKey.RowDividers */ || classNameKey === "tableau-column-dividers" /* ClassNameKey.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 })); +exports.WorksheetContent = void 0; +/** + * 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 })); +exports.InitializationServiceImpl = void 0; +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" /* ExtensionsServiceNames.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 })); +exports.SettingsServiceImpl = void 0; +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" /* ExtensionsServiceNames.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 })); +exports.UIServiceImpl = void 0; +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" /* ExtensionsServiceNames.UIService */; + } + displayDialogAsync(url, payload, isExtensionDialog, 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, + }; + // The dialog url source refers to who is opening a new dialog (i.e. the dialog's parent). + // If the host extension is opening a dialog we leave the source url as undefined to help us differentiate from other dialogs. + if (isExtensionDialog) { + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogUrlSource] = window.location.href; + } + 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, dialogUrl) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'closeDialog', + [api_internal_contract_js_1.ParameterId.ExtensionDialogUrlSource]: window.location.href, + }; + if (payload) { + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload; + } + if (dialogUrl) { + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = dialogUrl; + } + 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, + [api_internal_contract_js_1.ParameterId.ExtensionDialogUrlSource]: window.location.href, + }; + if (targetDialogUrl) { + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = targetDialogUrl; + } + return this.execute(api_internal_contract_js_1.VerbId.SendDialogMessage, parameters).then(() => { + return; + }); + } + sendDialogMessageToParentAsync(message) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'sendMessageToParent', + [api_internal_contract_js_1.ParameterId.ExtensionDialogMessage]: message, + [api_internal_contract_js_1.ParameterId.ExtensionDialogUrlSource]: window.location.href, + }; + return this.execute(api_internal_contract_js_1.VerbId.SendMessageToParent, 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 })); +exports.registerAllExtensionsServices = registerAllExtensionsServices; +exports.registerInitializationExtensionsServices = registerInitializationExtensionsServices; +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)); +} +function registerInitializationExtensionsServices(dispatcher) { + api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new InitializationServiceImpl_1.InitializationServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId)); +} + + +/***/ }), + +/***/ "./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 = void 0; +exports.ExtensionsRegistryId = 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 needs to be wrapped in an IIFE because it needs 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 })); +exports.ZoneVisibilityType = exports.VizImageSortDirectionType = exports.VizImageSizeSettingType = exports.VizImageSizeSettingAlignmentType = exports.VizImagePaletteType = exports.VizImageEncodingType = exports.TrendLineModelType = exports.TableauEventType = exports.SortDirection = exports.SheetType = exports.SelectOptions = exports.SelectionUpdateType = exports.ReplaySpeedType = exports.QuickTableCalcType = exports.PeriodType = exports.ParameterValueType = exports.MarkType = exports.IncludeDataValuesOption = exports.HierarchicalLevelSelectionState = exports.FilterUpdateType = exports.FilterType = exports.FilterNullOption = exports.FilterDomainType = exports.FieldRoleType = exports.FieldAggregationType = exports.ExtensionMode = exports.ExtensionContext = exports.ExportedMediaType = exports.ErrorCodes = exports.EncodingType = exports.DialogStyle = exports.DateRangeType = exports.DataType = exports.DashboardObjectVisibilityType = exports.DashboardObjectType = exports.DashboardLayoutChange = exports.ColumnType = exports.ClassNameKey = exports.AnnotationType = exports.AnalyticsObjectType = exports.extensions = void 0; +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.17.0-pre.8" : 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"); +Object.defineProperty(exports, "AnalyticsObjectType", ({ enumerable: true, get: function () { return api_external_contract_js_1.AnalyticsObjectType; } })); +Object.defineProperty(exports, "AnnotationType", ({ enumerable: true, get: function () { return api_external_contract_js_1.AnnotationType; } })); +Object.defineProperty(exports, "ClassNameKey", ({ enumerable: true, get: function () { return api_external_contract_js_1.ClassNameKey; } })); +Object.defineProperty(exports, "ColumnType", ({ enumerable: true, get: function () { return api_external_contract_js_1.ColumnType; } })); +Object.defineProperty(exports, "DashboardLayoutChange", ({ enumerable: true, get: function () { return api_external_contract_js_1.DashboardLayoutChange; } })); +Object.defineProperty(exports, "DashboardObjectType", ({ enumerable: true, get: function () { return api_external_contract_js_1.DashboardObjectType; } })); +Object.defineProperty(exports, "DashboardObjectVisibilityType", ({ enumerable: true, get: function () { return api_external_contract_js_1.DashboardObjectVisibilityType; } })); +Object.defineProperty(exports, "DataType", ({ enumerable: true, get: function () { return api_external_contract_js_1.DataType; } })); +Object.defineProperty(exports, "DateRangeType", ({ enumerable: true, get: function () { return api_external_contract_js_1.DateRangeType; } })); +Object.defineProperty(exports, "DialogStyle", ({ enumerable: true, get: function () { return api_external_contract_js_1.DialogStyle; } })); +Object.defineProperty(exports, "EncodingType", ({ enumerable: true, get: function () { return api_external_contract_js_1.EncodingType; } })); +Object.defineProperty(exports, "ErrorCodes", ({ enumerable: true, get: function () { return api_external_contract_js_1.ErrorCodes; } })); +Object.defineProperty(exports, "ExportedMediaType", ({ enumerable: true, get: function () { return api_external_contract_js_1.ExportedMediaType; } })); +Object.defineProperty(exports, "ExtensionContext", ({ enumerable: true, get: function () { return api_external_contract_js_1.ExtensionContext; } })); +Object.defineProperty(exports, "ExtensionMode", ({ enumerable: true, get: function () { return api_external_contract_js_1.ExtensionMode; } })); +Object.defineProperty(exports, "FieldAggregationType", ({ enumerable: true, get: function () { return api_external_contract_js_1.FieldAggregationType; } })); +Object.defineProperty(exports, "FieldRoleType", ({ enumerable: true, get: function () { return api_external_contract_js_1.FieldRoleType; } })); +Object.defineProperty(exports, "FilterDomainType", ({ enumerable: true, get: function () { return api_external_contract_js_1.FilterDomainType; } })); +Object.defineProperty(exports, "FilterNullOption", ({ enumerable: true, get: function () { return api_external_contract_js_1.FilterNullOption; } })); +Object.defineProperty(exports, "FilterType", ({ enumerable: true, get: function () { return api_external_contract_js_1.FilterType; } })); +Object.defineProperty(exports, "FilterUpdateType", ({ enumerable: true, get: function () { return api_external_contract_js_1.FilterUpdateType; } })); +Object.defineProperty(exports, "HierarchicalLevelSelectionState", ({ enumerable: true, get: function () { return api_external_contract_js_1.HierarchicalLevelSelectionState; } })); +Object.defineProperty(exports, "IncludeDataValuesOption", ({ enumerable: true, get: function () { return api_external_contract_js_1.IncludeDataValuesOption; } })); +Object.defineProperty(exports, "MarkType", ({ enumerable: true, get: function () { return api_external_contract_js_1.MarkType; } })); +Object.defineProperty(exports, "ParameterValueType", ({ enumerable: true, get: function () { return api_external_contract_js_1.ParameterValueType; } })); +Object.defineProperty(exports, "PeriodType", ({ enumerable: true, get: function () { return api_external_contract_js_1.PeriodType; } })); +Object.defineProperty(exports, "QuickTableCalcType", ({ enumerable: true, get: function () { return api_external_contract_js_1.QuickTableCalcType; } })); +Object.defineProperty(exports, "ReplaySpeedType", ({ enumerable: true, get: function () { return api_external_contract_js_1.ReplaySpeedType; } })); +Object.defineProperty(exports, "SelectionUpdateType", ({ enumerable: true, get: function () { return api_external_contract_js_1.SelectionUpdateType; } })); +Object.defineProperty(exports, "SelectOptions", ({ enumerable: true, get: function () { return api_external_contract_js_1.SelectOptions; } })); +Object.defineProperty(exports, "SheetType", ({ enumerable: true, get: function () { return api_external_contract_js_1.SheetType; } })); +Object.defineProperty(exports, "SortDirection", ({ enumerable: true, get: function () { return api_external_contract_js_1.SortDirection; } })); +Object.defineProperty(exports, "TableauEventType", ({ enumerable: true, get: function () { return api_external_contract_js_1.TableauEventType; } })); +Object.defineProperty(exports, "TrendLineModelType", ({ enumerable: true, get: function () { return api_external_contract_js_1.TrendLineModelType; } })); +Object.defineProperty(exports, "VizImageEncodingType", ({ enumerable: true, get: function () { return api_external_contract_js_1.VizImageEncodingType; } })); +Object.defineProperty(exports, "VizImagePaletteType", ({ enumerable: true, get: function () { return api_external_contract_js_1.VizImagePaletteType; } })); +Object.defineProperty(exports, "VizImageSizeSettingAlignmentType", ({ enumerable: true, get: function () { return api_external_contract_js_1.VizImageSizeSettingAlignmentType; } })); +Object.defineProperty(exports, "VizImageSizeSettingType", ({ enumerable: true, get: function () { return api_external_contract_js_1.VizImageSizeSettingType; } })); +Object.defineProperty(exports, "VizImageSortDirectionType", ({ enumerable: true, get: function () { return api_external_contract_js_1.VizImageSortDirectionType; } })); +Object.defineProperty(exports, "ZoneVisibilityType", ({ enumerable: true, get: function () { return api_external_contract_js_1.ZoneVisibilityType; } })); + +})(); + +window.tableau = __webpack_exports__; +/******/ })() +; +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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NEIsQ0FBQyxRQUFRLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxRQUFRO0lBQzlFLENBQUMsK0NBQTRCLENBQUMsR0FBRyxDQUFDLEVBQUUsK0NBQTRCLENBQUMsR0FBRztJQUNwRSxDQUFDLCtDQUE0QixDQUFDLEdBQUcsQ0FBQyxFQUFFLCtDQUE0QixDQUFDLEdBQUc7SUFDcEUsQ0FBQywrQ0FBNEIsQ0FBQyxNQUFNLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxNQUFNO0lBQzFFLENBQUMsK0NBQTRCLENBQUMsR0FBRyxDQUFDLEVBQUUsK0NBQTRCLENBQUMsR0FBRztJQUNwRSxDQUFDLCtDQUE0QixDQUFDLE1BQU0sQ0FBQyxFQUFFLCtDQUE0QixDQUFDLE1BQU07SUFDMUUsQ0FBQywrQ0FBNEIsQ0FBQyxTQUFTLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxTQUFTO0lBQ2hGLENBQUMsK0NBQTRCLENBQUMsSUFBSSxDQUFDLEVBQUUsK0NBQTRCLENBQUMsSUFBSTtJQUN0RSxDQUFDLCtDQUE0QixDQUFDLEdBQUcsQ0FBQyxFQUFFLCtDQUE0QixDQUFDLEdBQUc7SUFDcEUsQ0FBQywrQ0FBNEIsQ0FBQyxNQUFNLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxNQUFNO0lBQzFFLENBQUMsK0NBQTRCLENBQUMsTUFBTSxDQUFDLEVBQUUsK0NBQTRCLENBQUMsTUFBTTtJQUMxRSxDQUFDLCtDQUE0QixDQUFDLE1BQU0sQ0FBQyxFQUFFLCtDQUE0QixDQUFDLE1BQU07SUFDMUUsQ0FBQywrQ0FBNEIsQ0FBQyxRQUFRLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxRQUFRO0lBQzlFLENBQUMsK0NBQTRCLENBQUMsS0FBSyxDQUFDLEVBQUUsK0NBQTRCLENBQUMsS0FBSztJQUN4RSxDQUFDLCtDQUE0QixDQUFDLE1BQU0sQ0FBQyxFQUFFLCtDQUE0QixDQUFDLE1BQU07SUFDMUUsQ0FBQywrQ0FBNEIsQ0FBQyxHQUFHLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxHQUFHO0lBQ3BFLENBQUMsK0NBQTRCLENBQUMsUUFBUSxDQUFDLEVB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SUFBYTtBQUNiLG1JQUFXO0FBQ1gscUlBQVk7QUFDWixpSUFBVTtBQUNWLCtJQUFpQjtBQUNqQiw2SUFBZ0I7QUFDaEIsdUlBQWE7QUFDYixxSkFBb0I7QUFDcEIsdUlBQWE7QUFDYiw2SUFBZ0I7QUFDaEIsNklBQWdCO0FBQ2hCLGlJQUFVO0FBQ1YsNklBQWdCO0FBQ2hCLDJLQUErQjtBQUMvQiwySkFBdUI7QUFDdkIsNkhBQVE7QUFDUixpSkFBa0I7QUFDbEIsaUlBQVU7QUFDVixpSkFBa0I7QUFFbEIsMklBQWU7QUFDZixtSkFBbUI7QUFDbkIsdUlBQWE7QUFDYiwrSEFBUztBQUNULHVJQUFhO0FBQ2IsNklBQWdCO0FBQ2hCLGlKQUFrQjtBQUNsQixxSkFBb0I7QUFDcEIsbUpBQW1CO0FBQ25CLDZLQUFnQztBQUNoQywySkFBdUI7QUFDdkIsK0pBQXlCO0FBQ3pCLGlKQUFrQiIsInNvdXJjZXMiOlsid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2d1aWQvZ3VpZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL21kNS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbmlsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9wYXJzZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcmVnZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc2hhMS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92MS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3YzNS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92YWxpZGF0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRW1iZWRkaW5nQXBpRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZW5zaW9uc0FwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0Fza0RhdGFJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvUHVsc2VJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9UYWJsZWF1RXJyb3IudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1ZpekludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1ZpelFMRGF0YVNlcnZpY2VJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9XZWJDb21wb25lbnRJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvRXZlbnRJbnRlcmZhY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1RhYmxlYXUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1VJLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvUGFyYW1ldGVySW50ZXJmYWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL1RhYmxlYXVFcnJvci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvQW5ub3RhdGlvbkludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0RhdGFTb3VyY2VJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9EYXRhVGFibGVJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRW52aXJvbm1lbnRJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9GaWx0ZXJJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL1NlbGVjdGlvbkludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL1NoZWV0SW50ZXJmYWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvVmlzdWFsTW9kZWxJbnRlcmZhY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL1dvcmtib29rRm9ybWF0dGluZ0ludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL1NoYXJlZEFwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL0pzQXBpSW50ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvRGF0YVR5cGVDb252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L0VudW1zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9Nb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L05vdGlmaWNhdGlvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L1BhcmFtZXRlcnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L1ZlcmJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9pbnRlcmZhY2UvQXNrRGF0YUludGVyZmFjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL0ludGVybmFsQXBpRGlzcGF0Y2hlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL1B1bHNlSW50ZXJmYWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9pbnRlcmZhY2UvVmVyc2lvbk51bWJlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL1ZxbEludGVyZmFjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvbWVzc2FnaW5nL0Nyb3NzRnJhbWVNZXNzZW5nZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9Dcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvTWVzc2FnZVR5cGVDaGVja3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZUxpc3RlbmVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VUeXBlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzZW5nZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL0lkZW50aXR5VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9TdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvVmVyc2lvblRyYW5zbGF0aW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0FwaVZlcnNpb24udHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ29ubmVjdGlvblN1bW1hcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ3Jvc3NGcmFtZS9Dcm9zc0ZyYW1lQm9vdHN0cmFwLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRGF0YVNvdXJjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRXZlbnRMaXN0ZW5lck1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRmllbGQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9DdXN0b21WaWV3SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9GaWVsZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9QYXJhbWV0ZXJJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbmZvSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TdG9yeVBvaW50SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbmZvSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1dvcmtib29rSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTG9naWNhbFRhYmxlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9BY2Nlc3NpYmlsaXR5TW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9GaWx0ZXJNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0dldERhdGFNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0dldERhdGFUYWJsZVJlYWRlck1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Nb2RlbHMvU2VsZWN0aW9uTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1BvaW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL1JlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQW5pbWF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Bbm5vdGF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9DbGllbnRJbmZvU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9EYXRhU291cmNlU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9FeHBvcnRTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0ZpbHRlclNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvR2V0RGF0YVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9QYXJhbWV0ZXJzU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9TZWxlY3Rpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1N0b3J5QWN0aXZhdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1ZpelNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvWm9uZVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1RhYmxlU3VtbWFyeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9UYWJsZWF1RXJyb3IudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvRGF0YVZhbHVlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9EZWZlcnJlZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9FbnVtQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9FeHBvcnRIZWxwZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL1BhcmFtLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL1NoZWV0VXRpbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvU2hvcnRMaXZlZERlZmVycmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1ZlcnNpb25OdW1iZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9WZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9GaWx0ZXJDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9NYXJrc1NlbGVjdGVkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9QYXJhbWV0ZXJDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9TdW1tYXJ5RGF0YUNoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1RhYmxlYXVFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1RhYmxlYXVTaGVldEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvVGFibGVhdVdvcmtzaGVldEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9CZW50b25TYW5zRm9udE5hbWVDb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvQ29ubmVjdGVkU2VydmVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbldvcmtib29rSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9FeHRlbnNpb25zSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvU2V0dGluZ3NJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL1RhYmxlYXVCb29rRm9udE5hbWVDb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvVUlJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvRGFzaGJvYXJkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvRGFzaGJvYXJkT2JqZWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvUGFyYW1ldGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvU2hlZXQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9Xb3JrYm9vay50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1dvcmtzaGVldC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9EYXNoYm9hcmRDb250ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0Vudmlyb25tZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0V4dGVuc2lvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvU2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvVUkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9Xb3Jrc2hlZXRDb250ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9JbXBsL0luaXRpYWxpemF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvU2V0dGluZ3NTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvSW1wbC9VSVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9SZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3RhYmxlYXUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3RhYmxlYXUvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiAoKSB7XG4gIHZhciB2YWxpZGF0b3IgPSBuZXcgUmVnRXhwKFwiXlthLXowLTldezh9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezEyfSRcIiwgXCJpXCIpO1xuXG4gIGZ1bmN0aW9uIGdlbihjb3VudCkge1xuICAgIHZhciBvdXQgPSBcIlwiO1xuICAgIGZvciAodmFyIGk9MDsgaTxjb3VudDsgaSsrKSB7XG4gICAgICBvdXQgKz0gKCgoMStNYXRoLnJhbmRvbSgpKSoweDEwMDAwKXwwKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgZnVuY3Rpb24gR3VpZChndWlkKSB7XG4gICAgaWYgKCFndWlkKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhcmd1bWVudDsgYHZhbHVlYCBoYXMgbm8gdmFsdWUuXCIpO1xuICAgICAgXG4gICAgdGhpcy52YWx1ZSA9IEd1aWQuRU1QVFk7XG4gICAgXG4gICAgaWYgKGd1aWQgJiYgZ3VpZCBpbnN0YW5jZW9mIEd1aWQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBndWlkLnRvU3RyaW5nKCk7XG5cbiAgICB9IGVsc2UgaWYgKGd1aWQgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGd1aWQpID09PSBcIltvYmplY3QgU3RyaW5nXVwiICYmIEd1aWQuaXNHdWlkKGd1aWQpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZ3VpZDtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5lcXVhbHMgPSBmdW5jdGlvbihvdGhlcikge1xuICAgICAgLy8gQ29tcGFyaW5nIHN0cmluZyBgdmFsdWVgIGFnYWluc3QgcHJvdmlkZWQgYGd1aWRgIHdpbGwgYXV0by1jYWxsXG4gICAgICAvLyB0b1N0cmluZyBvbiBgZ3VpZGAgZm9yIGNvbXBhcmlzb25cbiAgICAgIHJldHVybiBHdWlkLmlzR3VpZChvdGhlcikgJiYgdGhpcy52YWx1ZSA9PSBvdGhlcjtcbiAgICB9O1xuXG4gICAgdGhpcy5pc0VtcHR5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gR3VpZC5FTVBUWTtcbiAgICB9O1xuICAgIFxuICAgIHRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gICAgXG4gICAgdGhpcy50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gIH07XG5cbiAgR3VpZC5FTVBUWSA9IFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCI7XG5cbiAgR3VpZC5pc0d1aWQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiAodmFsdWUgaW5zdGFuY2VvZiBHdWlkIHx8IHZhbGlkYXRvci50ZXN0KHZhbHVlLnRvU3RyaW5nKCkpKTtcbiAgfTtcblxuICBHdWlkLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgR3VpZChbZ2VuKDIpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDEpLCBnZW4oMyldLmpvaW4oXCItXCIpKTtcbiAgfTtcblxuICBHdWlkLnJhdyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBbZ2VuKDIpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDEpLCBnZW4oMyldLmpvaW4oXCItXCIpO1xuICB9O1xuXG4gIGlmKHR5cGVvZiBtb2R1bGUgIT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEd1aWQ7XG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJykge1xuICAgIHdpbmRvdy5HdWlkID0gR3VpZDtcbiAgfVxufSkoKTtcbiIsImV4cG9ydCB7IGRlZmF1bHQgYXMgdjEgfSBmcm9tICcuL3YxLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjMgfSBmcm9tICcuL3YzLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjQgfSBmcm9tICcuL3Y0LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjUgfSBmcm9tICcuL3Y1LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTklMIH0gZnJvbSAnLi9uaWwuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsaWRhdGUgfSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc3RyaW5naWZ5IH0gZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJzZSB9IGZyb20gJy4vcGFyc2UuanMnOyIsIi8qXG4gKiBCcm93c2VyLWNvbXBhdGlibGUgSmF2YVNjcmlwdCBNRDVcbiAqXG4gKiBNb2RpZmljYXRpb24gb2YgSmF2YVNjcmlwdCBNRDVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL0phdmFTY3JpcHQtTUQ1XG4gKlxuICogQ29weXJpZ2h0IDIwMTEsIFNlYmFzdGlhbiBUc2NoYW5cbiAqIGh0dHBzOi8vYmx1ZWltcC5uZXRcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxuICpcbiAqIEJhc2VkIG9uXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlXG4gKiBEaWdlc3QgQWxnb3JpdGhtLCBhcyBkZWZpbmVkIGluIFJGQyAxMzIxLlxuICogVmVyc2lvbiAyLjIgQ29weXJpZ2h0IChDKSBQYXVsIEpvaG5zdG9uIDE5OTkgLSAyMDA5XG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2VcbiAqIFNlZSBodHRwOi8vcGFqaG9tZS5vcmcudWsvY3J5cHQvbWQ1IGZvciBtb3JlIGluZm8uXG4gKi9cbmZ1bmN0aW9uIG1kNShieXRlcykge1xuICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtc2cgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYnl0ZXMpKTsgLy8gVVRGOCBlc2NhcGVcblxuICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobXNnLmxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7ICsraSkge1xuICAgICAgYnl0ZXNbaV0gPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWQ1VG9IZXhFbmNvZGVkQXJyYXkod29yZHNUb01kNShieXRlc1RvV29yZHMoYnl0ZXMpLCBieXRlcy5sZW5ndGggKiA4KSk7XG59XG4vKlxuICogQ29udmVydCBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzIHRvIGFuIGFycmF5IG9mIGJ5dGVzXG4gKi9cblxuXG5mdW5jdGlvbiBtZDVUb0hleEVuY29kZWRBcnJheShpbnB1dCkge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIHZhciBsZW5ndGgzMiA9IGlucHV0Lmxlbmd0aCAqIDMyO1xuICB2YXIgaGV4VGFiID0gJzAxMjM0NTY3ODlhYmNkZWYnO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoMzI7IGkgKz0gOCkge1xuICAgIHZhciB4ID0gaW5wdXRbaSA+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+Pj4gOCB8IDB4ODA7IC8vIGBjbG9ja19zZXFfbG93YFxuXG4gIGJbaSsrXSA9IGNsb2Nrc2VxICYgMHhmZjsgLy8gYG5vZGVgXG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCA2OyArK24pIHtcbiAgICBiW2kgKyBuXSA9IG5vZGVbbl07XG4gIH1cblxuICByZXR1cm4gYnVmIHx8IHN0cmluZ2lmeShiKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjE7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgbWQ1IGZyb20gJy4vbWQ1LmpzJztcbnZhciB2MyA9IHYzNSgndjMnLCAweDMwLCBtZDUpO1xuZXhwb3J0IGRlZmF1bHQgdjM7IiwiaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgcGFyc2UgZnJvbSAnLi9wYXJzZS5qcyc7XG5cbmZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7XG4gIHN0ciA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTsgLy8gVVRGOCBlc2NhcGVcblxuICB2YXIgYnl0ZXMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGJ5dGVzLnB1c2goc3RyLmNoYXJDb2RlQXQoaSkpO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG5leHBvcnQgdmFyIEROUyA9ICc2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0IHZhciBVUkwgPSAnNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChuYW1lLCB2ZXJzaW9uLCBoYXNoZnVuYykge1xuICBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQodmFsdWUsIG5hbWVzcGFjZSwgYnVmLCBvZmZzZXQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBzdHJpbmdUb0J5dGVzKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5hbWVzcGFjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWVzcGFjZSA9IHBhcnNlKG5hbWVzcGFjZSk7XG4gICAgfVxuXG4gICAgaWYgKG5hbWVzcGFjZS5sZW5ndGggIT09IDE2KSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ05hbWVzcGFjZSBtdXN0IGJlIGFycmF5LWxpa2UgKDE2IGl0ZXJhYmxlIGludGVnZXIgdmFsdWVzLCAwLTI1NSknKTtcbiAgICB9IC8vIENvbXB1dGUgaGFzaCBvZiBuYW1lc3BhY2UgYW5kIHZhbHVlLCBQZXIgNC4zXG4gICAgLy8gRnV0dXJlOiBVc2Ugc3ByZWFkIHN5bnRheCB3aGVuIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLCBlLmcuIGBieXRlcyA9XG4gICAgLy8gaGFzaGZ1bmMoWy4uLm5hbWVzcGFjZSwgLi4uIHZhbHVlXSlgXG5cblxuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KDE2ICsgdmFsdWUubGVuZ3RoKTtcbiAgICBieXRlcy5zZXQobmFtZXNwYWNlKTtcbiAgICBieXRlcy5zZXQodmFsdWUsIG5hbWVzcGFjZS5sZW5ndGgpO1xuICAgIGJ5dGVzID0gaGFzaGZ1bmMoYnl0ZXMpO1xuICAgIGJ5dGVzWzZdID0gYnl0ZXNbNl0gJiAweDBmIHwgdmVyc2lvbjtcbiAgICBieXRlc1s4XSA9IGJ5dGVzWzhdICYgMHgzZiB8IDB4ODA7XG5cbiAgICBpZiAoYnVmKSB7XG4gICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IGJ5dGVzW2ldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYnVmO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmdpZnkoYnl0ZXMpO1xuICB9IC8vIEZ1bmN0aW9uI25hbWUgaXMgbm90IHNldHRhYmxlIG9uIHNvbWUgcGxhdGZvcm1zICgjMjcwKVxuXG5cbiAgdHJ5IHtcbiAgICBnZW5lcmF0ZVVVSUQubmFtZSA9IG5hbWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICB9IGNhdGNoIChlcnIpIHt9IC8vIEZvciBDb21tb25KUyBkZWZhdWx0IGV4cG9ydCBzdXBwb3J0XG5cblxuICBnZW5lcmF0ZVVVSUQuRE5TID0gRE5TO1xuICBnZW5lcmF0ZVVVSUQuVVJMID0gVVJMO1xuICByZXR1cm4gZ2VuZXJhdGVVVUlEO1xufSIsImltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7IC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcblxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwOyAvLyBDb3B5IGJ5dGVzIHRvIGJ1ZmZlciwgaWYgcHJvdmlkZWRcblxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIHJldHVybiBzdHJpbmdpZnkocm5kcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHY0OyIsImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IHNoYTEgZnJvbSAnLi9zaGExLmpzJztcbnZhciB2NSA9IHYzNSgndjUnLCAweDUwLCBzaGExKTtcbmV4cG9ydCBkZWZhdWx0IHY1OyIsImltcG9ydCBSRUdFWCBmcm9tICcuL3JlZ2V4LmpzJztcblxuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnICYmIFJFR0VYLnRlc3QodXVpZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRlOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gdmVyc2lvbih1dWlkKSB7XG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlSW50KHV1aWQuc3Vic3RyKDE0LCAxKSwgMTYpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2ZXJzaW9uOyIsIi8vIFRoaXMgZmlsZSByZS1leHBvcnRzIGV2ZXJ5dGhpbmcgd2hpY2ggaXMgcGFydCBvZiB0aGUgZXh0ZW5zaW9ucyBhcGkgcHVibGljIGludGVyZmFjZVxuXG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0Fza0RhdGFJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIEFwaU1lbnVUeXBlLFxuICBDcm9zc3RhYkZpbGVGb3JtYXQsXG4gIERldmljZVR5cGUsXG4gIEVtYmVkZGluZ0Vycm9yQ29kZXMsXG4gIFRhYmxlYXVFdmVudFR5cGUgYXMgRW1iZWRkaW5nVGFibGVhdUV2ZW50VHlwZSxcbiAgUHJpbnRPcmllbnRhdGlvbixcbiAgUHJpbnRQYWdlU2l6ZSxcbiAgUHJpbnRTY2FsaW5nLFxuICBQdWxzZUVycm9yTWVzc2FnZVZpc2liaWxpdHksXG4gIFB1bHNlTGF5b3V0LFxuICBQdWxzZVRpbWVEaW1lbnNpb24sXG4gIFNoZWV0U2l6ZUJlaGF2aW9yLFxuICBUYWJsZWF1RGlhbG9nVHlwZSxcbiAgVG9vbGJhcixcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9FbnVtcyc7XG5leHBvcnQge1xuICBDdXN0b21WaWV3RXZlbnQsXG4gIEN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50IGFzIEVtYmVkZGluZ0N1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50LFxuICBGaWx0ZXJDaGFuZ2VkRXZlbnQgYXMgRW1iZWRkaW5nRmlsdGVyQ2hhbmdlZEV2ZW50LFxuICBNYXJrc1NlbGVjdGVkRXZlbnQgYXMgRW1iZWRkaW5nTWFya1NlbGVjdGVkRXZlbnQsXG4gIFBhcmFtZXRlckNoYW5nZWRFdmVudCBhcyBFbWJlZGRpbmdQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQsXG4gIFN1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50IGFzIEVtYmVkZGluZ1N1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50LFxuICBUYWJsZWF1U2hlZXRFdmVudCBhcyBFbWJlZGRpbmdUYWJsZWF1U2hlZXRFdmVudCxcbiAgVGFibGVhdVdvcmtzaGVldEV2ZW50IGFzIEVtYmVkZGluZ1RhYmxlYXVXb3Jrc2hlZXRFdmVudCxcbiAgVG9vbGJhclN0YXRlQ2hhbmdlZEV2ZW50IGFzIEVtYmVkZGluZ1Rvb2xiYXJTdGF0ZUNoYW5nZWRFdmVudCxcbiAgRmlyc3RQdWxzZU1ldHJpY1NpemVLbm93bkV2ZW50LFxuICBGaXJzdFZpelNpemVLbm93bkV2ZW50LFxuICBQdWxzZUVycm9yRXZlbnQsXG4gIFB1bHNlRmlsdGVyc0NoYW5nZWRFdmVudCxcbiAgUHVsc2VJbnNpZ2h0RGlzY292ZXJlZEV2ZW50LFxuICBQdWxzZU1ldHJpY1NpemVDaGFuZ2VkRXZlbnQsXG4gIFB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWRFdmVudCxcbiAgUHVsc2VVcmxDaGFuZ2VkRXZlbnQsXG4gIFN0b3J5UG9pbnRTd2l0Y2hlZEV2ZW50LFxuICBUYWJTd2l0Y2hlZEV2ZW50LFxuICBVcmxBY3Rpb25FdmVudCxcbiAgVml6TG9hZEVycm9yRXZlbnQsXG4gIFdvcmtib29rUHVibGlzaGVkQXNFdmVudCxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9FdmVudEludGVyZmFjZXMnO1xuZXhwb3J0IHsgUGFyYW1ldGVyIGFzIEVtYmVkZGluZ1BhcmFtZXRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvUGFyYW1ldGVySW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1B1bHNlSW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBDb250ZXh0TWVudU9wdGlvbnMsXG4gIEVtYmVkZGluZ0Fic3RyYWN0UXVlcnksXG4gIEF1dGhvcmluZ1dvcmtzaGVldCBhcyBFbWJlZGRpbmdBdXRob3JpbmdXb3Jrc2hlZXQsXG4gIERhc2hib2FyZCBhcyBFbWJlZGRpbmdEYXNoYm9hcmQsXG4gIERhc2hib2FyZE9iamVjdCBhcyBFbWJlZGRpbmdEYXNoYm9hcmRPYmplY3QsXG4gIFNoZWV0IGFzIEVtYmVkZGluZ1NoZWV0LFxuICBFbWJlZGRpbmdWaXpTdGF0ZVdpdGhEYXRhTW9kZWwsXG4gIFdvcmtzaGVldCBhcyBFbWJlZGRpbmdXb3Jrc2hlZXQsXG4gIEhpZXJhcmNoaWNhbExldmVscyxcbiAgU2hlZXRJbmZvLFxuICBTaGVldFNpemUsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvU2hlZXRJbnRlcmZhY2VzJztcbmV4cG9ydCB7IFN0b3J5LCBTdG9yeVBvaW50LCBTdG9yeVBvaW50SW5mbyB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvU3RvcnlJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvVGFibGVhdUVycm9yJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvVml6SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1ZpelFMRGF0YVNlcnZpY2VJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvV2ViQ29tcG9uZW50SW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBDdXN0b21WaWV3LFxuICBBdXRob3JpbmdXb3JrYm9vayBhcyBFbWJlZGRpbmdBdXRob3JpbmdXb3JrYm9vayxcbiAgV29ya2Jvb2sgYXMgRW1iZWRkaW5nV29ya2Jvb2ssXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvV29ya2Jvb2tJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TaGFyZWRBcGlFeHRlcm5hbENvbnRyYWN0JztcbiIsIi8vIFRoaXMgZmlsZSByZS1leHBvcnRzIGV2ZXJ5dGhpbmcgd2hpY2ggaXMgcGFydCBvZiB0aGUgZXh0ZW5zaW9ucyBhcGkgcHVibGljIGludGVyZmFjZVxuXG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9FdmVudEludGVyZmFjZSc7XG5leHBvcnQgeyBEYXNoYm9hcmRDb250ZW50IH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9EYXNoYm9hcmRDb250ZW50JztcbmV4cG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9FbnZpcm9ubWVudCc7XG5leHBvcnQgeyBFeHRlbnNpb25zIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9FeHRlbnNpb25zJztcbmV4cG9ydCB7IFNldHRpbmdzIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9TZXR0aW5ncyc7XG5leHBvcnQge1xuICBFcnJvckNvZGVzLFxuICBFeHBvcnRlZE1lZGlhVHlwZSxcbiAgRXh0ZW5zaW9uQ29udGV4dCxcbiAgRXh0ZW5zaW9uTW9kZSxcbiAgVGFibGVhdUV2ZW50VHlwZSxcbiAgVml6SW1hZ2VFbmNvZGluZ1R5cGUsXG4gIFZpekltYWdlUGFsZXR0ZVR5cGUsXG4gIFZpekltYWdlU2l6ZVNldHRpbmdBbGlnbm1lbnRUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nVHlwZSxcbiAgVml6SW1hZ2VTb3J0RGlyZWN0aW9uVHlwZSxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvVUknO1xuZXhwb3J0IHsgV29ya3NoZWV0Q29udGVudCB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvV29ya3NoZWV0Q29udGVudCc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9QYXJhbWV0ZXJJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSxcbiAgRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXksXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlNYXAsXG4gIERhc2hib2FyZCBhcyBFeHRlbnNpb25EYXNoYm9hcmQsXG4gIERhc2hib2FyZE9iamVjdCBhcyBFeHRlbnNpb25EYXNoYm9hcmRPYmplY3QsXG4gIFNoZWV0IGFzIEV4dGVuc2lvblNoZWV0LFxuICBXb3Jrc2hlZXQgYXMgRXh0ZW5zaW9uV29ya3NoZWV0LFxuICBQb2ludCxcbiAgWm9uZVZpc2liaWxpdHlNYXAsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL1NoZWV0SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9UYWJsZWF1RXJyb3InO1xuZXhwb3J0IHsgV29ya2Jvb2sgYXMgRXh0ZW5zaW9uV29ya2Jvb2sgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9Xb3JrYm9va0ludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9TaGFyZWRBcGlFeHRlcm5hbENvbnRyYWN0JztcbiIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9FbWJlZGRpbmdBcGlFeHRlcm5hbENvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZW5zaW9uc0FwaUV4dGVybmFsQ29udHJhY3QnO1xuIiwiaW1wb3J0IHsgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncywgV2ViQ29tcG9uZW50U2V0dGluZ3NTaGFyZWQgfSBmcm9tICcuL1dlYkNvbXBvbmVudEludGVyZmFjZXMnO1xuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS1hc2stZGF0YT4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBlbnVtIEFza0RhdGFBdHRyaWJ1dGVzIHtcbiAgT3JpZ2luID0gJ29yaWdpbicsXG4gIFNob3dFbWJlZCA9ICdzaG93LWVtYmVkJyxcbiAgU2hvd1BpbiA9ICdzaG93LXBpbicsXG4gIFNob3dTYXZlID0gJ3Nob3ctc2F2ZScsXG4gIFNob3dTaGFyZSA9ICdzaG93LXNoYXJlJyxcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFza0RhdGFTZXR0aW5ncyBleHRlbmRzIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkLCBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbWJlZCBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgc2hvdy1lbWJlZD5cbiAgICogYGBgXG4gICAqL1xuICBzaG93RW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcGluIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBzaG93LXBpbj5cbiAgICogYGBgXG4gICAqL1xuICBzaG93UGluPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNhdmUgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctc2F2ZT5cbiAgICogYGBgXG4gICAqL1xuICBzaG93U2F2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzaGFyZSBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgc2hvdy1zaGFyZT5cbiAgICogYGBgXG4gICAqL1xuICBzaG93U2hhcmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiAgVXNlZCBmb3IgdGVsZW1ldHJ5XG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgb3JpZ2luPVwiZW1iZWRkaW5nU2l0ZVwiPlxuICAgKiBgYGBcbiAgICovXG4gIG9yaWdpbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wIGxldmVsIEFza0RhdGEgb2JqZWN0LlxuICogQGRlcHJlY2F0ZWRcbiAqKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNrRGF0YSBleHRlbmRzIEFza0RhdGFTZXR0aW5ncyB7fVxuIiwiLy8gQWxsIGVudW0gdmFsdWVzIG1hZGUgYXZhaWxhYmxlIHRvIEVtYmVkZGluZyBkZXZlbG9wZXJzLlxuLy8gRW51bXMgc2hvdWxkIGJlIGtlcHQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLlxuLy8gTW9zdCBvZiB0aGVtIHNob3VsZCBtYXRjaCBhbiBlbnVtIG9uIHRoZSBzZXJ2ZXIgZGVmaW5lZCBhdFxuLy8gd29ya2dyb3VwL3ZxbHdlYi9zY3JpcHRzaGFycC9zcmMvQXBpU2hhcmVkL1B1YmxpY0VudW1zLmNzI0wzOTg6MTdcblxuLyoqXG4gKiBDcm9zc3RhYiBmaWxlIGZvcm1hdHMgYXZhaWxhYmxlIHRvIHVzZSB3aXRoIHtAbGluayBWaXouZXhwb3J0Q3Jvc3N0YWJBc3luY31cbiAqL1xuZXhwb3J0IGVudW0gQ3Jvc3N0YWJGaWxlRm9ybWF0IHtcbiAgQ1NWID0gJ2NzdicsXG4gIEV4Y2VsID0gJ3hsc3gnLFxufVxuXG4vKipcbiAqIERldmljZSB0eXBlcyBhdmFpbGFibGUgdG8gdXNlIHdpdGgge0BsaW5rIFZpei5kZXZpY2V9XG4gKi9cbmV4cG9ydCBlbnVtIERldmljZVR5cGUge1xuICBEZWZhdWx0ID0gJ2RlZmF1bHQnLFxuICBEZXNrdG9wID0gJ2Rlc2t0b3AnLFxuICBUYWJsZXQgPSAndGFibGV0JyxcbiAgUGhvbmUgPSAncGhvbmUnLFxufVxuXG4vKipcbiAqIEFsbCBlcnJvciBjb2RlcyB1c2VkIGJ5IHRoZSBFbWJlZGRpbmcgQVBJLlxuICovXG5leHBvcnQgZW51bSBFbWJlZGRpbmdFcnJvckNvZGVzIHtcbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgcmVxdWVzdCB0byB0aGUgYXV0aCBlbmRwb2ludCBmYWlscy5cbiAgICovXG4gIEF1dGhGYWlsZWQgPSAnYXV0aC1mYWlsZWQnLFxuICAvKipcbiAgICogVGhlIGJyb3dzZXIgaXMgbm90IGNhcGFibGUgb2Ygc3VwcG9ydGluZyB0aGUgVGFibGVhdSBFbWJlZGRpbmcgQVBJXG4gICAqL1xuICBCcm93c2VyTm90Q2FwYWJsZSA9ICdicm93c2VyLW5vdC1jYXBhYmxlJyxcbiAgLyoqXG4gICAqIFRoZSBwZXJtaXNzaW9ucyBvbiBhIHdvcmtib29rIG9yIGEgdmlldyBkbyBub3QgYWxsb3cgZG93bmxvYWRpbmcgdGhlIHdvcmtib29rLlxuICAgKi9cbiAgRG93bmxvYWRXb3JrYm9va05vdEFsbG93ZWQgPSAnZG93bmxvYWQtd29ya2Jvb2stbm90LWFsbG93ZWQnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGF0dGVtcHRpbmcgdG8gcGVyZm9ybSBhIGZpbHRlciBvcGVyYXRpb24uXG4gICAqL1xuICBGaWx0ZXJDYW5ub3RCZVBlcmZvcm1lZCA9ICdmaWx0ZXItY2Fubm90LWJlLXBlcmZvcm1lZCcsXG4gIC8qKlxuICAgKiBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHN3aXRjaCB0byBhIHNoZWV0IGJ5IGluZGV4IHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHdvcmtib29rLlxuICAgKi9cbiAgSW5kZXhPdXRPZlJhbmdlID0gJ2luZGV4LW91dC1vZi1yYW5nZScsXG4gIC8qKlxuICAgKiBUaHJvd24gd2hlbiBhbiBlcnJvciBvY2N1cnMgd2l0aGluIHRoZSBUYWJsZWF1IEVtYmVkZGluZyBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBbiBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGN1c3RvbSB2aWV3IHRoYXQgZG9lcyBub3QgZXhpc3QuXG4gICAqL1xuICBJbnZhbGlkQ3VzdG9tVmlld05hbWUgPSAnaW52YWxpZC1jdXN0b20tdmlldy1uYW1lJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgZGF0ZSB3YXMgc3BlY2lmaWVkIGluIGEgbWV0aG9kIHRoYXQgcmVxdWlyZWQgYSBkYXRlIHBhcmFtZXRlci5cbiAgICovXG4gIEludmFsaWREYXRlUGFyYW1ldGVyID0gJ2ludmFsaWQtZGF0ZS1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogRWl0aGVyIGEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgZmllbGQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGF0YSBzb3VyY2UsIG9yIHRoZSB2YWx1ZSBzdXBwbGllZFxuICAgKiBpbiB0aGUgZmlsdGVyIG9wZXJhdGlvbiBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIGludmFsaWRGaWx0ZXJGaWVsZE5hbWVPclZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkLW5hbWUnLFxuICAvKipcbiAgICogQSBwYXJhbWV0ZXIgaXMgbm90IHRoZSBjb3JyZWN0IGRhdGEgdHlwZSBvciBmb3JtYXQuIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIGluIHRoZSBFcnJvci5tZXNzYWdlXG4gICAqIGZpZWxkLlxuICAgKi9cbiAgSW52YWxpZFBhcmFtZXRlciA9ICdpbnZhbGlkLXBhcmFtZXRlcicsXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudGx5IGFwcGxpZWQgdGltZSBkaW1lbnNpb24gY291bGQgbm90IGJlIGRldGVybWluZWQgb3IgaXMgaW52YWxpZC5cbiAgICovXG4gIEludmFsaWRUaW1lRGltZW5zaW9uID0gJ2ludmFsaWQtdGltZS1kaW1lbnNpb24nLFxuICAvKipcbiAgICogQSBuZWdhdGl2ZSBzaXplIHdhcyBzcGVjaWZpZWQgb3IgdGhlIG1heFNpemUgdmFsdWUgaXMgbGVzcyB0aGFuIG1pblNpemUgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkuXG4gICAqL1xuICBJbnZhbGlkU2l6ZSA9ICdpbnZhbGlkLXNpemUnLFxuICAvKipcbiAgICogQXR0ZW1wdGVkIHRvIGdldCBhbiBhdXRob3Jpbmcgd29ya3NoZWV0IHdoZW4gdGhlIGN1cnJlbnQgc2hlZXQgaXMgbm90IGEgd29ya3NoZWV0LlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBJbnZhbGlkU2hlZXRUeXBlID0gJ2ludmFsaWQtc2hlZXQtdHlwZScsXG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIHZhbHVlIHdhcyBmb3VuZCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgU2hlZXRTaXplQmVoYXZpb3IgZW51bS5cbiAgICovXG4gIEludmFsaWRTaXplQmVoYXZpb3IgPSAnaW52YWxpZC1zaXplLWJlaGF2aW9yJyxcbiAgLyoqXG4gICAqIEEgYmVoYXZpb3Igb3RoZXIgdGhhbiBTaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWMgd2FzIHNwZWNpZmllZCBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHRoZSBzaGVldCBpcyBhXG4gICAqIFdvcmtzaGVldCBpbnN0YW5jZS5cbiAgICovXG4gIEludmFsaWRTaXplQmVoYXZpb3JPbldvcmtzaGVldCA9ICdpbnZhbGlkLXNpemUtYmVoYXZpb3Itb24td29ya3NoZWV0JyxcbiAgLyoqXG4gICAqIFRoZSBVUkwgc3BlY2lmaWVkIGluIHRoZSBWaXogY2xhc3MgY29uc3RydWN0b3IgaXMgbm90IHZhbGlkLlxuICAgKi9cbiAgSW52YWxpZFVybCA9ICdpbnZhbGlkLXVybCcsXG4gIC8qKlxuICAgKiBUaGUgbWF4U2l6ZSBmaWVsZCBpcyBtaXNzaW5nIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpIHdoZW4gc3BlY2lmeWluZyBTaGVldFNpemVCZWhhdmlvci5BdE1vc3QuXG4gICAqL1xuICBNaXNzaW5nTWF4U2l6ZSA9ICdtaXNzaW5nLW1heC1zaXplJyxcbiAgLyoqXG4gICAqIFRoZSBtaW5TaXplIGZpZWxkIGlzIG1pc3NpbmcgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkgd2hlbiBzcGVjaWZ5aW5nIFNoZWV0U2l6ZUJlaGF2aW9yLkF0TGVhc3QuXG4gICAqL1xuICBNaXNzaW5nTWluU2l6ZSA9ICdtaXNzaW5nLW1pbi1zaXplJyxcbiAgLyoqXG4gICAqIFRoZSBtaW5TaXplIG9yIG1heFNpemUgZmllbGQgaXMgbWlzc2luZyBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHNwZWNpZnlpbmcgU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UuXG4gICAqL1xuICBNaXNzaW5nTWluTWF4U2l6ZSA9ICdtaXNzaW5nLW1pbi1tYXgtc2l6ZScsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgaWYgdGhlIGVtYmVkZGluZyBhcHAgaW50ZXJhY3RzIHdpdGggYSBwYXJhbWV0ZXIgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHdvcmtzaGVldC5cbiAgICovXG4gIE1pc3NpbmdQYXJhbWV0ZXIgPSAnbWlzc2luZy1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogVGhlIHJhbmdlTiBmaWVsZCBpcyBtaXNzaW5nIGZvciBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyIG9mIHR5cGUgTEFTVE4gb3IgTkVYVE4uXG4gICAqL1xuICBNaXNzaW5nUmFuZ2VORm9yUmVsYXRpdmVEYXRlRmlsdGVycyA9ICdtaXNzaW5nLXJhbmdlLW4tZm9yLXJlbGF0aXZlLWRhdGUtZmlsdGVycycsXG4gIC8qKlxuICAgKiBBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFjY2VzcyBTaGVldC5nZXRVcmwoKSBvbiBhIGhpZGRlbiBzaGVldC4gSGlkZGVuIHNoZWV0cyBkbyBub3QgaGF2ZSBVUkxzLlxuICAgKi9cbiAgTm9VcmxGb3JIaWRkZW5Xb3Jrc2hlZXQgPSAnbm8tdXJsLWZvci1oaWRkZW4td29ya3NoZWV0JyxcbiAgLyoqXG4gICAqIE9uZSBvciBib3RoIG9mIHRoZSBwYXJlbnRFbGVtZW50IG9yIHRoZSBVUkwgcGFyYW1ldGVycyBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBWaXogY29uc3RydWN0b3IuXG4gICAqL1xuICBOb1VybE9yUGFyZW50RWxlbWVudE5vdEZvdW5kID0gJ25vLXVybC1vci1wYXJlbnQtZWxlbWVudC1ub3QtZm91bmQnLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBzaGVldCB0aGF0IGlzIG5vdCBhY3RpdmUgb3IgZW1iZWRkZWQgd2l0aGluIHRoZSBhY3RpdmUgZGFzaGJvYXJkLlxuICAgKi9cbiAgTm90QWN0aXZlU2hlZXQgPSAnbm90LWFjdGl2ZS1zaGVldCcsXG4gIC8qKlxuICAgKiBBIHJlcXVpcmVkIHBhcmFtZXRlciB3YXMgbm90IHNwZWNpZmllZCwgbnVsbCwgb3IgYW4gZW1wdHkgc3RyaW5nL2FycmF5LlxuICAgKi9cbiAgTnVsbE9yRW1wdHlQYXJhbWV0ZXIgPSAnbnVsbC1vci1lbXB0eS1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBzaGVldCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIFNoZWV0Tm90SW5Xb3JrYm9vayA9ICdzaGVldC1ub3QtaW4td29ya2Jvb2snLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBvbiBhIEN1c3RvbVZpZXcgb2JqZWN0IHRoYXQgaXMgbm8gbG9uZ2VyIHZhbGlkIChpdCBoYXMgYmVlbiByZW1vdmVkKS5cbiAgICovXG4gIFN0YWxlRGF0YVJlZmVyZW5jZSA9ICdzdGFsZS1kYXRhLXJlZmVyZW5jZScsXG4gIC8qKlxuICAgKiBVbmtub3duIGVycm9yIHRyaWdnZXJlZCBkdXJpbmcgdGhlIGF1dGggZmxvdy5cbiAgICovXG4gIFVua25vd25BdXRoRXJyb3IgPSAndW5rbm93bi1hdXRoLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIFZpei5hZGRFdmVudExpc3RlbmVyIG9yIFZpei5yZW1vdmVFdmVudExpc3RlbmVyLlxuICAgKi9cbiAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gIC8qKlxuICAgKiBBIFZpeiBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGFzIGEgY2hpbGQgb2YgdGhlIHBhcmVudEVsZW1lbnQgc3BlY2lmaWVkIGluIHRoZSBWaXogY29uc3RydWN0b3IuXG4gICAqL1xuICBWaXpBbHJlYWR5SW5NYW5hZ2VyID0gJ3Zpei1hbHJlYWR5LWluLW1hbmFnZXInLFxuICAvKipcbiAgICogRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgZW1iZWRkaW5nIGFwaS5cbiAgICovXG4gIEltcGxlbWVudGF0aW9uRXJyb3IgPSAnd3JvbmctaW1wbGVtZW50YXRpb24nLFxuICAvKipcbiAgICogQGhpZGRlbiAobm90IGltcGxlbWVudGVkKVxuICAgKi9cbiAgTm90SW1wbGVtZW50ZWQgPSAnbm90LWltcGxlbWVudGVkJyxcbiAgLyoqXG4gICAqIFVua25vd24gZXJyb3IgZHVyaW5nIGV2ZW50IGluaXRpYWxpemF0aW9uXG4gICAqL1xuICBFdmVudEluaXRpYWxpemF0aW9uRXJyb3IgPSAnZXZlbnQtaW5pdGlhbGl6YXRpb24tZXJyb3InLFxuICAvKipcbiAgICogVmVyc2lvbiBvZiB0aGUgZW1iZWRkaW5nIGFwaSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRhYmxlYXVcbiAgICovXG4gIEluY29tcGF0aWJsZVZlcnNpb25FcnJvciA9ICdpbmNvbXBhdGlibGUtdmVyc2lvbi1lcnJvcicsXG5cbiAgLyoqXG4gICAqIFVua25vd24ge0BsaW5rIFRhYmxlYXVEaWFsb2dUeXBlfSBwYXNzZWQgaW4gdG8gVml6LmRpc3BsYXlEaWFsb2dBc3luYy5cbiAgICovXG4gIFVua25vd25EaWFsb2dUeXBlID0gJ3Vua25vd24tZGlhbG9nLXR5cGUnLFxuXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgaWYgdGhlIEFQSSBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgKiBDYW4gYWxzbyBvY2N1cnMgaWYgYSB7QGxpbmsgRmlsdGVyVHlwZX0gaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkLlxuICAgKi9cbiAgRmlsdGVyTWlzc2luZ09yTm90SW1wbGVtZW50ZWQgPSAnZmlsdGVyLW1pc3Npbmctbm90LWltcGxlbWVudGVkJyxcblxuICAvKipcbiAgICogQ2FuIG9jY3VyIGlmIHN0b3J5IHBvaW50IGlkcyBubyBsb25nZXIgbWF0Y2guXG4gICAqL1xuICBTdG9yeVBvaW50SWRNaXNtYXRjaCA9ICdzdG9yeXBvaW50LWlkLW1pc21hdGNoJyxcbn1cblxuZXhwb3J0IGVudW0gUHJpbnRPcmllbnRhdGlvbiB7XG4gIFBvcnRyYWl0ID0gJ3BvcnRyYWl0JyxcbiAgTGFuZHNjYXBlID0gJ2xhbmRzY2FwZScsXG59XG5cbmV4cG9ydCBlbnVtIFByaW50UGFnZVNpemUge1xuICBMZXR0ZXIgPSAnbGV0dGVyJyxcbiAgTGVnYWwgPSAnbGVnYWwnLFxuICBOb3RlID0gJ25vdGUnLFxuICBGb2xpbyA9ICdmb2xpbycsXG4gIFRhYmxvaWQgPSAndGFibG9pZCcsXG4gIExlZGdlciA9ICdsZWRnZXInLFxuICBTdGF0ZW1lbnQgPSAnc3RhdGVtZW50JyxcbiAgRXhlY3V0aXZlID0gJ2V4ZWN1dGl2ZScsXG4gIEEzID0gJ0EzJyxcbiAgQTQgPSAnQTQnLFxuICBBNSA9ICdBNScsXG4gIEI0ID0gJ0I0JyxcbiAgQjUgPSAnQjUnLFxuICBRdWFydG8gPSAncXVhcnRvJyxcbiAgVW5zcGVjaWZpZWQgPSAndW5zcGVjaWZpZWQnLFxufVxuXG5leHBvcnQgZW51bSBQcmludFNjYWxpbmcge1xuICBBdXRvbWF0aWMgPSAnYXV0b21hdGljJyxcbiAgUGVyYzI1ID0gJzI1JScsXG4gIFBlcmM1MCA9ICc1MCUnLFxuICBQZXJjNjAgPSAnNjAlJyxcbiAgUGVyYzc1ID0gJzc1JScsXG4gIFBlcmM4MCA9ICc4MCUnLFxuICBQZXJjOTAgPSAnOTAlJyxcbiAgUGVyYzEwMCA9ICcxMDAlJyxcbiAgUGVyYzIwMCA9ICcyMDAlJyxcbiAgUGVyYzQwMCA9ICc0MDAlJyxcbiAgQXRNb3N0MVBhZ2VIaWdoID0gJ2F0LW1vc3QtMS1wYWdlLWhpZ2gnLFxuICBBdE1vc3QyUGFnZXNIaWdoID0gJ2F0LW1vc3QtMi1wYWdlcy1oaWdoJyxcbiAgQXRNb3N0MVBhZ2VXaWRlID0gJ2F0LW1vc3QtMS1wYWdlLXdpZGUnLFxuICBBdE1vc3QyUGFnZXNXaWRlID0gJ2F0LW1vc3QtMi1wYWdlcy13aWRlJyxcbn1cblxuZXhwb3J0IGVudW0gUmV2ZXJ0Vml6U2VsZWN0aW9uIHtcbiAgQWxsID0gJ2FsbCcsXG4gIEF4ZXMgPSAnYXhlcycsXG4gIEZpbHRlcnMgPSAnZmlsdGVycycsXG4gIFNvcnRzID0gJ3NvcnRzJyxcbiAgU2hlbHZlcyA9ICdzaGVsdmVzJyxcbn1cblxuZXhwb3J0IGVudW0gVG9vbGJhckJ1dHRvbnMge1xuICBBbGVydHMgPSAnYWxlcnRzJyxcbiAgQXNrRGF0YSA9ICdhc2tEYXRhJyxcbiAgQ3VzdG9tVmlld3MgPSAnY3VzdG9tVmlld3MnLFxuICBEYXRhRGV0YWlscyA9ICdkYXRhRGV0YWlscycsXG4gIFNoYXJlID0gJ3NoYXJlJyxcbiAgU3Vic2NyaWJlID0gJ3N1YnNjcmliZScsXG59XG5cbmV4cG9ydCBlbnVtIFRvb2xiYXIge1xuICBUb3AgPSAndG9wJyxcbiAgQm90dG9tID0gJ2JvdHRvbScsXG4gIEhpZGRlbiA9ICdoaWRkZW4nLFxufVxuXG5leHBvcnQgZW51bSBTaGVldFNpemVCZWhhdmlvciB7XG4gIEF1dG9tYXRpYyA9ICdhdXRvbWF0aWMnLFxuICBFeGFjdGx5ID0gJ2V4YWN0bHknLFxuICBSYW5nZSA9ICdyYW5nZScsXG4gIEF0TGVhc3QgPSAnYXRsZWFzdCcsXG4gIEF0TW9zdCA9ICdhdG1vc3QnLFxufVxuXG5leHBvcnQgZW51bSBQdWxzZUxheW91dCB7XG4gIERlZmF1bHQgPSAnZGVmYXVsdCcsXG4gIENhcmQgPSAnY2FyZCcsXG4gIEJhbiA9ICdiYW4nLFxufVxuXG5leHBvcnQgZW51bSBQdWxzZVRpbWVEaW1lbnNpb24ge1xuICBUb2RheSA9ICdUb2RheScsXG4gIFllc3RlcmRheSA9ICdZZXN0ZXJkYXknLFxuICBXZWVrVG9EYXRlID0gJ1dlZWtUb0RhdGUnLFxuICBMYXN0V2VlayA9ICdMYXN0V2VlaycsXG4gIE1vbnRoVG9EYXRlID0gJ01vbnRoVG9EYXRlJyxcbiAgTGFzdE1vbnRoID0gJ0xhc3RNb250aCcsXG4gIFF1YXJ0ZXJUb0RhdGUgPSAnUXVhcnRlclRvRGF0ZScsXG4gIExhc3RRdWFydGVyID0gJ0xhc3RRdWFydGVyJyxcbiAgWWVhclRvRGF0ZSA9ICdZZWFyVG9EYXRlJyxcbiAgTGFzdFllYXIgPSAnTGFzdFllYXInLFxufVxuXG5leHBvcnQgZW51bSBQdWxzZUVycm9yTWVzc2FnZVZpc2liaWxpdHkge1xuICBWaXNpYmxlID0gJ3Zpc2libGUnLFxuICBIaWRkZW4gPSAnaGlkZGVuJyxcbiAgU3VwcHJlc3NlZCA9ICdzdXBwcmVzc2VkJyxcbn1cblxuLyoqXG4gKiBCZSBjYXJlZnVsIHdoZW4gYWRkaW5nIG5ldyBldmVudCB0eXBlcy4gRXh0ZW5zaW9ucyBhbmQgZW1iZWRkaW5nIGZvbGxvdyB0d28gZGlmZmVyZW50IHBhdHRlcm5zIG9uIGhvdyBldmVudHMgYXJlIG5hbWVkLlxuICogRXZlbnRzIHNob3VsZCBiZSBhbGwgbG93ZXIgY2FzZSBhbmQgd2l0aG91dCBoeXBoZW5zIG9yIHVuZGVyc2NvcmVzLlxuICovXG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgdHlwZSBvZiB0YWJsZWF1IGVtYmVkZGluZyBldmVudCB0aGF0IGNhbiBiZSBsaXN0ZW5lZCBmb3IuXG4gKi9cbmV4cG9ydCBlbnVtIFRhYmxlYXVFdmVudFR5cGUge1xuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgZmluaXNoZWQgbG9hZGluZy4gVGhpcyBldmVudCBpcyByYWlzZWQgYWZ0ZXIgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB7QGxpbmsgRmlyc3RJbnRlcmFjdGl2ZX0gKGlmIGFueSkgaGFzIGJlZW4gY2FsbGVkLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tVmlld0xvYWRlZCA9ICdjdXN0b212aWV3bG9hZGVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiByZW1vdmVkLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tVmlld1JlbW92ZWQgPSAnY3VzdG9tdmlld3JlbW92ZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNhdmVkIChuZXdseSBjcmVhdGVkIG9yIHVwZGF0ZWQpLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tVmlld1NhdmVkID0gJ2N1c3RvbXZpZXdzYXZlZCcsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2V0IGFzIHRoZSBkZWZhdWx0IHZpZXcgZm9yIGEgd29ya2Jvb2suXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBDdXN0b21WaWV3U2V0RGVmYXVsdCA9ICdjdXN0b212aWV3c2V0ZGVmYXVsdCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgRWRpdCBCdXR0b24uXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBFZGl0QnV0dG9uQ2xpY2tlZCA9ICdlZGl0YnV0dG9uY2xpY2tlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgRWRpdCBJbiBEZXNrdG9wIEJ1dHRvbi5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZ1xuICAgKi9cbiAgRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQgPSAnZWRpdGluZGVza3RvcGJ1dHRvbmNsaWNrZWQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiBhbnkgZmlsdGVyIGhhcyBjaGFuZ2VkIHN0YXRlLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlcmNoYW5nZWQnLFxuXG4gIC8qKiBGaXJlZCB3aGVuIHZpeiBzaXplIGlzIGtub3duXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmdcbiAgICovXG4gIEZpcnN0Vml6U2l6ZUtub3duID0gJ2ZpcnN0dml6c2l6ZWtub3duJyxcblxuICAvKiogRmlyZWQgd2hlbiBhIHZpeiBmaXJzdCBiZWNvbWVzIGludGVyYWN0aXZlXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmcsIFB1bHNlXG4gICAqL1xuICBGaXJzdEludGVyYWN0aXZlID0gJ2ZpcnN0aW50ZXJhY3RpdmUnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSBtYXJrIGNvbnRleHQgbWVudSBpcyBjbGlja2VkLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQgPSAnY3VzdG9tbWFya2NvbnRleHRtZW51JyxcblxuICAvKiogVGhlIHNlbGVjdGVkIG1hcmtzIG9uIGEgdmlzdWFsaXphdGlvbiBoYXZlIGNoYW5nZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFRhYmxlYXVWaXogb2JqZWN0cy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIE1hcmtTZWxlY3Rpb25DaGFuZ2VkID0gJ21hcmtzZWxlY3Rpb25jaGFuZ2VkJyxcblxuICAvKiogQSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFBhcmFtZXRlckNoYW5nZWQgPSAncGFyYW1ldGVyY2hhbmdlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIGEgdG9vbGJhciBidXR0b24gb3IgY29udHJvbCBiZWNvbWVzIGF2YWlsYWJsZSBvciBiZWNvbWVzIHVuYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgVG9vbGJhclN0YXRlQ2hhbmdlZCA9ICd0b29sYmFyc3RhdGVjaGFuZ2VkJyxcblxuICAvKiogUmFpc2VkIHdoZW4gdGhlIHdvcmtib29rIGlzIHJlYWR5IHRvIGNsb3NlLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nXG4gICAqL1xuICBXb3JrYm9va1JlYWR5VG9DbG9zZSA9ICd3b3JrYm9va3JlYWR5dG9jbG9zZScsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBoYXMgYmVlbiBwdWJsaXNoZWQuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmdcbiAgICovXG4gIFdvcmtib29rUHVibGlzaGVkID0gJ3dvcmtib29rcHVibGlzaGVkJyxcblxuICAvKiogUmFpc2VkIHdoZW4gXCJwdWJsaXNoIGFzXCIgaXMgc3VjY2Vzc2Z1bC4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZ1xuICAgKi9cbiAgV29ya2Jvb2tQdWJsaXNoZWRBcyA9ICd3b3JrYm9va3B1Ymxpc2hlZGFzJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBVUkwgYWN0aW9uIG9jY3Vycy4gU2VlIHRoZSB7QGxpbmsgVXJsQWN0aW9uRXZlbnR9IGNsYXNzLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgVXJsQWN0aW9uID0gJ3VybGFjdGlvbicsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCBhZnRlciBhIHRhYiBzd2l0Y2ggb2NjdXJzICh0aGUgYWN0aXZlIHNoZWV0IGhhcyBjaGFuZ2VkKS4gR3VhcmFudGVlcyB0aGUgdml6IG9iamVjdCB3aWxsIGJlIGludGVyYWN0aXZlIGFmdGVyIHRoaXMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBUYWJTd2l0Y2hlZCA9ICd0YWJzd2l0Y2hlZCcsXG4gIC8qKlxuICAgKlxuICAgKiBSYWlzZWQgYWZ0ZXIgYSBuZXcgc3RvcnkgcG9pbnQgYmVjb21lcyBhY3RpdmUuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBTdG9yeVBvaW50U3dpdGNoZWQgPSAnc3Rvcnlwb2ludHN3aXRjaGVkJyxcbiAgLyoqXG4gICAqXG4gICAqIFJhaXNlZCB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBsb2FkaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgd2ViY29tcG9uZW50LlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nLCBBc2tEYXRhXG4gICAqL1xuICBWaXpMb2FkRXJyb3IgPSAndml6bG9hZGVycm9yJyxcbiAgLyoqXG4gICAqIFJhaXNlZCBhZnRlciB0aGUgaWZyYW1lIHNyYyBhdHRyaWJ1dGUgaGFzIGJlZW4gdXBkYXRlZFxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nLCBBc2tEYXRhXG4gICAqL1xuICBJZnJhbWVTcmNVcGRhdGVkID0gJ2lmcmFtZXNyY3VwZGF0ZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBjaGFuZ2VzIGFyZSBtYWRlIHRvIHN1bW1hcnkgZGF0YS5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5ZGF0YWNoYW5nZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiB0YWJsZWF1ICh2aXotY2xpZW50KSBpcyByZWFkeSB0byByZWNlaXZlIGFuIGF1dGggdG9rZW4uXG4gICAqIFVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uIGluIHNhbGVzZm9yY2UgbmF0aXZlIG1vZGUuXG4gICAqXG4gICAqIEBoaWRkZW5cbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZyxcbiAgICovXG4gIFJlYWR5VG9SZWNlaXZlQXV0aFRva2VuID0gJ3JlYWR5dG9yZWNlaXZlYXV0aHRva2VuJyxcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiB0aGUgUHVsc2UgbWV0cmljIHNpemUgaXMga25vd25cbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBGaXJzdFB1bHNlTWV0cmljU2l6ZUtub3duID0gJ2ZpcnN0cHVsc2VtZXRyaWNzaXpla25vd24nLFxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIGFuIGludGVybmFsIFB1bHNlIGVycm9yIGlzIGVuY291bnRlcmVkLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgUHVsc2VcbiAgICovXG4gIFB1bHNlRXJyb3IgPSAncHVsc2VlcnJvcicsXG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIFB1bHNlIGZpbHRlcnMgY2hhbmdlXG4gICAqXG4gICAqIEBjYXRlZ29yeSBQdWxzZVxuICAgKi9cbiAgUHVsc2VGaWx0ZXJzQ2hhbmdlZCA9ICdwdWxzZWZpbHRlcnNjaGFuZ2VkJyxcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiBhIFB1bHNlIGluc2lnaHQgaXMgZGlzY292ZXJlZFxuICAgKlxuICAgKiBAY2F0ZWdvcnkgUHVsc2VcbiAgICovXG4gIFB1bHNlSW5zaWdodERpc2NvdmVyZWQgPSAncHVsc2VpbnNpZ2h0ZGlzY292ZXJlZCcsXG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIFB1bHNlIG1ldHJpYyBzaXplIGNoYW5nZXNcbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBQdWxzZU1ldHJpY1NpemVDaGFuZ2VkID0gJ3B1bHNlbWV0cmljc2l6ZWNoYW5nZWQnLFxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBQdWxzZSBtZXRyaWMgdGltZSBkaW1lbnNpb24gY2hhbmdlc1xuICAgKlxuICAgKiBAY2F0ZWdvcnkgUHVsc2VcbiAgICovXG4gIFB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWQgPSAncHVsc2V0aW1lZGltZW5zaW9uY2hhbmdlZCcsXG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIFB1bHNlIFVSTCBjaGFuZ2VzXG4gICAqXG4gICAqIEBjYXRlZ29yeSBQdWxzZVxuICAgKi9cbiAgUHVsc2VVcmxDaGFuZ2VkID0gJ3B1bHNldXJsY2hhbmdlZCcsXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgbG9jYXRpb24gb2YgYSBjb250ZXh0IG1lbnUgd2hlcmUgdXNlcnMgY2FuIGFkZCBleHRlcm5hbCBtZW51IGl0ZW1zLlxuICovXG5leHBvcnQgZW51bSBBcGlNZW51VHlwZSB7XG4gIC8qKiBFeHRlcm5hbCBtZW51IGl0ZW0gd2lsbCBiZSBpbmplY3RlZCBpbiB1YmVydGlwIGRpYWxvZyAqL1xuICBVYmVydGlwID0gJ3ViZXJ0aXAnLFxufVxuXG4vKiogWW91IGNhbiB1c2UgdGhpcyB0eXBlIHdpdGggYSB7QGxpbmsgVml6fSBvYmplY3QuICovXG5leHBvcnQgZW51bSBUYWJsZWF1RGlhbG9nVHlwZSB7XG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIFBERiBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnRQREYgPSAnZXhwb3J0LXBkZicsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIFBvd2VyUG9pbnQgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0UG93ZXJQb2ludCA9ICdleHBvcnQtcG93ZXJwb2ludCcsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIERhdGEgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0RGF0YSA9ICdleHBvcnQtZGF0YScsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIENyb3NzVGFiIGRpYWxvZy5cbiAgICovXG4gIEV4cG9ydENyb3NzVGFiID0gJ2V4cG9ydC1jcm9zcy10YWInLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBXb3JrYm9vayBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnRXb3JrYm9vayA9ICdleHBvcnQtd29ya2Jvb2snLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBTaGFyZSBkaWFsb2cuXG4gICAqL1xuICBTaGFyZSA9ICdzaGFyZScsXG59XG4iLCJpbXBvcnQgeyBGaWx0ZXJPcHRpb25zIH0gZnJvbSAnLi4vU2hhcmVkL0ZpbHRlckludGVyZmFjZXMnO1xuaW1wb3J0IHsgRmlsdGVyRG9tYWluVHlwZSwgRmlsdGVyVHlwZSwgRmlsdGVyVXBkYXRlVHlwZSB9IGZyb20gJy4uL1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuaW1wb3J0IHsgUHVsc2VMYXlvdXQsIFB1bHNlVGltZURpbWVuc2lvbiB9IGZyb20gJy4vRW51bXMnO1xuaW1wb3J0IHsgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB9IGZyb20gJy4vV2ViQ29tcG9uZW50SW50ZXJmYWNlcyc7XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LXB1bHNlPiB3ZWIgY29tcG9uZW50LlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBQdWxzZUF0dHJpYnV0ZXMge1xuICBEaXNhYmxlRXhwbG9yZUZpbHRlciA9ICdkaXNhYmxlLWV4cGxvcmUtZmlsdGVyJyxcbiAgTGF5b3V0ID0gJ2xheW91dCcsXG4gIE9uRmlyc3RJbnRlcmFjdGl2ZSA9ICdvbkZpcnN0SW50ZXJhY3RpdmUnLFxuICBPbkZpcnN0UHVsc2VNZXRyaWNTaXplS25vd24gPSAnb25GaXJzdFB1bHNlTWV0cmljU2l6ZUtub3duJyxcbiAgT25QdWxzZVVybEVycm9yID0gJ29uUHVsc2VFcnJvcicsXG4gIE9uUHVsc2VGaWx0ZXJzQ2hhbmdlZCA9ICdvblB1bHNlRmlsdGVyc0NoYW5nZWQnLFxuICBPblB1bHNlSW5zaWdodERpc2NvdmVyZWQgPSAnb25QdWxzZUluc2lnaHREaXNjb3ZlcmVkJyxcbiAgT25QdWxzZU1ldHJpY1NpemVDaGFuZ2VkID0gJ29uUHVsc2VNZXRyaWNTaXplQ2hhbmdlZCcsXG4gIE9uUHVsc2VUaW1lRGltZW5zaW9uQ2hhbmdlZCA9ICdvblB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWQnLFxuICBPblB1bHNlVXJsQ2hhbmdlZCA9ICdvblB1bHNlVXJsQ2hhbmdlZCcsXG4gIFRpbWVEaW1lbnNpb24gPSAndGltZS1kaW1lbnNpb24nLFxuICBUb2tlbk9wdGlvbmFsID0gJ3Rva2VuLW9wdGlvbmFsJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZVNldHRpbmdzIGV4dGVuZHMgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZXhwbG9yZSBmaWx0ZXIgaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1wdWxzZSBpZD1cInRhYmxlYXVQdWxzZVwiIGRpc2FibGUtZXhwbG9yZS1maWx0ZXI+XG4gICAqIGBgYFxuICAgKi9cbiAgZGlzYWJsZUV4cGxvcmVGaWx0ZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGRlc2lyZWQgY3VzdG9tIGxheW91dCBvZiB0aGUgUHVsc2UgbWV0cmljLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBsYXlvdXQ9XCJjYXJkXCI+XG4gICAqIGBgYFxuICAgKi9cbiAgbGF5b3V0PzogUHVsc2VMYXlvdXQ7XG5cbiAgLyoqXG4gICAqIFRoZSB0b2tlbiB1c2VkIGZvciBhdXRob3JpemF0aW9uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG9rZW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgJ2xvYWRpbmcnIGF0dHJpYnV0ZSBvZiB0aGUgZW1iZWRkZWQgaWZyYW1lLlxuICAgKiBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pZnJhbWUjbG9hZGluZ1xuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLWxvYWRpbmc9XCJsYXp5XCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1sb2FkaW5nPVwibGF6eVwiIC8+XG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgaWZyYW1lLWF0dHItbG9hZGluZz1cImxhenlcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIGlmcmFtZUF0dHJpYnV0ZUxvYWRpbmc/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgJ3N0eWxlJyBhdHRyaWJ1dGUgb2YgdGhlIGVtYmVkZGVkIGlmcmFtZS5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1zdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkIHJlZFwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCByZWRcIiAvPlxuICAgKiA8dGFibGVhdS1wdWxzZSBpZD1cInRhYmxlYXVQdWxzZVwiIGlmcmFtZS1hdHRyLXN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgcmVkXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdHRyaWJ1dGVTdHlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSAnY2xhc3MnIGF0dHJpYnV0ZSBvZiB0aGUgZW1iZWRkZWQgaWZyYW1lIHByb3ZpZGluZyBhY2Nlc3MgdG8gYW55XG4gICAqIGN1c3RvbSBzZWxlY3RvcnMgZGVmaW5lZCBpbiB0aGUgYDxpZnJhbWUtc3R5bGU+YCBjaGlsZCB0YWcuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1wdWxzZSBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1jbGFzcz1cInJlZC1ib3JkZXJcIj5cbiAgICogICA8aWZyYW1lLXN0eWxlPlxuICAgKiAgICAgLnJlZC1ib3JkZXIge1xuICAgKiAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZWQ7XG4gICAqICAgICB9XG4gICAqICAgPC9pZnJhbWUtc3R5bGU+XG4gICAqIDwvdGFibGVhdS1wdWxzZT5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdHRyaWJ1dGVDbGFzcz86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEJhc2U2NC1lbmNvZGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgUHVsc2UgdGhlbWUgb2JqZWN0LlxuICAgKlxuICAgKi9cbiAgdGhlbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZGVzaXJlZCB0aW1lIGRpbWVuc2lvbiB0byBhcHBseSB0byB0aGUgUHVsc2UgbWV0cmljIGJ5IGRlZmF1bHQuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1wdWxzZSBpZD1cInRhYmxlYXVQdWxzZVwiIHRpbWUtZGltZW5zaW9uPVwiTW9udGhUb0RhdGVcIj5cbiAgICogYGBgXG4gICAqL1xuICB0aW1lRGltZW5zaW9uPzogUHVsc2VUaW1lRGltZW5zaW9uO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdG9rZW4gaXMgb3B0aW9uYWwuXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIG1ldHJpYyB3aWxsIGF0dGVtcHQgdG8gbG9hZCBldmVuIHdpdGhvdXQgc3BlY2lmeWluZyBhIHRva2VuLlxuICAgKiBUaGlzIHdhcyBhZGRlZCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBNb2JpbGUgdGVhbSB3aG8gdXNlcyBQS0NFIGZsb3cgdG8gaW5pdGlhdGUgdGhlIHNlc3Npb25cbiAgICogYW5kIHNob3VsZCBub3QgYmUgYWR2ZXJ0aXNlZCB0byAzcmQgcGFydGllcy5cbiAgICpcbiAgICogQGlnbm9yZVxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiB0b2tlbi1vcHRpb25hbD5cbiAgICogYGBgXG4gICAqL1xuICBpc1Rva2VuT3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBjaGlsZCB0YWdzIGZvciBUYWJsZWF1UHVsc2UgY3VzdG9tIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBlbnVtIFB1bHNlQ2hpbGRFbGVtZW50cyB7XG4gIC8qKlxuICAgKiBDdXN0b20gc3R5bGVzIGFwcGxpY2FibGUgdG8gdGhlIGVtYmVkZGVkIGlmcmFtZSBlbGVtZW50IGl0c2VsZiAobm90IGluc2lkZSBpdCkuXG4gICAqL1xuICBJZnJhbWVTdHlsZSA9ICdpZnJhbWUtc3R5bGUnLFxuXG4gIC8qKlxuICAgKiBBIHBhcmFtZXRlciB0byBiZSB1c2VkIGluIHRoZSBQdWxzZSB0aGVtZS5cbiAgICovXG4gIFRoZW1lUGFyYW1ldGVyID0gJ3RoZW1lLXBhcmFtZXRlcicsXG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBmaWx0ZXIgcGFyYW1ldGVycy5cbiAgICovXG4gIFB1bHNlRmlsdGVyID0gJ3B1bHNlLWZpbHRlcicsXG59XG5cbi8qKlxuICogVGhlIGF0dHJpYnV0ZXMgb2YgdGhlIDx0aGVtZS1wYXJhbWV0ZXI+IGNoaWxkIGVsZW1lbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlVGhlbWVQcm9wZXJ0eSB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSB0aGVtZSBwYXJhbWV0ZXIgdG8gYmUgc2V0LlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWYWx1ZSBmb3IgdGhlIHRoZW1lIHBhcmFtZXRlciBiZWluZyBzZXQuXG4gICAqL1xuICB2YWx1ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCB0eXBlIG9mIHRoZW1lIHBhcmFtZXRlciBiZWluZyBzZXQuXG4gICAqL1xuICB0eXBlOiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKipcbiAqIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBjaGlsZCBlbGVtZW50cyBvZiA8dGFibGVhdS1wdWxzZT4uXG4gKi9cbmV4cG9ydCBlbnVtIFB1bHNlQ2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIE5hbWUgPSAnbmFtZScsXG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBUeXBlID0gJ3R5cGUnLFxufVxuXG4vKipcbiAqIFRoZSBQdWxzZSB0aGVtZSBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IHR5cGUgUHVsc2VUaGVtZSA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG4vKipcbiAqIEFjdGlvbnMgcmVsYXRlZCB0byBldmVudHMgYW5kIHN0YXRlIG9mIHRoZSBQdWxzZSBtZXRyaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZUFjdGlvbnMge1xuICAvKipcbiAgICogQXBwbGllcyB0aGUgbGlzdCBvZiBwcm92aWRlZCBjYXRlZ29yaWNhbCBmaWx0ZXIgdmFsdWVzIHRvIHRoZSBQdWxzZSBtZXRyaWMuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgICAgICBUaGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gZmlsdGVyIG9uLlxuICAgKiBAcGFyYW0gdmFsdWVzICAgICAgICAgVGhlIGxpc3Qgb2YgdmFsdWVzIHRvIGZpbHRlciBvbi5cbiAgICogQHBhcmFtIHVwZGF0ZVR5cGUgICAgIFRoZSB1cGRhdGUgdHlwZSBvZiB0aGlzIGZpbHRlciAoYWRkLCBhbGwsIHJlbW92ZSwgcmVwbGFjZSkuXG4gICAqIEBwYXJhbSBmaWx0ZXJPcHRpb25zICBBZHZhbmNlZCBmaWx0ZXIgb3B0aW9ucyAoaXNFeGNsdWRlTW9kZSkuXG4gICAqIEByZXR1cm5zIFRoZSBmaWVsZCBuYW1lIHRoYXQgdGhlIGZpbHRlciBpcyBhcHBsaWVkIG9uLlxuICAgKi9cbiAgYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZywgdmFsdWVzOiBQdWxzZUZpZWxkVmFsdWVBcnJheSwgdXBkYXRlVHlwZTogRmlsdGVyVXBkYXRlVHlwZSwgb3B0aW9uczogRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAvKipcbiAgICogQXBwbGllcyBhdCBsZWFzdCBvbmUgY2F0ZWdvcmljYWwgZmlsdGVyIHZhbHVlIHRvIHRoZSBQdWxzZSBtZXRyaWMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8e1xuICAgKiAgICAgICBmaWVsZE5hbWU6IHN0cmluZztcbiAgICogICAgICAgdmFsdWVzOiBQdWxzZUZpZWxkVmFsdWVBcnJheTtcbiAgICogICAgICAgdXBkYXRlVHlwZTogRmlsdGVyVXBkYXRlVHlwZTtcbiAgICogICAgICAgb3B0aW9uczogRmlsdGVyT3B0aW9ucztcbiAgICogICAgIH0+fSBmaWx0ZXJzIFRoZSBzZXQgb2YgZmlsdGVycyB0byBhcHBseS5cbiAgICogQHJldHVybnMgVGhlIGZpZWxkIG5hbWVzIHRoYXQgdGhlIGZpbHRlciB3YXMgYXBwbGllZCBvbi5cbiAgICovXG4gIGFwcGx5RmlsdGVyc0FzeW5jKFxuICAgIGZpbHRlcnM6IEFycmF5PHtcbiAgICAgIGZpZWxkTmFtZTogc3RyaW5nO1xuICAgICAgdmFsdWVzOiBQdWxzZUZpZWxkVmFsdWVBcnJheTtcbiAgICAgIHVwZGF0ZVR5cGU6IEZpbHRlclVwZGF0ZVR5cGU7XG4gICAgICBvcHRpb25zOiBGaWx0ZXJPcHRpb25zO1xuICAgIH0+LFxuICApOiBQcm9taXNlPEFycmF5PHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHRpbWUgZGltZW5zaW9uIGFwcGxpZWQgdG8gdGhlIFB1bHNlIG1ldHJpYy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgdGltZSBkaW1lbnNpb24uXG4gICAqL1xuICBnZXRUaW1lRGltZW5zaW9uQXN5bmMoKTogUHJvbWlzZTxQdWxzZVRpbWVEaW1lbnNpb24+O1xuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSB0aW1lIGRpbWVuc2lvbiB0byB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0ge1B1bHNlVGltZURpbWVuc2lvbn0gdGltZURpbWVuc2lvbiBUaGUgdGltZSBkaW1lbnNpb24gdG8gYXBwbHlcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhcHBseVRpbWVEaW1lbnNpb25Bc3luYyh0aW1lRGltZW5zaW9uOiBQdWxzZVRpbWVEaW1lbnNpb24pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBHZXRzIGEgbGlzdCBvZiBmaWx0ZXJzIGZvciB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxQdWxzZUZpbHRlcj4+fSBUaGUgbGlzdCBvZiBmaWx0ZXJzLlxuICAgKi9cbiAgZ2V0RmlsdGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8UHVsc2VGaWx0ZXI+PjtcblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBleGlzdGluZyBmaWx0ZXIgZm9yIHRoZSBnaXZlbiBmaWVsZCBvbiB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGROYW1lICBUaGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gY2xlYXIgZmlsdGVyIG9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZmllbGQgdG8gY2xlYXIgZmlsdGVyIG9uLlxuICAgKi9cbiAgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWVzOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgZXhpc3RpbmcgZmlsdGVyIGZvciB0aGUgZ2l2ZW4gZmllbGRzIG9uIHRoZSBQdWxzZSBtZXRyaWMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZmllbGROYW1lcyBUaGUgbmFtZSBvZiB0aGUgZmllbGRzIHRvIGNsZWFyIGZpbHRlciBvbi5cbiAgICogQHJldHVybnMgVGhlIGZpZWxkcyB0byBjbGVhciBmaWx0ZXIgb24uXG4gICAqL1xuICBjbGVhckZpbHRlcnNBc3luYyhmaWVsZE5hbWVzOiBBcnJheTxzdHJpbmc+KTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PjtcblxuICAvKipcbiAgICogUmVzZXRzIGFsbCB0aGUgZXhpc3RpbmcgZmlsdGVycyBvbiB0aGUgUHVsc2UgbWV0cmljLlxuICAgKi9cbiAgY2xlYXJBbGxGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGZpbHRlciB0aGUgUHVsc2UgbWV0cmljIGJlZm9yZSBpbml0aWFsaXphdGlvbi4gSWYgdXNlZCBhZnRlciBpbml0aWFsaXphdGlvbiwgaXQgd2lsbCByZS1yZW5kZXIgdGhlIG1ldHJpYy5cbiAgICogRm9yIGZpbHRlcmluZyBhZnRlciBpbml0aWFsaXphdGlvbiwgdXNlIHRoZSBvdGhlciBmaWx0ZXJpbmcgbWV0aG9kcywgc3VjaCBhcyBgYXBwbHlGaWx0ZXJBc3luY2AuXG4gICAqXG4gICAqIElmIHlvdSBhZGQgdGhlIHNhbWUgZmlsdGVyIGZpZWxkcyB1c2luZyB0aGUgYGFkZEZpbHRlcigpYCBtZXRob2QgYW5kIGJ5IHVzaW5nIHRoZSBgPHB1bHNlLWZpbHRlcj5gIGVsZW1lbnQgaW4gdGhlIGA8dGFibGVhdS1wdWxzZT5gIHdlYiBjb21wb25lbnQsXG4gICAqIHlvdSBtaWdodCBleHBlcmllbmNlIHVuZXhwZWN0ZWQgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGZpbHRlciBvbi5cbiAgICogQHBhcmFtIHZhbHVlIFNpbmdsZSB2YWx1ZSBvciBhIGxpc3Qgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcyB0byBmaWx0ZXIgb24uXG4gICAqXG4gICAqIGBgYFxuICAgKiBwdWxzZS5hZGRGaWx0ZXIoJ1JlZ2lvbicsICdDZW50cmFsLFdlc3QnKTtcbiAgICogYGBgXG4gICAqL1xuICBhZGRGaWx0ZXIoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gcmVhZGp1c3QgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGVtYmVkZGVkIFB1bHNlIG1ldHJpYyBpbiByZXNwb25zZSB0byB0aGluZ3MgbGlrZSBhIHdpbmRvdyByZXNpemUsIGRldmljZSBvcmllbnRhdGlvbiBjaGFuZ2UsIG9yXG4gICAqIHBhcmVudCBjb250YWluZXIgcmVzaXplLlxuICAgKlxuICAgKiBgYGBcbiAgICogd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHB1bHNlLnJlc2l6ZSgpKTtcbiAgICpcbiAgICogbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHB1bHNlLnJlc2l6ZSgpKS5vYnNlcnZlKHB1bHNlLnBhcmVudEVsZW1lbnQpO1xuICAgKiBgYGBcbiAgICovXG4gIHJlc2l6ZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSB0b3AtbGV2ZWwgUHVsc2Ugb2JqZWN0LlxuICoqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZSBleHRlbmRzIFB1bHNlU2V0dGluZ3MsIFB1bHNlQWN0aW9ucyB7fVxuXG4vKipcbiAqIEEgUHVsc2VGaWVsZFZhbHVlQXJyYXkgaXMgYW4gYXJyYXkgdGhhdCBjYW4gY29udGFpbiBzdHJpbmdzLCBib29sZWFucywgb3IgbnVsbHMsIGJ1dCB3aWxsIG5ldmVyIGNvbnRhaW4gYm90aCBzdHJpbmdzIGFuZCBib29sZWFucyBhdCB0aGUgc2FtZSB0aW1lLlxuICovXG5leHBvcnQgdHlwZSBQdWxzZUZpZWxkVmFsdWVBcnJheSA9IEFycmF5PGJvb2xlYW4gfCBudWxsPiB8IEFycmF5PHN0cmluZyB8IG51bGw+O1xuXG4vKipcbiAqXG4gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgb2YgdGhlIFB1bHNlIGZpbHRlciB0eXBlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZUZpbHRlciB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgYmVpbmcgZmlsdGVyZWQuICBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgY2FwdGlvblxuICAgKiBhcyBzaG93biBpbiB0aGUgVUksIGFuZCBub3QgdGhlIGFjdHVhbCBkYXRhYmFzZSBmaWVsZCBuYW1lLlxuICAgKi9cbiAgZmllbGROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBmaWx0ZXIuXG4gICAqL1xuICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgUHVsc2UgbWV0cmljIElELlxuICAgKi9cbiAgbWV0cmljSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIFB1bHNlIENhdGVnb3JpY2FsIEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpY2FsUHVsc2VGaWx0ZXIgZXh0ZW5kcyBQdWxzZUZpbHRlciB7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdmFsdWVzIGFwcGxpZWQgdG8gdGhpcyBjYXRlZ29yaWNhbCBmaWx0ZXIuIE5vdGljZSB0aGF0IGlmIHRoZSBQdWxzZSBtZXRyaWNcbiAgICogaGFzIGEgZGVmaW5pdGlvbiBmaWx0ZXIsIHRoZSBjdXJyZW50IHJlbGV2YW50IHZhbHVlcyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nXG4gICAqIGBnZXREb21haW5Bc3luYyhGaWx0ZXJEb21haW5UeXBlLlJlbGV2YW50KWAuXG4gICAqL1xuICByZWFkb25seSBhcHBsaWVkVmFsdWVzOiBQdWxzZUZpZWxkVmFsdWVBcnJheTtcblxuICAvKipcbiAgICogVHJ1ZSBpZiB0aGlzIGZpbHRlciBpcyBhbiBleGNsdWRlIGZpbHRlciwgZmFsc2UgaWYgYW4gaW5jbHVkZSBmaWx0ZXIuXG4gICAqL1xuICByZWFkb25seSBpc0V4Y2x1ZGVNb2RlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUcnVlIGlmIGFsbCB0aGUgdmFsdWVzIGFyZSBzZWxlY3RlZCBmb3IgdGhpcyBmaWx0ZXIuIFdoZW4gJ0FsbCcgaXMgc2VsZWN0ZWQsXG4gICAqIGFwcGxpZWRWYWx1ZXMgcmV0dXJucyBhbiBlbXB0eSBsaXN0LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNBbGxTZWxlY3RlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGRvbWFpbiBvZiBhIGNhdGVnb3JpY2FsIGZpbHRlci5cbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgdW5kZWZpbmVkKX0gc2VhcmNoVGVybSBUaGUgdGVybSB0byBzZWFyY2ggZm9yIGluIHRoZSBkb21haW4uXG4gICAqIEBwYXJhbSB7KG51bWJlciB8IHVuZGVmaW5lZCl9IHBhZ2VTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiB2YWx1ZXMgdG8gcmV0dXJuLiBJZ25vcmVkIHdoZW4gbmV4dFBhZ2VUb2tlbiBpcyBub3QgcHJvdmlkZWQuXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IHVuZGVmaW5lZCl9IG5leHRQYWdlVG9rZW4gVGhlIG5leHQgcGFnZSB0b2tlbiByZXR1cm5lZCBieSBQdWxzZSB3aGVuIGFkZGl0aW9uYWwgdmFsdWVzIGFyZSBhdmFpbGFibGUuXG4gICAqIEBwYXJhbSB7KEZpbHRlckRvbWFpblR5cGUgfCB1bmRlZmluZWQpfSBkb21haW5UeXBlIFRoZSBkb21haW4gdHlwZSBvZiB0aGUgZmlsdGVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQdWxzZUNhdGVnb3JpY2FsRG9tYWluPn0gQSBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIGNhdGVnb3JpY2FsIGRvbWFpbiBmb3IgdGhlIGZpbHRlci5cbiAgICovXG4gIGdldERvbWFpbkFzeW5jOiAoXG4gICAgc2VhcmNoVGVybT86IHN0cmluZyxcbiAgICBwYWdlU2l6ZT86IG51bWJlcixcbiAgICBuZXh0UGFnZVRva2VuPzogc3RyaW5nLFxuICAgIGRvbWFpblR5cGU/OiBGaWx0ZXJEb21haW5UeXBlLFxuICApID0+IFByb21pc2U8UHVsc2VDYXRlZ29yaWNhbERvbWFpbj47XG59XG5cbi8qKlxuICogVGhlIGRvbWFpbiBvZiBhIFB1bHNlIGNhdGVnb3JpY2FsIGZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlQ2F0ZWdvcmljYWxEb21haW4ge1xuICAvKipcbiAgICogVGhlIGRvbWFpbiB0eXBlIChyZWxldmFudCwgZGF0YWJhc2UpXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBGaWx0ZXJEb21haW5UeXBlO1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgdmFsdWVzIGluIHRoZSBkb21haW4gb2YgdGhlIGZpbHRlclxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzOiBQdWxzZUZpZWxkVmFsdWVBcnJheTtcbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBhdmFpbGFibGUgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgZG9tYWluIG9mIHRoZSBmaWx0ZXIuXG4gICAqL1xuICByZWFkb25seSB0b3RhbEF2YWlsYWJsZTogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG5leHQgcGFnZSB0b2tlbiByZXR1cm5lZCBieSBQdWxzZSB3aGVuIGFkZGl0aW9uYWwgdmFsdWVzIGFyZSBhdmFpbGFibGUuXG4gICAqIFByb3ZpZGUgdGhpcyB0b2tlbiB0byBnZXREb21haW5Bc3luYyB0byBnZXQgdGhlIG5leHQgcGFnZSBvZiB2YWx1ZXMuXG4gICAqL1xuICByZWFkb25seSBuZXh0UGFnZVRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgeyBFbWJlZGRpbmdFcnJvckNvZGVzIH0gZnJvbSAnLi9FbnVtcyc7XG5cbi8qKlxuICogQ3VzdG9tIGVycm9yIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IEVycm9yIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZWF1RW1iZWRkaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUYWJsZWF1IHNwZWNpZmljIEVycm9yQ29kZVxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3JDb2RlOiBFbWJlZGRpbmdFcnJvckNvZGVzO1xufVxuIiwiaW1wb3J0IHtcbiAgQ3Jvc3N0YWJGaWxlRm9ybWF0LFxuICBEZXZpY2VUeXBlLFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFRhYmxlYXVEaWFsb2dUeXBlLFxuICBUYWJsZWF1RXZlbnRUeXBlLFxuICBUb29sYmFyLFxufSBmcm9tICcuL0VudW1zJztcbmltcG9ydCB7IFNoZWV0U2l6ZSB9IGZyb20gJy4vU2hlZXRJbnRlcmZhY2VzJztcbmltcG9ydCB7IFZpelFMRGF0YVNlcnZpY2VTZXNzaW9uSW5mbyB9IGZyb20gJy4vVml6UUxEYXRhU2VydmljZUludGVyZmFjZXMnO1xuaW1wb3J0IHsgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncywgV2ViQ29tcG9uZW50U2V0dGluZ3NTaGFyZWQgfSBmcm9tICcuL1dlYkNvbXBvbmVudEludGVyZmFjZXMnO1xuaW1wb3J0IHsgV29ya2Jvb2sgfSBmcm9tICcuL1dvcmtib29rSW50ZXJmYWNlJztcblxuLyoqXG4gKiBUaGUgc2hhcmVkIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgPHRhYmxlYXUtdml6PiBhbmQgPHRhYmxlYXUtYXV0aG9yaW5nLXZpej4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gVml6U2hhcmVkQXR0cmlidXRlcyB7XG4gIFRvdWNoT3B0aW1pemUgPSAndG91Y2gtb3B0aW1pemUnLFxuICBIaWRlRWRpdEluRGVza3RvcEJ1dHRvbiA9ICdoaWRlLWVkaXQtaW4tZGVza3RvcC1idXR0b24nLFxuICBTdXBwcmVzc0RlZmF1bHRFZGl0QmVoYXZpb3IgPSAnc3VwcHJlc3MtZGVmYXVsdC1lZGl0LWJlaGF2aW9yJyxcbiAgRGlzYWJsZVZlcnNpb25DaGVjayA9ICdkaXNhYmxlLXZlcnNpb24tY2hlY2snLFxuICBPbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkID0gJ29uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQnLFxuICBPbkZpcnN0Vml6U2l6ZUtub3duID0gJ29uRmlyc3RWaXpTaXplS25vd24nLFxuICBPbkZpcnN0SW50ZXJhY3RpdmUgPSAnb25GaXJzdEludGVyYWN0aXZlJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgPHRhYmxlYXUtdml6PiB3ZWIgY29tcG9uZW50LlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBWaXpBdHRyaWJ1dGVzIHtcbiAgRGlzYWJsZVVybEFjdGlvbnNQb3B1cHMgPSAnZGlzYWJsZS11cmwtYWN0aW9ucycsXG4gIEhpZGVUYWJzID0gJ2hpZGUtdGFicycsXG4gIFRvb2xiYXIgPSAndG9vbGJhcicsXG4gIEluc3RhbmNlSWRUb0Nsb25lID0gJ2luc3RhbmNlLWlkLXRvLWNsb25lJyxcbiAgRGV2aWNlID0gJ2RldmljZScsXG4gIEhpZGVFZGl0QnV0dG9uID0gJ2hpZGUtZWRpdC1idXR0b24nLFxuICBPbkVkaXRCdXR0b25DbGlja2VkID0gJ29uRWRpdEJ1dHRvbkNsaWNrZWQnLFxuICBPbkZpbHRlckNoYW5nZWQgPSAnb25GaWx0ZXJDaGFuZ2VkJyxcbiAgT25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudCA9ICdvbkN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50JyxcbiAgT25NYXJrU2VsZWN0aW9uQ2hhbmdlZCA9ICdvbk1hcmtTZWxlY3Rpb25DaGFuZ2VkJyxcbiAgT25QYXJhbWV0ZXJDaGFuZ2VkID0gJ29uUGFyYW1ldGVyQ2hhbmdlZCcsXG4gIE9uVG9vbGJhclN0YXRlQ2hhbmdlZCA9ICdvblRvb2xiYXJTdGF0ZUNoYW5nZWQnLFxuICBPblVybEFjdGlvbiA9ICdvblVybEFjdGlvbicsXG4gIE9uVGFiU3dpdGNoZWQgPSAnb25UYWJTd2l0Y2hlZCcsXG4gIE9uQ3VzdG9tVmlld0xvYWRlZCA9ICdvbkN1c3RvbVZpZXdMb2FkZWQnLFxuICBPbkN1c3RvbVZpZXdSZW1vdmVkID0gJ29uQ3VzdG9tVmlld1JlbW92ZWQnLFxuICBPbkN1c3RvbVZpZXdTYXZlZCA9ICdvbkN1c3RvbVZpZXdTYXZlZCcsXG4gIE9uQ3VzdG9tVmlld1NldERlZmF1bHQgPSAnb25DdXN0b21WaWV3U2V0RGVmYXVsdCcsXG4gIE9uU3RvcnlQb2ludFN3aXRjaGVkID0gJ29uU3RvcnlQb2ludFN3aXRjaGVkJyxcbiAgT25TdW1tYXJ5RGF0YUNoYW5nZWQgPSAnb25TdW1tYXJ5RGF0YUNoYW5nZWQnLFxuICBPblJlYWR5VG9SZWNlaXZlQXV0aFRva2VuID0gJ29uUmVhZHlUb1JlY2VpdmVBdXRoVG9rZW4nLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS1hdXRob3Jpbmctdml6PiB3ZWIgY29tcG9uZW50LlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBWaXpBdXRob3JpbmdBdHRyaWJ1dGVzIHtcbiAgT25Xb3JrYm9va1B1Ymxpc2hlZCA9ICdvbldvcmtib29rUHVibGlzaGVkJyxcbiAgT25Xb3JrYm9va1B1Ymxpc2hlZEFzID0gJ29uV29ya2Jvb2tQdWJsaXNoZWRBcycsXG4gIE9uV29ya2Jvb2tSZWFkeVRvQ2xvc2UgPSAnb25Xb3JrYm9va1JlYWR5VG9DbG9zZScsXG4gIEhpZGVDbG9zZUJ1dHRvbiA9ICdoaWRlLWNsb3NlLWJ1dHRvbicsXG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIGNoaWxkIHRhZ3MgZm9yIFRhYmxlYXVWaXogYW5kIFRhYmxlYXVBdXRob3JpbmdWaXogY3VzdG9tIGVsZW1lbnRzLlxuICovXG5leHBvcnQgZW51bSBWaXpDaGlsZEVsZW1lbnRzIHtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBmaWx0ZXIgcGFyYW1ldGVycy4gQXZhaWxhYmxlIG9ubHkgaW4gdmlld2luZyBtb2RlLlxuICAgKi9cbiAgVml6RmlsdGVyID0gJ3Zpei1maWx0ZXInLFxuXG4gIC8qKlxuICAgKiBDb250YWlucyBhIG5hbWUgYW5kIHZhbHVlIGZvciBhIHBhcmFtZXRlci4gQXZhaWxhYmxlIG9ubHkgaW4gdmlld2luZyBtb2RlLlxuICAgKi9cbiAgVml6UGFyYW1ldGVyID0gJ3Zpei1wYXJhbWV0ZXInLFxuXG4gIC8qKlxuICAgKiBDb250YWlucyBhIGxpc3Qgb2YgY3VzdG9tIHBhcmFtZXRlcnMuICBBdmFpbGFibGUgaW4gYm90aCB2aWV3aW5nIGFuZCBhdXRob3JpbmcgbW9kZXMuXG4gICAqL1xuICBDdXN0b21QYXJhbWV0ZXIgPSAnY3VzdG9tLXBhcmFtZXRlcicsXG5cbiAgLyoqXG4gICAqIEN1c3RvbSBzdHlsZXMgYXBwbGljYWJsZSB0byB0aGUgZW1iZWRkZWQgaWZyYW1lIGVsZW1lbnQgaXRzZWxmIChub3QgaW5zaWRlIGl0KS4gQXZhaWxhYmxlIGluIGJvdGggdmlld2luZyBhbmQgYXV0aG9yaW5nIG1vZGVzLlxuICAgKi9cbiAgSWZyYW1lU3R5bGUgPSAnaWZyYW1lLXN0eWxlJyxcbn1cblxuZXhwb3J0IGVudW0gVml6Q2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBOYW1lID0gJ25hbWUnLFxufVxuXG4vKipcbiAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSB0b3AgbGV2ZWwgVml6IG9iamVjdC5cbiAqKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6IGV4dGVuZHMgVml6U2V0dGluZ3MsIFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFZpekFjdGlvbnMge1xuICAvKipcbiAgICogT25lIFdvcmtib29rIGlzIHN1cHBvcnRlZCBwZXIgdmlzdWFsaXphdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtib29rPzogV29ya2Jvb2s7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYW4gYXV0aCB0b2tlbiBmb3Igc2FsZXNmb3JjZSBuYXRpdmUgbW9kZVxuICAgKiBAcGFyYW0gdG9rZW5cbiAgICovXG4gIHNldEF1dGhUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wIGxldmVsIEF1dGhvcmluZyBWaXogb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhvcmluZ1ZpeiBleHRlbmRzIFZpekF1dGhvcmluZ1NldHRpbmdzLCBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHZpc3VhbGl6YXRpb24ncyBjdXJyZW50IFVSTC5cbiAgICovXG4gIGdldEN1cnJlbnRTcmNBc3luYygpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYW4gYXV0aCB0b2tlbiBmb3Igc2FsZXNmb3JjZSBuYXRpdmUgbW9kZVxuICAgKiBAcGFyYW0gdG9rZW5cbiAgICovXG4gIHNldEF1dGhUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHJlYWRqdXN0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbWJlZGRlZCB2aXogaW4gcmVzcG9uc2UgdG8gdGhpbmdzIGxpa2UgYSB3aW5kb3cgcmVzaXplLCBkZXZpY2Ugb3JpZW50YXRpb24gY2hhbmdlLCBvclxuICAgKiBwYXJlbnQgY29udGFpbmVyIHJlc2l6ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB2aXoucmVzaXplKCkpO1xuICAgKlxuICAgKiBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdml6LnJlc2l6ZSgpKS5vYnNlcnZlKHZpei5wYXJlbnRFbGVtZW50KTtcbiAgICogYGBgXG4gICAqL1xuICByZXNpemUoKTogdm9pZDtcblxuICAvKipcbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGxhdW5jaCB0aGUgQW5hbHl0aWNzIEFzc2lzdGFudCBzaWRlIHBhbmUuXG4gICAqIFlvdSBjYW4gdXNlIHRoZSBgaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGVBc3luYygpYCBtZXRob2QgdG8gY2hlY2sgaWYgdGhlIEFuYWx5dGljcyBBc3Npc3RhbnQgaXMgYXZhaWxhYmxlIGZvciB1c2UuXG4gICAqXG4gICAqIGBgYFxuICAgKiBjb25zdCBpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZSA9IGF3YWl0IHZpei5pc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZUFzeW5jKCk7XG4gICAqIGlmIChpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZSkge1xuICAgKiAgIGF3YWl0IHZpei5sYXVuY2hBbmFseXRpY3NBc3Npc3RhbnRBc3luYygpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgbGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50QXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIEFuYWx5dGljcyBBc3Npc3RhbnQgc2lkZSBwYW5lIGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIGlzQW5hbHl0aWNzQXNzaXN0YW50QXZhaWxhYmxlQXN5bmMoKTogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc2VydmVyIHNlc3Npb24gaW5mb3JtYXRpb24gZm9yIHVzZSB3aXRoIFZpelFMIERhdGEgU2VydmljZS5cbiAgICogVGhlIHNlcnZlciBzZXNzaW9uIGluZm9ybWF0aW9uIGNvbnRhaW5zIHRoZSBWaXpRTCBTZXJ2ZXIgU2Vzc2lvbiBJRCBhbmQgdGhlIEdsb2JhbCBTZXNzaW9uIEhlYWRlci5cbiAgICovXG4gIGdldFZpelFMRGF0YVNlcnZpY2VTZXNzaW9uSW5mbygpOiBWaXpRTERhdGFTZXJ2aWNlU2Vzc2lvbkluZm87XG59XG5cbi8qKlxuICogUGFydGlhbGx5IGltcGxlbWVudGVkIC0gQWN0aW9ucyByZWxhdGVkIHRvIGV2ZW50cyBhbmQgc3RhdGUgb2YgdGhlIHZpelxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpekFjdGlvbnMge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYXV0b21hdGljIHVwZGF0ZXMgYXJlIGN1cnJlbnRseSBwYXVzZWQuXG4gICAqL1xuICByZWFkb25seSBhdXRvbWF0aWNVcGRhdGVzQXJlUGF1c2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQYXVzZSBsYXlvdXQgdXBkYXRlcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZSByZXNpemluZyB0aGUgdmlzdWFsaXphdGlvbiBvciBwZXJmb3JtaW5nIG11bHRpcGxlIGNhbGxzIHRoYXQgY291bGQgYWZmZWN0IHRoZSBsYXlvdXQuXG4gICAqL1xuICBwYXVzZUF1dG9tYXRpY1VwZGF0ZXNBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBSZXN1bWUgbGF5b3V0IHVwZGF0ZXMuXG4gICAqL1xuICByZXN1bWVBdXRvbWF0aWNVcGRhdGVzQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVG9nZ2xlIGxheW91dCB1cGRhdGVzLlxuICAgKi9cbiAgdG9nZ2xlQXV0b21hdGljVXBkYXRlc0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gdGhlIFJldmVydCBBbGwgdG9vbGJhciBidXR0b24sIHdoaWNoIHJlc3RvcmVzIHRoZSB3b3JrYm9vayB0byBpdHMgc3RhcnRpbmcgc3RhdGUuXG4gICAqL1xuICByZXZlcnRBbGxBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFcXVpdmFsZW50IHRvIGNsaWNraW5nIG9uIHRoZSBSZWZyZXNoIERhdGEgdG9vbGJhciBidXR0b24uXG4gICAqL1xuICByZWZyZXNoRGF0YUFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gRG93bmxvYWQgPiBJbWFnZSBmcm9tIHRoZSB0b29sYmFyLCB3aGljaCBjcmVhdGVzIGEgUE5HIGZpbGUgb2YgdGhlIGN1cnJlbnQgdmlzdWFsaXphdGlvbi5cbiAgICovXG4gIGV4cG9ydEltYWdlQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXhwb3J0cyB0aGUgY3Jvc3N0YWIgb2YgYW55IGdpdmVuIHdvcmtzaGVldCB3aXRoaW4gdGhlIGN1cnJlbnQgdmlldyB0byBhXG4gICAqIHNwZWNpZmllZCBmb3JtYXQgKENyb3NzdGFiRmlsZUZvcm1hdC5FeGNlbCwgQ3Jvc3N0YWJGaWxlRm9ybWF0LkNTVikuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgc2hlZXQgbmFtZSBkb2VzIG5vdCBtYXRjaCBhbnkgd29ya3NoZWV0cyB3aXRoaW4gdGhlIGFjdGl2ZSBzaGVldC5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjcm9zc3RhYiBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkLlxuICAgKiA+WyFOb3RlXSBgZXhwb3J0Q3Jvc3N0YWJBc3luY2AgcmVzb2x2ZXMgd2hlbiBhIGRvd25sb2FkIGlzIGluaXRpYXRlZC4gSXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGlmIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogdml6LmV4cG9ydENyb3NzdGFiQXN5bmMoJ1NhbGVzIGJ5IFNlZ21lbnQnLCBDcm9zc3RhYkZpbGVGb3JtYXQuQ1NWKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRDcm9zc3RhYkFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCBmb3JtYXQ6IENyb3NzdGFiRmlsZUZvcm1hdCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIHN1bW1hcnkgZGF0YSBzaG93biBpbiB0aGUgVmlldyBEYXRhIHdpbmRvd1xuICAgKiAoc2hvd24gd2hlbiB5b3UgY2xpY2sgRG93bmxvYWQgPiBEYXRhIGZyb20gdGhlIHRvb2xiYXIgZm9yIGFueSBnaXZlbiB3b3Jrc2hlZXQgd2l0aGluIHRoZSBjdXJyZW50IHZpZXcpLlxuICAgKiBUaGUgY3VycmVudCBmaWxlIGZvcm1hdCBpcyBDU1YuIFRoZXJlIGlzIG5vIGxpbWl0YXRpb24gb24gdGhlIGFtb3VudCBvZiBzdW1tYXJ5IGRhdGEgeW91IGNhbiBleHBvcnQuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgc2hlZXQgbmFtZSBkb2VzIG5vdCBtYXRjaCBhbnkgd29ya3NoZWV0cyB3aXRoaW4gdGhlIGFjdGl2ZSBzaGVldC5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZC5cbiAgICogPlshTm90ZV0gYGV4cG9ydERhdGFBc3luY2AgcmVzb2x2ZXMgd2hlbiBhIGRvd25sb2FkIGlzIGluaXRpYXRlZC4gSXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGlmIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogY29uc3QgYWN0aXZlU2hlZXQgPSB2aXoud29ya2Jvb2suYWN0aXZlU2hlZXQ7XG4gICAqIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5Xb3Jrc2hlZXQpIHtcbiAgICogICBjb25zdCBjb2x1bW5zID0gYXdhaXQgYWN0aXZlU2hlZXQuZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTtcbiAgICogICAvLyBHZXR0aW5nIGZpZWxkSWQncyBmb3IgTGF0aXR1ZGUgYW5kIExvbmdpdHVkZSBjb2x1bW5zXG4gICAqICAgY29uc3QgY29sdW1uc1RvSW5jbHVkZUJ5SWQgPSBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB7XG4gICAqICAgICBpZiAoY29sdW1uLmZpZWxkTmFtZSA9PT0gJ0xhdGl0dWRlJyB8fCBjb2x1bW4uZmllbGROYW1lID09PSAnTG9uZ2l0dWRlJykge1xuICAgKiAgICAgICByZXR1cm4gY29sdW1uLmZpZWxkSWQ7XG4gICAqICAgICB9XG4gICAqICAgfSk7XG4gICAqICAgYXdhaXQgdml6LmV4cG9ydERhdGFBc3luYyhhY3RpdmVTaGVldC5uYW1lLCB7IGNvbHVtbnNUb0luY2x1ZGVCeUlkIH0pO1xuICAgKiB9XG4gICAqIGVsc2UgaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLkRhc2hib2FyZCkge1xuICAgKiAgIC8vIEV4cG9ydGluZyB0aGUgc3VtbWFyeSBkYXRhIGZvciBlYWNoIHdvcmtzaGVldCBpbiB0aGUgZGFzaGJvYXJkIHdoaWxlIGFsc28gaWdub3JpbmcgYWxpYXNlc1xuICAgKiAgIGZvciAoY29uc3Qgd29ya3NoZWV0IG9mIGFjdGl2ZVNoZWV0LndvcmtzaGVldHMpIHtcbiAgICogICAgIGF3YWl0IHZpei5leHBvcnREYXRhQXN5bmMod29ya3NoZWV0Lm5hbWUsIHsgaWdub3JlQWxpYXNlczogdHJ1ZSB9KTtcbiAgICogICB9XG4gICAqIH1cbiAgICogZWxzZVxuICAgKiB7XG4gICAqICAgLy8gYWN0aXZlU2hlZXQgaXMgYSBTdG9yeSBhbmQgd2Ugd2FudCB0byBleHBvcnQgd29ya3NoZWV0cyB3aXRoaW4gdGhlIGN1cnJlbnQgdmlld1xuICAgKiAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0ID0gYWN0aXZlU2hlZXQuYWN0aXZlU3RvcnlQb2ludC5jb250YWluZWRTaGVldDtcbiAgICogICBpZiAoY29udGFpbmVkU2hlZXQgIT09IHVuZGVmaW5lZCAmJiBjb250YWluZWRTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5Xb3Jrc2hlZXQpIHtcbiAgICogICAgIC8vIEV4cG9ydGluZyBzdW1tYXJ5IGRhdGEgb2YgYSB3b3Jrc2hlZXQgd2l0aGluIHRoZSBhY3RpdmUgc3RvcnkgcG9pbnRcbiAgICogICAgIGF3YWl0IHZpei5leHBvcnREYXRhQXN5bmMoY29udGFpbmVkU2hlZXQubmFtZSk7XG4gICAqICAgfSBlbHNlIGlmIChjb250YWluZWRTaGVldCAhPT0gdW5kZWZpbmVkICYmIGNvbnRhaW5lZFNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLkRhc2hib2FyZCkge1xuICAgKiAgICAgLy8gRXhwb3J0aW5nIHRoZSBzdW1tYXJ5IGRhdGEgZm9yIGVhY2ggd29ya3NoZWV0IHdpdGhpbiB0aGUgYWN0aXZlIHN0b3J5IHBvaW50XG4gICAqICAgICBmb3IgKGNvbnN0IHdvcmtzaGVldCBvZiBjb250YWluZWRTaGVldC53b3Jrc2hlZXRzKSB7XG4gICAqICAgICAgIGF3YWl0IHZpei5leHBvcnREYXRhQXN5bmMod29ya3NoZWV0Lm5hbWUpO1xuICAgKiAgICAgfVxuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGV4cG9ydERhdGFBc3luYyhzaGVldE5hbWU6IHN0cmluZywgb3B0aW9ucz86IEV4cG9ydERhdGFPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXhwb3J0cyB0aGUgbGlzdCBvZiBzaGVldHMgdG8gYSBQb3dlclBvaW50IGZpbGUuIElmIG5vIHNoZWV0cyBhcmUgc3BlY2lmaWVkLCB0aGUgY3VycmVudCBzaGVldCBpcyBleHBvcnRlZC5cbiAgICogVGhlIG9yZGVyIHRoZSBzaGVldHMgYXBwZWFyIGluIHRoZSBsaXN0IGlzIHRoZSBvcmRlciB0aGUgc2hlZXRzIGFwcGVhciBpbiB0aGUgUG93ZXJQb2ludCBmaWxlLlxuICAgKiBUaGUgbGlzdCBvZiBzaGVldHMgY2FuIGVpdGhlciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBvciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSBwdWJsaXNoZWQgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGxpc3Qgb2Ygc2hlZXRzIGNvbnRhaW5zIGJvdGggd29ya3NoZWV0cyB3aXRoaW4gYSBkYXNoYm9hcmQgYW5kIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgUG93ZXJQb2ludCBmaWxlIGZhaWxzIHRvIGJlIGNyZWF0ZWQuXG4gICAqXG4gICAqID5bIU5vdGVdIGBleHBvcnRQb3dlclBvaW50QXN5bmNgIHJlc29sdmVzIHdoZW4gYSBkb3dubG9hZCBpcyBpbml0aWF0ZWQuIEl0IGRvZXMgbm90IGluZGljYXRlIHRoYXQgYSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBpZiB0aGUgZG93bmxvYWQgd2FzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIGNvbnN0IHdvcmtib29rID0gdml6Lndvcmtib29rO1xuICAgKiBjb25zdCBhY3RpdmVTaGVldCA9IHdvcmtib29rLmFjdGl2ZVNoZWV0O1xuICAgKiBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuV29ya3NoZWV0IHx8IGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLlN0b3J5KSB7XG4gICAqICAgYXdhaXQgdml6LmV4cG9ydFBvd2VyUG9pbnRBc3luYygpO1xuICAgKiB9IGVsc2UgaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gIFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICBjb25zdCB3b3Jrc2hlZXROYW1lcyA9IGFjdGl2ZVNoZWV0LndvcmtzaGVldHMubWFwKCh3b3Jrc2hlZXQpID0+IHdvcmtzaGVldC5uYW1lKTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKHdvcmtzaGVldE5hbWVzKTtcbiAgICogfVxuICAgKiAvLyBleHBvcnRpbmcgYWxsIHNoZWV0cyB3aXRoaW4gdGhlIHdvcmtib29rIHRvIFBvd2VyUG9pbnRcbiAgICogY29uc3QgcHVibGlzaGVkU2hlZXROYW1lcyA9IHdvcmtib29rLnB1Ymxpc2hlZFNoZWV0c0luZm8ubWFwKChwdWJsaXNoZWRTaGVldEluZm8pID0+IHB1Ymxpc2hlZFNoZWV0SW5mby5uYW1lKTtcbiAgICogYXdhaXQgdml6LmV4cG9ydFBvd2VyUG9pbnRBc3luYyhwdWJsaXNoZWRTaGVldE5hbWVzKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRQb3dlclBvaW50QXN5bmMoc2hlZXROYW1lcz86IEFycmF5PHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBsaXN0IG9mIHNoZWV0cyB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgRXhwb3J0UERGT3B0aW9uc30gb3B0aW9ucy4gSWYgbm8gc2hlZXRzIGFyZSBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IHNoZWV0IGlzIGV4cG9ydGVkLlxuICAgKiBUaGUgbGlzdCBvZiBzaGVldHMgY2FuIGVpdGhlciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBvciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSBwdWJsaXNoZWQgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKiBJZiBubyBFeHBvcnRQREZPcHRpb25zIGFyZSBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHNldHRpbmdzIGFyZTogU2NhbGluZyA9IEF1dG9tYXRpYywgUGFnZVNpemUgPSBMZXR0ZXIsIGFuZCBPcmllbnRhdGlvbiA9IFBvcnRyYWl0LlxuICAgKlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGxpc3Qgb2Ygc2hlZXRzIGNvbnRhaW5zIGJvdGggd29ya3NoZWV0cyB3aXRoaW4gYSBkYXNoYm9hcmQgYW5kIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgUERGIGZpbGUgZmFpbHMgdG8gYmUgY3JlYXRlZC5cbiAgICpcbiAgICogPlshTm90ZV0gYGV4cG9ydFBERkFzeW5jYCByZXNvbHZlcyB3aGVuIGEgZG93bmxvYWQgaXMgaW5pdGlhdGVkLiBJdCBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IGEgZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3IgaWYgdGhlIGRvd25sb2FkIHdhcyBjb21wbGV0ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiBjb25zdCB3b3JrYm9vayA9IHZpei53b3JrYm9vaztcbiAgICogY29uc3QgYWN0aXZlU2hlZXQgPSB3b3JrYm9vay5hY3RpdmVTaGVldDtcbiAgICogaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLldvcmtzaGVldCB8fCBhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5TdG9yeSkge1xuICAgKiAgIGF3YWl0IHZpei5leHBvcnRQREZBc3luYygpO1xuICAgKiB9IGVsc2UgaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gIFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICBjb25zdCB3b3Jrc2hlZXROYW1lcyA9IGFjdGl2ZVNoZWV0LndvcmtzaGVldHMubWFwKCh3b3Jrc2hlZXQpID0+IHdvcmtzaGVldC5uYW1lKTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UERGQXN5bmMod29ya3NoZWV0TmFtZXMpO1xuICAgKiB9XG4gICAqIC8vIGV4cG9ydGluZyBhbGwgc2hlZXRzIHdpdGhpbiB0aGUgd29ya2Jvb2sgdG8gUERGXG4gICAqIGNvbnN0IHB1Ymxpc2hlZFNoZWV0TmFtZXMgPSB3b3JrYm9vay5wdWJsaXNoZWRTaGVldHNJbmZvLm1hcCgocHVibGlzaGVkU2hlZXRJbmZvKSA9PiBwdWJsaXNoZWRTaGVldEluZm8ubmFtZSk7XG4gICAqIGF3YWl0IHZpei5leHBvcnRQREZBc3luYyhwdWJsaXNoZWRTaGVldE5hbWVzKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRQREZBc3luYyhzaGVldE5hbWVzPzogQXJyYXk8c3RyaW5nPiwgb3B0aW9ucz86IEV4cG9ydFBERk9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBEaXNwbGF5IG9uZSBvZiB0aGUgZXhwb3J0IGRpYWxvZ3MgYmFzZWQgb24gdGhlIGRpYWxvZ1R5cGUgcGFyYW1ldGVyXG4gICAqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiBkaWFsb2dUeXBlIGlzIGludmFsaWRcbiAgICovXG4gIGRpc3BsYXlEaWFsb2dBc3luYyhkaWFsb2dUeXBlOiBUYWJsZWF1RGlhbG9nVHlwZSk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZpc3VhbGl6YXRpb24ncyBjdXJyZW50IFVSTC5cbiAgICovXG4gIGdldEN1cnJlbnRTcmNBc3luYygpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFJlZG9lcyB0aGUgbGFzdCBhY3Rpb24gcGVyZm9ybWVkIG9uIGEgc2hlZXQuXG4gICAqL1xuICByZWRvQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVW5kb2VzIHRoZSBsYXN0IGFjdGlvbiBwZXJmb3JtZWQgb24gYSBzaGVldC5cbiAgICovXG4gIHVuZG9Bc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gICAqXG4gICAqIGBgYFxuICAgKiBhc3luYyBmdW5jdGlvbiBnZXRTZWxlY3RlZE1hcmtzKGV2ZW50KSB7XG4gICAqICAgICBjb25zdCBtYXJrc1NlbGVjdGVkID0gYXdhaXQgZXZlbnQuZGV0YWlsLmdldE1hcmtzQXN5bmMoKTtcbiAgICogICAgIGNvbnN0IG51bU1hcmtzID0gbWFya3NTZWxlY3RlZC5kYXRhWzBdLmRhdGEubGVuZ3RoO1xuICAgKiAgICAgY29uc29sZS5sb2coYCR7bnVtTWFya3N9IG1hcmtzIFNlbGVjdGVkYCk7XG4gICAqIH1cbiAgICpcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5hZGRFdmVudExpc3RlbmVyKFwibWFya3NlbGVjdGlvbmNoYW5nZWRcIiwgZ2V0U2VsZWN0ZWRNYXJrcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCwgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5yZW1vdmVFdmVudExpc3RlbmVyKFwibWFya3NlbGVjdGlvbmNoYW5nZWRcIiwgZ2V0U2VsZWN0ZWRNYXJrcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCwgb3B0aW9ucz86IGJvb2xlYW4gfCBFdmVudExpc3RlbmVyT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBmaWx0ZXIgdGhlIHZpeiBiZWZvcmUgaW5pdGlhbGl6YXRpb24uIElmIHVzZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIGl0IHdpbGwgcmUtcmVuZGVyIHRoZSB2aXouXG4gICAqIEZvciBmaWx0ZXJpbmcgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIHVzZSB0aGUgb3RoZXIgZmlsdGVyaW5nIG1ldGhvZHMsIHN1Y2ggYXMgYGFwcGx5RmlsdGVyQXN5bmNgLlxuICAgKlxuICAgKiBJZiB5b3UgYWRkIHRoZSBzYW1lIGZpbHRlciBmaWVsZHMgdXNpbmcgdGhlIGBhZGRGaWx0ZXIoKWAgbWV0aG9kIGFuZCBieSB1c2luZyB0aGUgYDx2aXotZmlsdGVyPmAgZWxlbWVudCBpbiB0aGUgYDx0YWJsZWF1LXZpej5gIHdlYiBjb21wb25lbnQsXG4gICAqIHlvdSBtaWdodCBleHBlcmllbmNlIHVuZXhwZWN0ZWQgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGZpbHRlciBvbi5cbiAgICogQHBhcmFtIHZhbHVlIFNpbmdsZSB2YWx1ZSBvciBhIGxpc3Qgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcyB0byBmaWx0ZXIgb24uXG4gICAqXG4gICAqIGBgYFxuICAgKiB2aXouYWRkRmlsdGVyKCdSZWdpb24nLCAnQ2VudHJhbCxXZXN0Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRmlsdGVyKGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHJlYWRqdXN0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbWJlZGRlZCB2aXogaW4gcmVzcG9uc2UgdG8gdGhpbmdzIGxpa2UgYSB3aW5kb3cgcmVzaXplLCBkZXZpY2Ugb3JpZW50YXRpb24gY2hhbmdlLCBvclxuICAgKiBwYXJlbnQgY29udGFpbmVyIHJlc2l6ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB2aXoucmVzaXplKCkpO1xuICAgKlxuICAgKiBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdml6LnJlc2l6ZSgpKS5vYnNlcnZlKHZpei5wYXJlbnRFbGVtZW50KTtcbiAgICogYGBgXG4gICAqL1xuICByZXNpemUoKTogdm9pZDtcblxuICAvKipcbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGxhdW5jaCB0aGUgQW5hbHl0aWNzIEFzc2lzdGFudCBzaWRlIHBhbmUuXG4gICAqIFlvdSBjYW4gdXNlIHRoZSBgaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGVBc3luYygpYCBtZXRob2QgdG8gY2hlY2sgaWYgdGhlIEFuYWx5dGljcyBBc3Npc3RhbnQgaXMgYXZhaWxhYmxlIGZvciB1c2UuXG4gICAqXG4gICAqIGBgYFxuICAgKiBjb25zdCBpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZSA9IGF3YWl0IHZpei5pc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZUFzeW5jKCk7XG4gICAqIGlmIChpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZSkge1xuICAgKiAgIGF3YWl0IHZpei5sYXVuY2hBbmFseXRpY3NBc3Npc3RhbnRBc3luYygpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgbGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50QXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIEFuYWx5dGljcyBBc3Npc3RhbnQgc2lkZSBwYW5lIGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIGlzQW5hbHl0aWNzQXNzaXN0YW50QXZhaWxhYmxlQXN5bmMoKTogUHJvbWlzZTxib29sZWFuPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWaXpTaXplIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHNoZWV0U2l6ZSByZWNvcmQgZm9yIHRoZSBjdXJyZW50IHNoZWV0XG4gICAqL1xuICByZWFkb25seSBzaGVldFNpemU6IFNoZWV0U2l6ZTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBUYWJsZWF1IFVJIGVsZW1lbnRzICh0aGUgY2hyb21lKSBzdXJyb3VuZGluZyB0aGUgdmlldy5cbiAgICovXG4gIHJlYWRvbmx5IGNocm9tZUhlaWdodDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIG9mIHRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHZpeiB0aGF0IGFyZSBjb21tb24gYmV0d2VlblxuICogdmlld2luZyBhbmQgYXV0aG9yaW5nIG1vZGUuXG4gKi9cbmludGVyZmFjZSBWaXpTZXR0aW5nc1NoYXJlZCBleHRlbmRzIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIHRvdWNoIG9wdGltaXplIHZpeiBjb250cm9scy5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b3VjaC1vcHRpbWl6ZSAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIHRvdWNoLW9wdGltaXplIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG91Y2hPcHRpbWl6ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBFZGl0IGluIERlc2t0b3AgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyB0aGF0IHRoZSBFZGl0IGluIERlc2t0b3AgYnV0dG9uIGlzIHZpc2libGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaGlkZS1lZGl0LWluLWRlc2t0b3AtYnV0dG9uPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbj5cbiAgICogYGBgXG4gICAqL1xuICBoaWRlRWRpdEluRGVza3RvcEJ1dHRvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkZWZhdWx0IGVkaXQgYmVoYXZpb3IgaXMgc3VwcHJlc3NlZC5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgZGVmYXVsdCBlZGl0IGJlaGF2aW9yIGlzIG5vdCBzdXBwcmVzc2VkLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHN1cHByZXNzLWRlZmF1bHQtZWRpdC1iZWhhdmlvcj5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBzdXBwcmVzcy1kZWZhdWx0LWVkaXQtYmVoYXZpb3I+XG4gICAqIGBgYFxuICAgKi9cbiAgc3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBFZGl0IEluIERlc2t0b3AgQnV0dG9uLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZD1cIm9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWRIYW5kbGVyXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkPVwib25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBzaXplIG9mIHRoZSB2aXogaXMga25vd24uIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdG8gcGVyZm9ybSB0YXNrcyBzdWNoIGFzIHJlc2l6aW5nXG4gICAqIHRoZSBlbGVtZW50cyBzdXJyb3VuZGluZyB0aGUgVml6IG9iamVjdCBvbmNlIHRoZSBvYmplY3QncyBzaXplIGhhcyBiZWVuIGVzdGFibGlzaGVkLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIFwib25GaXJzdFZpelNpemVLbm93blwiPVwib25GaXJzdFZpelNpemVLbm93bkhhbmRsZXJcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uRmlyc3RWaXpTaXplS25vd249XCJvbkZpcnN0Vml6U2l6ZUtub3duSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25GaXJzdFZpelNpemVLbm93bj86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIFZpeiBvYmplY3QgZmlyc3QgYmVjb21lcyBpbnRlcmFjdGl2ZS4gVGhpcyBpcyBvbmx5IHJhaXNlZCBvbmNlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIFwib25GaXJzdEludGVyYWN0aXZlXCI9XCJvbkZpcnN0SW50ZXJhY3RpdmVIYW5kbGVyXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkZpcnN0SW50ZXJhY3RpdmU9XCJvbkZpcnN0SW50ZXJhY3RpdmVIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkZpcnN0SW50ZXJhY3RpdmU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGEgdml6IGluIHZpZXcgbW9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXpTZXR0aW5ncyBleHRlbmRzIFZpelNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIHN1cHByZXNzIHRoZSBleGVjdXRpb24gb2YgVVJMIGFjdGlvbnMuIFRoaXMgb3B0aW9uIGRvZXMgbm90IHByZXZlbnQgdGhlIFVSTCBhY3Rpb25cbiAgICogZXZlbnQgZnJvbSBiZWluZyByYWlzZWQuIFlvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIHRvIGNoYW5nZSB3aGF0IGhhcHBlbnMgd2hlbiBhIFVSTCBhY3Rpb24gb2NjdXJzLiBJZiBzZXRcbiAgICogdG8gdHJ1ZSBhbmQgeW91IGNyZWF0ZSBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIFVSTF9BQ1RJT04gZXZlbnQsIHlvdSBjYW4gdXNlIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAqIGhhbmRsZXIgdG8gY3VzdG9taXplIHRoZSBhY3Rpb25zLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGRpc2FibGUtdXJsLWFjdGlvbnMgLz5cbiAgICogYGBgXG4gICAqL1xuICBkaXNhYmxlVXJsQWN0aW9uc1BvcHVwcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRhYnMgYXJlIGhpZGRlbiBvciBzaG93bi5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgaGlkZS10YWJzIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZVRhYnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b29sYmFyLCBpZiBpdCBpcyBzaG93bi4gVGhlIHZhbHVlcyBjYW4gYmUgVG9vbGJhci5Ub3AsXG4gICAqIFRvb2xiYXIuQm90dG9tIG9yIFRvb2xiYXIuSGlkZGVuLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBUb29sYmFyLkJvdHRvbS5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgdG9vbGJhcj1cImhpZGRlblwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG9vbGJhcj86IFRvb2xiYXI7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIGRldmljZSBsYXlvdXQgZm9yIGEgZGFzaGJvYXJkLCBpZiBpdCBleGlzdHMuXG4gICAqIFZhbHVlcyBjYW4gYmUgZGVmYXVsdCwgZGVza3RvcCwgdGFibGV0LCBvciBwaG9uZS5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gbG9hZGluZyBhIGxheW91dCBiYXNlZCBvbiB0aGVcbiAgICogc21hbGxlc3QgZGltZW5zaW9uIG9mIHRoZSBob3N0aW5nIGlmcmFtZSBlbGVtZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiICBkZXZpY2U9XCJkZXNrdG9wXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBkZXZpY2U/OiBEZXZpY2VUeXBlO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIElEIG9mIGFuIGV4aXN0aW5nIGluc3RhbmNlIHRvIG1ha2UgYSBjb3B5IChjbG9uZSkgb2YuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSB1c2VyIHdhbnRzIHRvIGNvbnRpbnVlIGFuYWx5c2lzIG9mIGFuIGV4aXN0aW5nIHZpc3VhbGl6YXRpb25cbiAgICogd2l0aG91dCBsb3NpbmcgdGhlIHN0YXRlIG9mIHRoZSBvcmlnaW5hbC4gSWYgdGhlIElEIGRvZXMgbm90IHJlZmVyIHRvIGFuIGV4aXN0aW5nIHZpc3VhbGl6YXRpb24sXG4gICAqIHRoZSBjbG9uZWQgdmVyc2lvbiBpcyBkZXJpdmVkIGZyb20gdGhlIG9yaWdpbmFsIHZpc3VhbGl6YXRpb24uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIGluc3RhbmNlLWlkLXRvLWNsb25lPVwiaWQxXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBpbnN0YW5jZUlkVG9DbG9uZT86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIEVkaXQgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyB0aGF0IHRoZSBFZGl0IGJ1dHRvbiBpcyB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtZWRpdC1idXR0b24+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZUVkaXRCdXR0b24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIEVkaXQgQnV0dG9uLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uRWRpdEJ1dHRvbkNsaWNrZWQ9XCJvbkVkaXRCdXR0b25DbGlja2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25FZGl0QnV0dG9uQ2xpY2tlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYW55IGZpbHRlciBoYXMgY2hhbmdlZCBzdGF0ZS4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uRmlsdGVyQ2hhbmdlZD1cIm9uRmlsdGVyQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRmlsdGVyQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gbWFyayBjb250ZXh0IG1lbnUgaXMgY2xpY2tlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50PVwib25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBzZWxlY3RlZCBtYXJrcyBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25NYXJrU2VsZWN0aW9uQ2hhbmdlZD1cIm9uTWFya1NlbGVjdGlvbkNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbk1hcmtTZWxlY3Rpb25DaGFuZ2VkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIHBhcmFtZXRlciBoYXMgaGFkIGl0cyB2YWx1ZSBtb2RpZmllZC4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1tQYXJhbWV0ZXJdXSBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uUGFyYW1ldGVyQ2hhbmdlZD1cIm9uUGFyYW1ldGVyQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uUGFyYW1ldGVyQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSB0b29sYmFyIGJ1dHRvbiBvciBjb250cm9sIGJlY29tZXMgYXZhaWxhYmxlIG9yIGJlY29tZXMgdW5hdmFpbGFibGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Ub29sYmFyU3RhdGVDaGFuZ2VkPVwib25Ub29sYmFyU3RhdGVDaGFuZ2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Ub29sYmFyU3RhdGVDaGFuZ2VkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIFVSTCBhY3Rpb24gb2NjdXJzLiBTZWUgdGhlIHtAbGluayBVcmxBY3Rpb25FdmVudH0gY2xhc3MuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25VcmxBY3Rpb249XCJvblVybEFjdGlvbkhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uVXJsQWN0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgYWZ0ZXIgYSB0YWIgc3dpdGNoIG9jY3VycyAodGhlIGFjdGl2ZSBzaGVldCBoYXMgY2hhbmdlZCkuIEd1YXJhbnRlZXMgdGhlIHZpeiBvYmplY3Qgd2lsbCBiZSBpbnRlcmFjdGl2ZSBhZnRlciB0aGlzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uVGFiU3dpdGNoZWQ9XCJvblRhYlN3aXRjaGVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25UYWJTd2l0Y2hlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgZmluaXNoZWQgbG9hZGluZy4gVGhpcyBldmVudCBpcyByYWlzZWQgYWZ0ZXIgdGhlIGNhbGxiYWNrXG4gICAqIGZ1bmN0aW9uIGZvciB7QGxpbmsgVGFibGVhdUV2ZW50VHlwZS5GaXJzdEludGVyYWN0aXZlfSAoaWYgYW55KSBoYXMgYmVlbiBjYWxsZWQuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21WaWV3TG9hZGVkPVwib25DdXN0b21WaWV3TG9hZGVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25DdXN0b21WaWV3TG9hZGVkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHJlbW92ZWQuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21WaWV3UmVtb3ZlZD1cIm9uQ3VzdG9tVmlld1JlbW92ZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbVZpZXdSZW1vdmVkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNhdmVkIChuZXdseSBjcmVhdGVkIG9yIHVwZGF0ZWQpLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uQ3VzdG9tVmlld1NhdmVkPVwib25DdXN0b21WaWV3U2F2ZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbVZpZXdTYXZlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzZXQgYXMgdGhlIGRlZmF1bHQgdmlldyBmb3IgYSB3b3JrYm9vay5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbVZpZXdTZXREZWZhdWx0PVwib25DdXN0b21WaWV3U2V0RGVmYXVsdEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tVmlld1NldERlZmF1bHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCBhZnRlciBhIG5ldyBzdG9yeSBwb2ludCBiZWNvbWVzIGFjdGl2ZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvblN0b3J5UG9pbnRTd2l0Y2hlZD1cIm9uU3RvcnlQb2ludFN3aXRjaGVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25TdG9yeVBvaW50U3dpdGNoZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBzdW1tYXJ5IGRhdGEgb24gYSB2aXN1YWxpemF0aW9uIGhhdmUgY2hhbmdlZC4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uU3VtbWFyeURhdGFDaGFuZ2VkPVwib25TdW1tYXJ5RGF0YUNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvblN1bW1hcnlEYXRhQ2hhbmdlZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiAoQmV0YSkgUmVwcmVzZW50cyB0aGUgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSB2aXogaW4gYXV0aG9yaW5nIG1vZGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6QXV0aG9yaW5nU2V0dGluZ3MgZXh0ZW5kcyBWaXpTZXR0aW5nc1NoYXJlZCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgQ2xvc2UgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyB0aGF0IHRoZSBDbG9zZSBidXR0b24gaXMgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaGlkZS1jbG9zZS1idXR0b24gLz5cbiAgICogYGBgXG4gICAqL1xuICBoaWRlQ2xvc2VCdXR0b24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgd29ya2Jvb2sgaGFzIGJlZW4gcHVibGlzaGVkLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbldvcmtib29rUHVibGlzaGVkPVwib25Xb3JrYm9va1B1Ymxpc2hlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uV29ya2Jvb2tQdWJsaXNoZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIFwicHVibGlzaCBhc1wiIGlzIHN1Y2Nlc3NmdWwuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uV29ya2Jvb2tQdWJsaXNoZWRBcz1cIm9uV29ya2Jvb2tQdWJsaXNoZWRBc0hhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uV29ya2Jvb2tQdWJsaXNoZWRBcz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHdvcmtib29rIGlzIHJlYWR5IHRvIGNsb3NlLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbldvcmtib29rUmVhZHlUb0Nsb3NlPVwib25Xb3JrYm9va1JlYWR5VG9DbG9zZUhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uV29ya2Jvb2tSZWFkeVRvQ2xvc2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyUGFyYW1ldGVycyB7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVml6UGFyYW1ldGVycyBhcmUgdXNlZCB0byBzZXQgUGFyYW1ldGVyIHZhbHVlcyBvbiB0aGUgdml6LlxuICpcbiAqICogYGBgXG4gKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCI+XG4gKiAgPHZpei1wYXJhbWV0ZXIgbmFtZT1cInBhcmFtZXRlci1uYW1lXCIgdmFsdWU9XCJwYXJhbWV0ZXItdmFsdWVcIj48L3Zpei1wYXJhbWV0ZXI+XG4gKiA8L3RhYmxlYXUtdml6PlxuICogYGBgXG4gKlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpelBhcmFtZXRlciB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdG8gYmUgc2V0LlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWYWxpZCB2YWx1ZSBmb3IgdGhlIHBhcmFtZXRlciBiZWluZyBzZXQuXG4gICAqL1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEN1c3RvbVBhcmFtZXRlcnMgYXJlIHVzZWQgdG8gcGFzcyBhbG9uZyBzZXR0aW5ncywgaW5mb3JtYXRpb24sIGV0Yy4sIHRoYXQgYXJlbid0IGV4cG9zZWQgb24gdGhlXG4gKiB0YWJsZWF1LXZpeiBlbGVtZW50LiBDdXN0b21QYXJhbWV0ZXJzIHdpbGwgb3ZlcnJpZGUgYXR0cmlidXRlcywgb3IgZmlsdGVycywgc2V0IG9uIHRoZSB0YWJsZWF1LXZpeiBlbGVtZW50LlxuICpcbiAqICogYGBgXG4gKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCI+XG4gKiAgPGN1c3RvbS1wYXJhbWV0ZXIgbmFtZT1cInBhcmFtZXRlci1uYW1lXCIgdmFsdWU9XCJwYXJhbWV0ZXItdmFsdWVcIj48L2N1c3RvbS1wYXJhbWV0ZXI+XG4gKiA8L3RhYmxlYXUtdml6PlxuICogYGBgXG4gKlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbVBhcmFtZXRlciB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdG8gYmUgc2V0LlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWYWxpZCB2YWx1ZSBmb3IgdGhlIHBhcmFtZXRlciBiZWluZyBzZXQuXG4gICAqL1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBleHBvcnRpbmcgZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHBvcnREYXRhT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEbyBub3QgdXNlIGFsaWFzZXMgc3BlY2lmaWVkIGluIHRoZSBkYXRhIHNvdXJjZSBpbiBUYWJsZWF1LiBEZWZhdWx0IGlzIGZhbHNlLlxuICAgKi9cbiAgaWdub3JlQWxpYXNlcz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgY29sdW1ucyB0byBpbmNsdWRlIHNwZWNpZmllZCBieSBmaWVsZCBpZCwgaW5jbHVkZXMgYWxsIGJ5IGRlZmF1bHQuXG4gICAqIFRoZSBvcmRlciBvZiB0aGUgY29sdW1uIGlkcyBpbiB0aGUgYXJyYXkgZGV0ZXJtaW5lcyB0aGUgY29sdW1uIG9yZGVyIHNob3duIGluIHRoZSBzdW1tYXJ5IGRhdGEgdGFibGUuXG4gICAqL1xuICBjb2x1bW5zVG9JbmNsdWRlQnlJZD86IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0UERGT3B0aW9ucyB7XG4gIHNjYWxpbmc6IFByaW50U2NhbGluZztcbiAgcGFnZVNpemU6IFByaW50UGFnZVNpemU7XG4gIG9yaWVudGF0aW9uOiBQcmludE9yaWVudGF0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydFNjZW5hcmlvc0ZvclBERkFuZFBvd2VyUG9pbnQge1xuICBjdXJyZW50U2hlZXROYW1lOiBzdHJpbmc7XG4gIGV4cG9ydGFibGVTaGVldE5hbWVzRnJvbURhc2hib2FyZDogQXJyYXk8c3RyaW5nPjtcbiAgZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tV29ya2Jvb2s6IEFycmF5PHN0cmluZz47XG59XG4iLCIvKipcbiAqIFNlcnZlciBzZXNzaW9uIGluZm9ybWF0aW9uIGZvciB1c2Ugd2l0aCBWaXpRTCBEYXRhIFNlcnZpY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6UUxEYXRhU2VydmljZVNlc3Npb25JbmZvIHtcbiAgLyoqXG4gICAqIFRoZSBWaXpRTCBTZXJ2ZXIgc2Vzc2lvbiBJRCBmb3IgdXNlIHdpdGggVml6UUwgRGF0YSBTZXJ2aWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgdml6cWxTZXJ2ZXJTZXNzaW9uSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGdsb2JhbCBzZXNzaW9uIGhlYWRlciBmb3IgdXNlIHdpdGggVml6UUwgRGF0YSBTZXJ2aWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2xvYmFsU2Vzc2lvbkhlYWRlcjogc3RyaW5nO1xufVxuIiwiLyoqXG4gKiBVc2VyIHN1cHBsaWVkIG9wdGlvbnMgdGhhdCBkbyBub3QgZ2V0IHBhc3NlZCBhcyByZXF1ZXN0IHBhcmFtZXRlcnMgdG8gbG9hZCBhIFRhYmxlYXUgdml6LCBUYWJsZWF1IGFza2RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIFRoZSB2aXogc3JjXG4gICAqL1xuICBzcmM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIHdpZHRoIGluIHBpeGVsc1xuICAgKiBDYW4gYmUgYW55IHZhbGlkIENTUyBzaXplIHNwZWNpZmllci4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gdGhlIHB1Ymxpc2hlZCB3aWR0aCBvZiB0aGUgdmlldy5cbiAgICovXG4gIHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGhlaWdodCBpbiBwaXhlbHNcbiAgICogQ2FuIGJlIGFueSB2YWxpZCBDU1Mgc2l6ZSBzcGVjaWZpZXIuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIHRoZSBwdWJsaXNoZWQgaGVpZ2h0IG9mIHRoZSB2aWV3LlxuICAgKi9cbiAgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIG9mIHRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHdlYmNvbXBvbmVudCB0aGF0IGFyZSBjb21tb24gYmV0d2VlblxuICogdml6IGFuZCBhc2tkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIFRoZSB0b2tlbiB1c2VkIGZvciBhdXRob3JpemF0aW9uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICB0b2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG5vbi1taW5pZmllZCB2ZXJzaW9uIG9mIEphdmFTY3JpcHQgaXMgbG9hZGVkLiBJZiBzcGVjaWZpZWQgKG9yIHNldCB0byB0cnVlKSwgdGhlXG4gICAqIG5vbi1taW5pZmllZCB2ZXJzaW9uIGlzIHVzZWQgZm9yIGJvdGggdGhlIGxvY2FsIGNvbXBvbmVudCBhbmQgdGhlIFRhYmxlYXUgU2VydmVyIHZpc3VhbGl6YXRpb24gKGlmIGVuYWJsZWQpLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkIChvciBzZXQgdG8gZmFsc2UpLCB0aGUgbWluaWZpZWQgdmVyc2lvbiBvZiB0aGUgSmF2YVNjcmlwdCBmaWxlcyBhcmUgbG9hZGVkLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGRlYnVnIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgZGVidWcgLz5cbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIGRlYnVnIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGVidWc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byB1c2UgdGhlIG9sZCBhdXRoIG1lY2hhbmlzbSBmb3IgYXV0aGVudGljYXRpb24gd2hpY2ggaGFwcGVucyBpbnNpZGUgdGhlIGlmcmFtZS4gSWYgc3BlY2lmaWVkLCBWaXpMb2FkRXJyb3JFdmVudHNcbiAgICogdHJpZ2dlcmVkIGR1ZSB0byBhdXRoIGZhaWx1cmVzIHdpbGwgbm90IGJlIHRocm93bi5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXV0aCAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdXRoIC8+XG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBpZnJhbWUtYXV0aCAvPlxuICAgKiBgYGBcbiAgICovXG4gIGlmcmFtZUF1dGg/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdsb2FkaW5nJyBhdHRyaWJ1dGUgb2YgdGhlIGVtYmVkZGVkIGlmcmFtZS5cbiAgICogU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaWZyYW1lI2xvYWRpbmdcbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1sb2FkaW5nPVwibGF6eVwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItbG9hZGluZz1cImxhenlcIiAvPlxuICAgKiA8dGFibGVhdS1wdWxzZSBpZD1cInRhYmxlYXVQdWxzZVwiIGlmcmFtZS1hdHRyLWxvYWRpbmc9XCJsYXp5XCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdHRyaWJ1dGVMb2FkaW5nPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdzdHlsZScgYXR0cmlidXRlIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCByZWRcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLXN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgcmVkXCIgLz5cbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBpZnJhbWUtYXR0ci1zdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkIHJlZFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlU3R5bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgJ2NsYXNzJyBhdHRyaWJ1dGUgb2YgdGhlIGVtYmVkZGVkIGlmcmFtZSBwcm92aWRpbmcgYWNjZXNzIHRvIGFueVxuICAgKiBjdXN0b20gc2VsZWN0b3JzIGRlZmluZWQgaW4gdGhlIGA8aWZyYW1lLXN0eWxlPmAgY2hpbGQgdGFnLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLWNsYXNzPVwicmVkLWJvcmRlclwiPlxuICAgKiAgIDxpZnJhbWUtc3R5bGU+XG4gICAqICAgICAucmVkLWJvcmRlciB7XG4gICAqICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJlZDtcbiAgICogICAgIH1cbiAgICogICA8L2lmcmFtZS1zdHlsZT5cbiAgICogPC90YWJsZWF1LXZpej5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdHRyaWJ1dGVDbGFzcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIGNvbW1vbiBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIHRhYmxlYXUgd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gV2ViQ29tcG9uZW50QXR0cmlidXRlcyB7XG4gIFNyYyA9ICdzcmMnLFxuICBXaWR0aCA9ICd3aWR0aCcsXG4gIEhlaWdodCA9ICdoZWlnaHQnLFxuICBUb2tlbiA9ICd0b2tlbicsXG4gIERlYnVnID0gJ2RlYnVnJyxcbiAgSWZyYW1lQXV0aCA9ICdpZnJhbWUtYXV0aCcsXG4gIE9uVml6TG9hZEVycm9yID0gJ29udml6bG9hZGVycm9yJyxcbiAgRm9yY2VUb2tlblN5bmMgPSAnZm9yY2UtdG9rZW4tc3luYycsXG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUgYXR0cmlidXRlcyB3aG9zZSB2YWx1ZXMgY2FuIGJlIGNvbnRyb2xsZWQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIEVtYmVkZGVkSWZyYW1lQXR0cmlidXRlcyB7XG4gIExvYWRpbmcgPSAnaWZyYW1lLWF0dHItbG9hZGluZycsXG4gIFN0eWxlID0gJ2lmcmFtZS1hdHRyLXN0eWxlJyxcbiAgQ2xhc3MgPSAnaWZyYW1lLWF0dHItY2xhc3MnLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBjaGlsZCB0YWdzIGZvciBUYWJsZWF1Vml6LCBUYWJsZWF1QXV0aG9yaW5nVml6IGFuZCBUYWJsZWF1QXNrRGF0YSBjdXN0b20gZWxlbWVudHMuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFdlYkNvbXBvbmVudENoaWxkRWxlbWVudHMge1xuICAvKipcbiAgICogQ29udGFpbnMgYSBsaXN0IG9mIGN1c3RvbSBwYXJhbWV0ZXJzLiAgQXZhaWxhYmxlIGluIHZpeiB2aWV3aW5nLCB2aXogYXV0aG9yaW5nIGFuZCBhc2tkYXRhLlxuICAgKi9cbiAgQ3VzdG9tUGFyYW1ldGVyID0gJ2N1c3RvbS1wYXJhbWV0ZXInLFxuXG4gIC8qKlxuICAgKiBDdXN0b20gc3R5bGVzIGFwcGxpY2FibGUgdG8gdGhlIGVtYmVkZGVkIGlmcmFtZSBlbGVtZW50IGl0c2VsZiAobm90IGluc2lkZSBpdCkuXG4gICAqL1xuICBJZnJhbWVTdHlsZSA9ICdpZnJhbWUtc3R5bGUnLFxufVxuXG5leHBvcnQgZW51bSBXZWJDb21wb25lbnRDaGlsZEVsZW1lbnRBdHRyaWJ1dGVzIHtcbiAgRmllbGQgPSAnZmllbGQnLFxuICBWYWx1ZSA9ICd2YWx1ZScsXG4gIE5hbWUgPSAnbmFtZScsXG59XG4iLCJpbXBvcnQgeyBGaWx0ZXIgfSBmcm9tICcuLi9TaGFyZWQvRmlsdGVySW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UgfSBmcm9tICcuLi9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmltcG9ydCB7IE1hcmtzQ29sbGVjdGlvbiB9IGZyb20gJy4uL1NoYXJlZC9TZWxlY3Rpb25JbnRlcmZhY2VzJztcbmltcG9ydCB7IFdvcmtib29rRm9ybWF0dGluZywgV29ya3NoZWV0Rm9ybWF0dGluZyB9IGZyb20gJy4uL1NoYXJlZC9Xb3JrYm9va0Zvcm1hdHRpbmdJbnRlcmZhY2VzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICcuL05hbWVzcGFjZXMvVGFibGVhdSc7XG5pbXBvcnQgeyBQYXJhbWV0ZXIgfSBmcm9tICcuL1BhcmFtZXRlckludGVyZmFjZXMnO1xuaW1wb3J0IHsgU2hlZXQsIFdvcmtzaGVldCB9IGZyb20gJy4vU2hlZXRJbnRlcmZhY2VzJztcblxuLyoqXG4gKiBBbiBldmVudCB3aGljaCBpcyByZWxhdGVkIHRvIGEgcGFydGljdWxhciBXb3Jrc2hlZXQgaW4gdGhlIHdvcmtib29rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBleHRlbmRzIFRhYmxlYXVTaGVldEV2ZW50IHtcbiAgLyoqXG4gICAqIEByZXR1cm5zICBUaGUgd29ya3NoZWV0IHdoaWNoIHdhcyB0aGUgc291cmNlIG9mIHRoaXMgZXZlbnQuXG4gICAqL1xuICByZWFkb25seSB3b3Jrc2hlZXQ6IFdvcmtzaGVldDtcbn1cblxuLyoqXG4gKiBBbiBldmVudCB3aGljaCBpcyByYWlzZWQgd2hlbiBtYXJrcyBhcmUgc2VsZWN0ZWQgb24gYSB3b3Jrc2hlZXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFya3NTZWxlY3RlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IHtcbiAgLyoqXG4gICAqIEByZXR1cm5zICBUaGUgY29sbGVjdGlvbiBvZiBNYXJrcyB0aGF0IHdlcmUgc2VsZWN0ZWQuXG4gICAqL1xuICBnZXRNYXJrc0FzeW5jKCk6IFByb21pc2U8TWFya3NDb2xsZWN0aW9uPjtcbn1cblxuLyoqXG4gKiBBbiBldmVudCB3aGljaCBpcyByYWlzZWQgd2hlbiBzdW1tYXJ5IGRhdGEgaXMgY2hhbmdlZCBmb3IgYSB3b3Jrc2hlZXQgb3Igd2hlbiBhIHdvcmtzaGVldCdzIGRhdGEgc291cmNlIGlzIHJlZnJlc2hlZFxuICpcbiAqIEBzaW5jZSAxLjExLjAgYW5kIFRhYmxlYXUgMjAyNC4xXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQge31cblxuLyoqXG4gKiBBbiBldmVudCB3aGljaCBpcyByZWxhdGVkIHRvIGEgcGFydGljdWxhciBTaGVldCAod29ya3NoZWV0LCBkYXNoYm9hcmQsIHN0b3J5KSBpbiB0aGUgd29ya2Jvb2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVhdVNoZWV0RXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQge1xuICAvKipcbiAgICogQHJldHVybnMgIFRoZSBzaGVldCB3aGljaCB3YXMgdGhlIHNvdXJjZSBvZiB0aGlzIGV2ZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hlZXQ6IFNoZWV0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckNoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIGZpbHRlcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZmllbGROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUaGUgRmlsdGVyIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50LlxuICAgKi9cbiAgZ2V0RmlsdGVyQXN5bmMoKTogUHJvbWlzZTxGaWx0ZXI+O1xufVxuXG4vKipcbiAqIEFuIGV2ZW50IHdoaWNoIGlzIHJlbGF0ZWQgdG8gYSB3b3JrYm9vaydzIGZvcm1hdHRpbmcgKHdvcmtzaGVldCwgZGFzaGJvYXJkLCBzdG9yeSkgaW4gdGhlIHdvcmtib29rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVFdmVudCB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIG5ldyBleHRlbnNpb24gZm9ybWF0dGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGluZzogV29ya2Jvb2tGb3JtYXR0aW5nO1xufVxuXG4vKipcbiAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSB3b3Jrc2hlZXQncyBmb3JtYXR0aW5nIGNoYW5nZXMuXG4gKiBOb3RlIHRoYXQgdGhpcyBldmVudCBpcyBhbHNvIHJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vaydzIGZvcm1hdHRpbmcgY2hhbmdlcy5cbiAqIEBzaW5jZSAxLjEzIGFuZCBUYWJsZWF1IDIwMjUuMVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQge1xuICAvKipcbiAgICogQHJldHVybnMgIFRoZSBuZXcgZm9ybWF0dGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGluZzogV29ya3NoZWV0Rm9ybWF0dGluZztcbn1cblxuLyoqIEFuIGV2ZW50IG9iamVjdCByZXByZXNlbnRzIGEgbm90aWZpY2F0aW9uIHRoYXQgc29tZSBzb3J0IG9mIHN0YXRlIGhhcyBjaGFuZ2VkLlxuICogVGhpcyBpcyB0aGUgYmFzZSBldmVudCBpbnRlcmZhY2UuIEFsbCBldmVudHMgd2lsbCBpbmhlcml0IHRoaXMgdHlwZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZWF1RXZlbnQge1xuICAvKipcbiAgICogQHJldHVybnMgIFRoZSB0eXBlIG9mIGV2ZW50IHdoaWNoIHRoaXMgY2xhc3MgaXMgcmVwcmVzZW50aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogVGFibGVhdUV2ZW50VHlwZTtcbn1cblxuLyoqXG4gKiBBbiBldmVudCB3aGljaCBpcyByYWlzZWQgd2hlbiB0aGUgdmFsdWUgb2YgYSBwYXJhbWV0ZXIgY2hhbmdlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQge1xuICAvKipcbiAgICogQHJldHVybnMgIFRoZSBwYXJhbWV0ZXIgdGhhdCB3YXMgY2hhbmdlZC5cbiAgICovXG4gIGdldFBhcmFtZXRlckFzeW5jKCk6IFByb21pc2U8UGFyYW1ldGVyPjtcbn1cblxuLyoqXG4gKiBBbiBldmVudCB3aGljaCBpcyByYWlzZWQgd2hlbiB0aGUgc2V0dGluZ3Mgb2YgYW4gZXh0ZW5zaW9uIGFyZSB1cGRhdGVkLlxuICogU2hvdWxkIGJlIGxpc3RlbmVkIGZvciBkaXJlY3RseSBmcm9tIHRoZSBgdGFibGVhdS5leHRlbnNpb25zLnNldHRpbmdzYCBvYmplY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2V0dGluZ3NDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQge1xuICAvKipcbiAgICogQHJldHVybnMgdGhlIG5ldyBzZXR0aW5ncyB0aGF0IHdlcmUgcmVjZW50bHkgc2F2ZWQuXG4gICAqL1xuICByZWFkb25seSBuZXdTZXR0aW5nczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBBbiBldmVudCB3aGljaCBpcyByYWlzZWQgd2hlbiB0aGUgZGFzaGJvYXJkIG9iamVjdHMgYXJlIG1vZGlmaWVkLlxuICogU2hvdWxkIGJlIGxpc3RlbmVkIGZvciBkaXJlY3RseSBmcm9tIHRoZSBgdGFibGVhdS5leHRlbnNpb25zLmRhc2hib2FyZENvbnRlbnQuZGFzaGJvYXJkYCBvYmplY3QuXG4gKlxuICogQHNpbmNlIDEuNy4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICogQGNhdGVnb3J5IERhc2hib2FyZCBFeHRlbnNpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IHtcbiAgLyoqXG4gICAqIEByZXR1cm5zIGEgbWFwIG9mIGRhc2hib2FyZCBvYmplY3QgaWQncyB0byBhbiBhcnJheSBvZiBkYXNoYm9hcmQgb2JqZWN0IGxheW91dCBjaGFuZ2VzXG4gICAqL1xuICByZWFkb25seSBkYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzO1xufVxuXG4vKipcbiAqIEFuIGV2ZW50IHdoaWNoIGlzIHJhaXNlZCB3aGVuIHRoZSBkaWFsb2cgaGFzIGEgbWVzc2FnZSBmb3IgdGhlIHVuZGVybHlpbmcgZXh0ZW5zaW9uIChzZW50IHVzaW5nIGB0YWJsZWF1LmV4dGVuc2lvbnMudWkuc2VuZERpYWxvZ01lc3NhZ2VBc3luY2ApLCBvciB2aWNlIHZlcnNhLlxuICogU2hvdWxkIGJlIGxpc3RlbmVkIGZvciBkaXJlY3RseSBmcm9tIHRoZSBgdGFibGVhdS5leHRlbnNpb25zLnVpYCBvYmplY3QuXG4gKiBGb3IgZXhhbXBsZSwgd2hlbiB0aGUgZGlhbG9nIHNlbmRzIGEgbWVzc2FnZSB0byB0aGUgZXh0ZW5zaW9uIHVzaW5nIGB0YWJsZWF1LmV4dGVuc2lvbnMudWkuc2VuZERpYWxvZ01lc3NhZ2VBc3luY2AgbWV0aG9kLFxuICogdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgbGlzdGVuaW5nIGZvciB0aGlzIGV2ZW50IGFuZCBoYW5kbGluZyBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaWFsb2dNZXNzYWdlRXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQge1xuICAvKipcbiAgICogQHJldHVybnMgdGhlIG1lc3NhZ2UgdGhhdCB3YXMgc2VudCB0by9mcm9tIHRoZSBkaWFsb2cuXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRoZSB1cmwgb2YgdGhlIGRpYWxvZyB0aGF0IHNlbnQgdGhlIG1lc3NhZ2UuXG4gICAqIElmIHVuZGVmaW5lZCwgdGhlIG1lc3NhZ2Ugd2FzIHNlbnQgYnkgdGhlIGhvc3QgZXh0ZW5zaW9uIGl0c2VsZi5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZURpYWxvZ1VybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBNYXAgb2JqZWN0IHRoYXQgaXMgdXNlZCBmb3IgdGhlIERhc2hib2FyZExheW91dENoYW5nZWRFdmVudC5cbiAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICovXG5leHBvcnQgZGVjbGFyZSB0eXBlIERhc2hib2FyZExheW91dENoYW5nZURldGFpbHMgPSBNYXA8bnVtYmVyLCBBcnJheTxEYXNoYm9hcmRMYXlvdXRDaGFuZ2U+PjtcblxuLyoqXG4gKiBDYWxsYmFjayBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGludm9rZWQgd2hlbiBhbiBldmVudCBub3RpZmljYXRpb24gaXMgZW1pdHRlZC5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgIENsYXNzIHJlcHJlc2VudGluZyB0aGUgZXZlbnQgd2hpY2ggb2NjdXJyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFRhYmxlYXVFdmVudEhhbmRsZXJGbiA9IChldmVudDogVGFibGVhdUV2ZW50KSA9PiB2b2lkO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHdoaWNoIGNhbiBiZSBpbnZva2VkIHRvIHJlbW92ZSBhbiBldmVudCBoYW5kbGVyIHJlZ2lzdHJhdGlvbi4gVGhpcyB3aWxsIGJlXG4gKiByZXR1cm5lZCB3aGVuIHJlZ2lzdGVyaW5nIGFuIGV2ZW50IGFuZCBtYWtlcyB1bnJlZ2lzdGVyaW5nIHNpbXBsZXIuXG4gKlxuICogQHJldHVybnMgIFdoZXRoZXIgb3Igbm90IHRoZSB1bnJlZ2lzdHJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC5cbiAqL1xuZXhwb3J0IHR5cGUgVGFibGVhdUV2ZW50VW5yZWdpc3RlckZuID0gKCkgPT4gYm9vbGVhbjtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGhhbmRsaW5nIHJlZ2lzdGVyaW5nIGFuZCB1bnJlZ2lzdGVyaW5nIGV2ZW50IGxpc3RlbmVycy4gRGlmZmVyZW50IG9iamVjdHMgd2lsbCBpbXBsZW1lbnRcbiAqIHRoaXMgaW50ZXJmYWNlIHRvIG1hbmFnZSB0aGVpciBldmVudCBoYW5kbGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFdmVudExpc3RlbmVyTWFuYWdlciB7XG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBvYmplY3QuIElmIHRoaXMgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgdGhlIHNwZWNpZmllZCBgZXZlbnRUeXBlYCxcbiAgICogdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICAgKiBUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIHRoZSBldmVudCB0eXBlcyBzdXBwb3J0ZWQgYnkgb2JqZWN0cy5cbiAgICpcbiAgICogfCBvYmplY3QgfCBldmVudFR5cGUgfFxuICAgKiB8IC0tLS0tLSAgfCAtLS0tLSB8XG4gICAqIHwge0BsaW5rIFdvcmtzaGVldH0gfCBgRmlsdGVyQ2hhbmdlZGAgLCBgTWFya1NlbGVjdGlvbkNoYW5nZWRgLCBgU3VtbWFyeURhdGFDaGFuZ2VkYCwgYFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkYCB8XG4gICAqIHwge0BsaW5rIFBhcmFtZXRlcn0gfCBgUGFyYW1ldGVyQ2hhbmdlZGAgfFxuICAgKiB8IHtAbGluayBTZXR0aW5nc30gIHwgIGBTZXR0aW5nc0NoYW5nZWRgIHxcbiAgICogfCB7QGxpbmsgRGFzaGJvYXJkfSB8ICBgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZGAsIGBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkYCB8XG4gICAqXG4gICAqIEBwYXJhbSBldmVudFR5cGUgIFRoZSB0eXBlIG9mIGV2ZW50IHRvIHJlZ2lzdGVyIGZvci4gVGhlIHR5cGUgb2YgZXZlbnQgaXMgYSBgVGFibGVhdUV2ZW50VHlwZWAgZW51bWVyYXRpb24uXG4gICAqIEBwYXJhbSBoYW5kbGVyICAgIFRoZSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuIGFuIGV2ZW50IGhhcHBlbnMuXG4gICAqIEByZXR1cm5zICAgICAgICAgIEEgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSBjYWxsZWQgdG8gcmVtb3ZlIHRoaXMgcmVnaXN0cmF0aW9uLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2V0cyB1cCBhIGxpc3RlbmVyIGluIGEgd29ya3NoZWV0IGZvciBhIG1hcmsgc2VsZWN0aW9uIGV2ZW50IChgTWFya1NlbGVjdGlvbkNoYW5nZWRgKS5cbiAgICogV2hlbiB0aGUgZXZlbnQgb2NjdXJzLCB0aGUgZGF0YSBpcyByZWxvYWRlZC4gVGhlIGBhZGRFdmVudExpc3RlbmVyYCBtZXRob2QgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdW4tcmVnaXN0ZXJzXG4gICAqIHRoZSBldmVudCBoYW5kbGVyLiBDYWxsIHRoYXQgZnVuY3Rpb24sIGluIHRoaXMgY2FzZSwgYHVucmVnaXN0ZXJFdmVudEhhbmRsZXJGdW5jdGlvbigpYCB0byByZW1vdmUgdGhlIHJlZ2lzdHJhdGlvbi5cbiAgICpcbiAgICogYGBgXG4gICAqIC8vIEFkZCBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IG9uIHRoaXMgc2hlZXQuXG4gICAqIC8vIEFzc2lnbmluZyB0aGUgZXZlbnQgdG8gYSB2YXJpYWJsZSBqdXN0IHRvIG1ha2UgdGhlIGV4YW1wbGUgZml0IG9uIHRoZSBwYWdlIGhlcmUuXG4gICAgY29uc3QgbWFya1NlbGVjdGlvbiA9IHRhYmxlYXUuVGFibGVhdUV2ZW50VHlwZS5NYXJrU2VsZWN0aW9uQ2hhbmdlZDtcbiAgICAgLy9cbiAgICB1bnJlZ2lzdGVyRXZlbnRIYW5kbGVyRnVuY3Rpb24gPSB3b3Jrc2hlZXQuYWRkRXZlbnRMaXN0ZW5lcihtYXJrU2VsZWN0aW9uLCBmdW5jdGlvbiAoc2VsZWN0aW9uRXZlbnQpIHtcbiAgICAvLyBXaGVuIHRoZSBzZWxlY3Rpb24gY2hhbmdlcywgcmVsb2FkIHRoZSBkYXRhXG4gICAgICAgIGxvYWRTZWxlY3RlZE1hcmtzKHdvcmtzaGVldE5hbWUpO1xuICAgIH0pO1xuICAgKlxuICAgKiAvLyByZW1vdmUgdGhlIGV2ZW50IGxpc3RlbmVyIHdoZW4gZG9uZVxuICAgKiAgdW5yZWdpc3RlckV2ZW50SGFuZGxlckZ1bmN0aW9uKCk7XG4gICAqXG4gICAqIGBgYFxuICAgKlxuICAgKi9cbiAgYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIGhhbmRsZXI6IFRhYmxlYXVFdmVudEhhbmRsZXJGbik6IFRhYmxlYXVFdmVudFVucmVnaXN0ZXJGbjtcblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBpZiBhIG1hdGNoaW5nIG9uZSBpcyBmb3VuZC4gSWYgbm8gbWF0Y2hpbmcgbGlzdGVuZXIgZXhpc3RzLCB0aGUgbWV0aG9kIGRvZXMgbm90aGluZy5cbiAgICogVGhlIGhhbmRsZXIgZnVuY3Rpb24gbXVzdCB0aGUgaGFuZGxlciBmdW5jdGlvbiBzcGVjaWZpZWQgaW4gdGhlIGNhbGwgdG8gdGhlIGBhZGRFdmVudExpc3RlbmVyYCBtZXRob2QuIEFsdGVybmF0aXZlbHksIHVzZSB0aGUgZnVuY3Rpb25cbiAgICogcmV0dXJuZWQgZnJvbSB0aGUgY2FsbCB0byBgYWRkRXZlbnRMaXN0ZW5lcmAgdG8gdW5yZWdpc3RlciB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0V2ZW50cyBhbmQgRXZlbnQgSGFuZGxpbmddKGh0dHBzOi8vdGFibGVhdS5naXRodWIuaW8vZXh0ZW5zaW9ucy1hcGkvZG9jcy9jb3JlL3RyZXhfZXZlbnRzKS5cbiAgICpcbiAgICogQHJldHVybnMgIFdoZXRoZXIgb3Igbm90IGFuIGV2ZW50IGxpc3RlbmVyIHdhcyByZW1vdmVkLlxuICAgKi9cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIGhhbmRsZXI6IFRhYmxlYXVFdmVudEhhbmRsZXJGbik6IGJvb2xlYW47XG59XG4iLCIvLyBBbGwgZW51bSB2YWx1ZXMgbWFkZSBhdmFpbGFibGUgdG8gRXh0ZW5zaW9ucyBkZXZlbG9wZXJzLlxuLy8gRW51bXMgc2hvdWxkIGJlIGtlcHQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLlxuXG5pbXBvcnQgeyBFeHRlbnNpb25zIH0gZnJvbSAnLi9FeHRlbnNpb25zJztcblxubmFtZXNwYWNlIFRhYmxlYXUge1xuICBleHBvcnQgbGV0IGV4dGVuc2lvbnM6IEV4dGVuc2lvbnM7XG4gIC8qKlxuICAgKiBBbGwgZXJyb3IgY29kZXMgdXNlZCBieSB0aGUgRXh0ZW5zaW9ucyBBUEkuXG4gICAqL1xuICBleHBvcnQgZW51bSBFcnJvckNvZGVzIHtcbiAgICAvKipcbiAgICAgKiBUaHJvd24gd2hlbiBjYWxsZXIgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBjb21tYW5kIGJlZm9yZSBpbml0aWFsaXphdGlvbiBoYXMgY29tcGxldGVkLlxuICAgICAqL1xuICAgIEFQSU5vdEluaXRpYWxpemVkID0gJ2FwaS1ub3QtaW5pdGlhbGl6ZWQnLFxuICAgIC8qKlxuICAgICAqIFRocm93biB3aGVuIGNhbGxlciBhdHRlbXB0cyB0byBleGVjdXRlIGNvbW1hbmQgd2hpbGUgZXh0ZW5zaW9uIGlzIG5vdCB2aXNpYmxlLlxuICAgICAqL1xuICAgIFZpc2liaWxpdHlFcnJvciA9ICd2aXNpYmlsaXR5LWVycm9yJyxcbiAgICAvKipcbiAgICAgKiBPbmx5IG9uZSBkaWFsb2cgY2FuIGJlIG9wZW5lZCBhdCB0aW1lIHdpdGggdGhlIFVJIG5hbWVzcGFjZSBmdW5jdGlvbmFsaXR5LlxuICAgICAqL1xuICAgIERpYWxvZ0FscmVhZHlPcGVuID0gJ2RpYWxvZy1hbHJlYWR5LW9wZW4nLFxuICAgIC8qKlxuICAgICAqIFRoZSBvcGVuIGRpYWxvZyB3YXMgY2xvc2VkIGJ5IHRoZSB1c2VyLlxuICAgICAqL1xuICAgIERpYWxvZ0Nsb3NlZEJ5VXNlciA9ICdkaWFsb2ctY2xvc2VkLWJ5LXVzZXInLFxuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgVGFibGVhdSBFeHRlbnNpb25zIEFQSS4gQ29udGFjdCBUYWJsZWF1IFN1cHBvcnQuXG4gICAgICovXG4gICAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gICAgLyoqXG4gICAgICogQSBkaWFsb2cgbXVzdCBzdGFydCBvbiB0aGUgc2FtZSBkb21haW4gYXMgdGhlIHBhcmVudCBleHRlbnNpb24uXG4gICAgICovXG4gICAgSW52YWxpZERvbWFpbkRpYWxvZyA9ICdpbnZhbGlkLWRpYWxvZy1kb21haW4nLFxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZSBmaWVsZC5cbiAgICAgKi9cbiAgICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgICAvKipcbiAgICAgKiBDYW4gb2NjdXIgaWYgdGhlIGV4dGVuc2lvbiBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgICAqL1xuICAgIE1pc3NpbmdGaWx0ZXIgPSAnbWlzc2luZy1maWx0ZXInLFxuICAgIC8qKlxuICAgICAqIENhbiBvY2N1ciBpZiB0aGUgZXh0ZW5zaW9uIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAgICovXG4gICAgTWlzc2luZ1BhcmFtZXRlciA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgU2VydmVyIEVycm9yXG4gICAgICovXG4gICAgU2VydmVyRXJyb3IgPSAnc2VydmVyLWVycm9yJyxcbiAgICAvKipcbiAgICAgKiBEZXZlbG9wZXIgY2Fubm90IHNhdmUgc2V0dGluZ3Mgd2hpbGUgYW5vdGhlciBzYXZlIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAqL1xuICAgIFNldHRpbmdTYXZlSW5Qcm9ncmVzcyA9ICdzZXR0aW5nLXNhdmUtaW4tcHJvZ3Jlc3MnLFxuICAgIC8qKlxuICAgICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIGBhZGRFdmVudExpc3RlbmVyYCBvciBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuXG4gICAgICovXG4gICAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gICAgLyoqXG4gICAgICogQSBtZXRob2Qgd2FzIHVzZWQgZm9yIGEgdHlwZSBvZiBkYXRhIHNvdXJjZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0IG1ldGhvZCAoc2VlIGdldEFjdGl2ZVRhYmxlc0FzeW5jIGZvciBhbiBleGFtcGxlKVxuICAgICAqL1xuICAgIFVuc3VwcG9ydGVkTWV0aG9kRm9yRGF0YVNvdXJjZVR5cGUgPSAndW5zdXBwb3J0ZWQtbWV0aG9kLWZvci1kYXRhLXNvdXJjZS10eXBlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICAgIERlc2t0b3AgPSAnZGVza3RvcCcsXG4gICAgU2VydmVyID0gJ3NlcnZlcicsXG4gICAgQ2xvdWQgPSAnY2xvdWQnLFxuICAgIFB1YmxpY1dlYiA9ICdwdWJsaWMtd2ViJyxcbiAgICBQdWJsaWNEZXNrdG9wID0gJ3B1YmxpYy1kZXNrdG9wJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbk1vZGUge1xuICAgIEF1dGhvcmluZyA9ICdhdXRob3JpbmcnLFxuICAgIFZpZXdpbmcgPSAndmlld2luZycsXG4gIH1cblxuICAvKipcbiAgICogVGhlIG1lZGlhIHR5cGUgb2YgdGhlIGV4cG9ydGVkIGNvbnRlbnQuXG4gICAqL1xuICBleHBvcnQgZW51bSBFeHBvcnRlZE1lZGlhVHlwZSB7XG4gICAgSW1hZ2UgPSAnaW1hZ2UnLFxuICAgIFBkZiA9ICdwZGYnLFxuICAgIFN2ZyA9ICdzdmcnLFxuICAgIEh0bWwgPSAnaHRtbCcsXG4gICAgUG93ZXJQb2ludCA9ICdwb3dlcnBvaW50JyxcbiAgICBFeGNlbCA9ICdleGNlbCcsXG4gIH1cblxuICAvKipcbiAgICogUmVwcmVzZW50cyB0aGUgdHlwZSBvZiBldmVudCB0aGF0IGNhbiBiZSBsaXN0ZW5lZCBmb3IuXG4gICAqL1xuICBleHBvcnQgZW51bSBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgICAvKipcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICogUmFpc2VkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIHRoYXQgd2FzIHNlbnQgYnkgYSBkaWFsb2cgb3IgZXh0ZW5zaW9uIHZpYSBgc2VuZERpYWxvZ01lc3NhZ2VBc3luY2AuKi9cbiAgICBEaWFsb2dNZXNzYWdlUmVjZWl2ZWQgPSAnZGlhbG9nLW1lc3NhZ2UtcmVjZWl2ZWQnLFxuXG4gICAgLyoqIFJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuKi9cbiAgICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhcyBjaGFuZ2VkLlxuICAgICAqIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuICovXG4gICAgTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnbWFyay1zZWxlY3Rpb24tY2hhbmdlZCcsXG5cbiAgICAvKiogVGhlIHN1bW1hcnkgZGF0YSBiYWNraW5nIGEgd29ya3NoZWV0IGhhcyBjaGFuZ2VkXG4gICAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1dvcmtzaGVldF0oLi4vaW50ZXJmYWNlcy93b3Jrc2hlZXQuaHRtbCkgb2JqZWN0cy4qL1xuICAgIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIHtAbGluayBQYXJhbWV0ZXJ9IG9iamVjdHMuICovXG4gICAgUGFyYW1ldGVyQ2hhbmdlZCA9ICdwYXJhbWV0ZXItY2hhbmdlZCcsXG5cbiAgICAvKiogU2V0dGluZ3MgaGF2ZSBiZWVuIGNoYW5nZWQgZm9yIHRoaXMgZXh0ZW5zaW9uLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCB7QGxpbmsgU2V0dGluZ3N9IG9iamVjdHMuICovXG4gICAgU2V0dGluZ3NDaGFuZ2VkID0gJ3NldHRpbmdzLWNoYW5nZWQnLFxuXG4gICAgLyoqIFRoZSBkYXNoYm9hcmQgbGF5b3V0IGhhcyBjaGFuZ2VkXG4gICAgICogQGNhdGVnb3J5IERhc2hib2FyZCBFeHRlbnNpb25zXG4gICAgICovXG4gICAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCA9ICdkYXNoYm9hcmQtbGF5b3V0LWNoYW5nZWQnLFxuXG4gICAgLyoqIFRoZSB3b3JrYm9vayBmb3JtYXR0aW5nIGhhcyBjaGFuZ2VkXG4gICAgICogQGNhdGVnb3J5IERhc2hib2FyZCBFeHRlbnNpb25zXG4gICAgICovXG4gICAgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCA9ICd3b3JrYm9vay1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuXG4gICAgLyoqIFRoZSB3b3Jrc2hlZXQgZm9ybWF0dGluZyBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBWaXogRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkID0gJ3dvcmtzaGVldC1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBkYXRhIHR5cGUgb2YgZW5jb2RpbmdzIGZvciBjcmVhdGVWaXpJbWFnZUFzeW5jLlxuICAgKiBAc2luY2UgMS42LjBcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlRW5jb2RpbmdUeXBlIHtcbiAgICBEaXNjcmV0ZSA9ICdkaXNjcmV0ZScsXG4gICAgQ29udGludW91cyA9ICdjb250aW51b3VzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgc29ydCBkaXJlY3Rpb24gZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlU29ydERpcmVjdGlvblR5cGUge1xuICAgIEFzY2VuZGluZyA9ICdhc2NlbmRpbmcnLFxuICAgIERlc2NlbmRpbmcgPSAnZGVzY2VuZGluZycsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHBhbGV0dGUgdHlwZSBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuOC4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgZXhwb3J0IGVudW0gVml6SW1hZ2VQYWxldHRlVHlwZSB7XG4gICAgQ3VzdG9tRGl2ZXJnaW5nID0gJ2N1c3RvbS1kaXZlcmdpbmcnLFxuICAgIEN1c3RvbVNlcXVlbnRpYWwgPSAnY3VzdG9tLXNlcXVlbnRpYWwnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBTaXplIFNldHRpbmcgdHlwZSBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuOC4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgZXhwb3J0IGVudW0gVml6SW1hZ2VTaXplU2V0dGluZ1R5cGUge1xuICAgIEZpeGVkID0gJ2ZpeGVkJyxcbiAgICBNYW51YWwgPSAnbWFudWFsJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgU2l6ZSBTZXR0aW5nIGFsaWdubWVudCB0eXBlIGZvciBjcmVhdGVWaXpJbWFnZUFzeW5jLlxuICAgKiBAc2luY2UgMS44LjAgYW5kIFRhYmxlYXUgMjAyMS40XG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZVNpemVTZXR0aW5nQWxpZ25tZW50VHlwZSB7XG4gICAgUmlnaHQgPSAncmlnaHQnLFxuICAgIExlZnQgPSAnbGVmdCcsXG4gICAgQ2VudGVyID0gJ2NlbnRlcicsXG4gIH1cbn1cbmV4cG9ydCA9IFRhYmxlYXU7XG4iLCJpbXBvcnQgeyBEaWFsb2dTdHlsZSB9IGZyb20gJy4uLy4uL1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuXG4vKipcbiAqIFRoZSBVSSBuYW1lc3BhY2UgY29udGFpbnMgbWV0aG9kcyB0aGF0IGFsbG93IGFuIGV4dGVuc2lvbiB0byBkaXNwbGF5IGEgcG9wdXBcbiAqIGRpYWxvZyB3aW5kb3cuIEEgbW9kYWwgZGlhbG9nIGNhbiBiZSB1c2VmdWwgaW4gYXV0aGVudGljYXRpb24gb3IgY29uZmlndXJhdGlvbiBzY2VuYXJpb3MsXG4gKiBvciB3aGVuIGV4dHJhIHNpdHVhdGlvbmFsIFVJIHNwYWNlIGlzIG5lZWRlZC4gT25seSBvbmUgZGlhbG9nIGNhbiBiZSBkaXNwbGF5ZWQgYXQgYSB0aW1lIHBlciBleHRlbnNpb24uXG4gKiBJbnNpZGUgdGhlIHBvcHVwIGRpYWxvZyB3aW5kb3csIGFub3RoZXIgZXh0ZW5zaW9uIGNhbiBiZSBsb2FkZWQgYW5kIHJ1bi4gVGhpcyAqZGlhbG9nIGV4dGVuc2lvbiogd2lsbCBoYXZlIGZ1bGwgYWNjZXNzXG4gKiB0byB0aGUgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5IHRoZSBFeHRlbnNpb25zIEFQSS4gT25lIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZXh0ZW5zaW9uIHJ1bm5pbmcgaW4gdGhlIHBvcHVwIGRpYWxvZyB3aW5kb3dcbiAqIGFuZCBhbiBleHRlbnNpb24gcnVubmluZyBpbiB0aGUgZGFzaGJvYXJkIGlzIHRoYXQgdGhlIHBvcHVwIGRpYWxvZyB3aW5kb3cgbXVzdCBjYWxsXG4gKiB0aGUgYGluaXRpYWxpemVEaWFsb2dBc3luYygpYCBtZXRob2QgaW5zdGVhZCBvZiBgaW5pdGlhbGl6ZUFzeW5jKClgIHRvIGluaXRpYWxpemUgdGhlIGV4dGVuc2lvbi5cbiAqXG4gKiAqKk5vdGUqKiBJZiB5b3Ugd2FudCB0byB1c2UgYSBwb3B1cCBkaWFsb2cgd2luZG93IG9uIFRhYmxlYXUgU2VydmVyLCB5b3UgbmVlZCB0byBsZXQgdXNlcnMga25vdyB0aGF0IHRoZWlyIGJyb3dzZXIgbXVzdCBiZVxuICogIGNvbmZpZ3VyZWQgdG8gYWxsb3cgcG9wdXBzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVJIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB1cmwgICAgICAgICAgIFRoZSB1cmwgb2YgdGhlICdkaWFsb2cgZXh0ZW5zaW9uJyB0byBuYXZpZ2F0ZSB0byBpbiB0aGUgZGlhbG9nLiBUaGUgdXJsIG11c3RcbiAgICogICAgICAgICAgICAgICAgICAgICAgYmVsb25nIHRvIHRoZSBzYW1lIGRvbWFpbiBhcyB0aGUgcGFyZW50IGV4dGVuc2lvbi5cbiAgICogQHNpbmNlIDEuMy4wICAgICAgICAgQSByZWxhdGl2ZSBwYXRoIG1heSBiZSB1c2VkIGJlZ2lubmluZyB3aXRoIFRhYmxlYXUgMjAxOS4zIGFuZCB2ZXJzaW9uIDEuMy4wIG9mIHRoZSBFeHRlbnNpb25zIEFQSSBsaWJyYXJ5LlxuICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVsYXRpdmUgcGF0aCBtdXN0IHJlc29sdmUgdG8gdGhlIGRpcmVjdG9yeSwgb3IgYSBjaGlsZCBkaXJlY3RvcnksIG9mIHRoZSBleHRlbnNpb24uXG4gICAqICAgICAgICAgICAgICAgICAgICAgIFJvb3QtcmVsYXRpdmUgcGF0aHMgYXJlIG5vdCBhbGxvd2VkLiBGb3IgZXhhbXBsZSwgYC4vY29uZmlnLmh0bWxgIG9yIGBjb25maWcuaHRtbGAgYXJlIGFsbG93ZWQsXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGJ1dCBub3QgdGhlIHJvb3QtcmVsYXRpdmUgcGF0aCBgL2NvbmZpZy5odG1sYC5cbiAgICogICAgICAgICAgICAgICAgICAgICAgKipOb3RlKiogSWYgeW91ciBleHRlbnNpb24gaXMgbWVhbnQgZm9yIHVzZSBpbiB2ZXJzaW9ucyBvZiBUYWJsZWF1IHByaW9yIHRvIDIwMTkuMyxcbiAgICogICAgICAgICAgICAgICAgICAgICAgeW91IHNob3VsZCB1c2UgYW4gYWJzb2x1dGUgdXJsLlxuICAgKiBAcGFyYW0gcGF5bG9hZCAgICAgICBUaGUgYHBheWxvYWRgIGlzIG9wdGlvbmFsLCBhbmQgaXMgdXNlZCB0byBwcm92aWRlIGRhdGEgdG8gdGhlIHBvcHVwIGRpYWxvZyB3aW5kb3dcbiAgICogICAgICAgICAgICAgICAgICAgICAgYXQgc3RhcnR1cC4gVGhlIGBwYXlsb2FkYCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSBkaWFsb2cgZXh0ZW5zaW9uIGFzIHRoZSByZXR1cm5cbiAgICogICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgdGhlIGNhbGwgdG8gdGhlIGB0YWJsZWF1LmV4dGVuc2lvbnMudWkuaW5pdGlhbGl6ZURpYWxvZ0FzeW5jYCBmdW5jdGlvbi5cbiAgICogICAgICAgICAgICAgICAgICAgICAgSWYgbm8gYHBheWxvYWRgIGlzIHByb3ZpZGVkLCB5b3UgbXVzdCBpbmRpY2F0ZSB0aGlzIHdpdGggYW4gZW1wdHkgc3RyaW5nIGBcIiBcImAuXG4gICAqIEBwYXJhbSBkaWFsb2dPcHRpb25zIFNwZWNpZmllcyB0aGUgb3B0aW9ucyBmb3IgdGhlIHBvcHVwIGRpYWxvZyB3aW5kb3cuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBgZGlhbG9nT3B0aW9uc2AgaGFzIHByb3BlcnRpZXMgZm9yIHdpZHRoIGFuZCBoZWlnaHQgKGluIHBpeGVscykgYW5kIGEgcHJvcGVydHkgZm9yIHRoZSBkaWFsb2cncyBzdHlsZS5cbiAgICogICAgICAgICAgICAgICAgICAgICAgVGhlIGRpYWxvZyBzdHlsZSBjYW4gYmUgYSB3aW5kb3csIGEgbW9kYWwgZGlhbG9nLCBvciBhIG1vZGVsZXNzIGRpYWxvZy4gSWYgc3R5bGUgaXMgbm90IHNwZWNpZmllZCwgd2luZG93IHdpbGwgYmUgdXNlZC5cbiAgICogICAgICAgICAgICAgICAgICAgICAgWW91IHBhc3MgdGhlc2UgcHJvcGVydGllcyB0byB0aGUgYGRpc3BsYXlEaWFsb2dBc3luY2AgZnVuY3Rpb24sIGFzIGZvbGxvd3M6XG4gICAqICAgICAgICAgICAgICAgICAgICAgIGB7d2lkdGg6YCAqbnVtYmVyKmAsIGhlaWdodDpgICpudW1iZXIqYCwgZGlhbG9nU3R5bGU6YCAqRGlhbG9nU3R5bGUqYH1gXG4gICAqXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRpYWxvZyBoYXMgYmVlbiBjbG9zZWQuIEl0IHdpbGwgY29udGFpbiBhXG4gICAqICAgICAgICAgIHBheWxvYWQgYXMgYSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGRpYWxvZyBleHRlbnNpb24uIFRoZSBwcm9taXNlIGlzIHJlamVjdGVkIGlmXG4gICAqICAgICAgICAgIHRoZSB1c2VyIG1hbnVhbGx5IGNsb3NlcyB0aGUgZGlhbG9nIHdpbmRvdyAoZm9yIGV4YW1wbGUsIGJ5IGNsaWNraW5nIHRoZSAnWCcgaW4gd2luZG93KS5cbiAgICogICAgICAgICAgSXQgaXMgZ29vZCBwcmFjdGljZSB0byBoYW5kbGUgdGhpcyBlcnJvciBjb25kaXRpb24gd2l0aCBhIGNhdGNoIGJsb2NrLCBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuXG4gICAqXG4gICAqICBgYGBcbiAgICogICB0YWJsZWF1LmV4dGVuc2lvbnMudWkuZGlzcGxheURpYWxvZ0FzeW5jKHBvcHVwVXJsLCBkZWZhdWx0UGF5bG9hZCwgeyB3aWR0aDogNTAwLCBoZWlnaHQ6IDUwMCB9KS50aGVuKChjbG9zZVBheWxvYWQpID0+IHtcbiAgICogICAgIC8vXG4gICAqICAgICAvLyBUaGUgcHJvbWlzZSBpcyByZXNvbHZlZCB3aGVuIHRoZSBkaWFsb2cgaGFzIGJlZW4gY2xvc2VkIGFzIGV4cGVjdGVkLCBtZWFuaW5nIHRoYXRcbiAgICogICAgIC8vIHRoZSBwb3B1cCBleHRlbnNpb24gaGFzIGNhbGxlZCB0YWJsZWF1LmV4dGVuc2lvbnMudWkuY2xvc2VEaWFsb2coKSBtZXRob2QuXG4gICAqICAgICAvLyBUaGUgY2xvc2UgcGF5bG9hZCAoY2xvc2VQYXlsb2FkKSBpcyByZXR1cm5lZCBmcm9tIHRoZSBwb3B1cCBleHRlbnNpb25cbiAgICogICAgIC8vIHZpYSB0aGUgY2xvc2VEaWFsb2coKSBtZXRob2QuXG4gICAqICAgICAvL1xuICAgKiAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICogICAgIC8vIE9uZSBleHBlY3RlZCBlcnJvciBjb25kaXRpb24gaXMgd2hlbiB0aGUgcG9wdXAgaXMgY2xvc2VkIGJ5IHRoZSB1c2VyIChtZWFuaW5nIHRoZSB1c2VyXG4gICAqICAgICAvLyBjbGlja3MgdGhlICdYJyBpbiB0aGUgdG9wIHJpZ2h0IG9mIHRoZSBkaWFsb2cpLiBUaGlzIGNhbiBiZSBjaGVja2VkIGZvciBsaWtlIHNvOlxuICAgKiAgICAgICBzd2l0Y2goZXJyb3IuZXJyb3JDb2RlKSB7XG4gICAqICAgICAgICAgY2FzZSB0YWJsZWF1LkVycm9yQ29kZXMuRGlhbG9nQ2xvc2VkQnlVc2VyOlxuICAgKiAgICAgICAgICAgY29uc29sZS5sb2coXCJEaWFsb2cgd2FzIGNsb3NlZCBieSB1c2VyXCIpO1xuICAgKiAgICAgICAgICAgYnJlYWs7XG4gICAqICAgICAgICAgZGVmYXVsdDpcbiAgICogICAgICAgY29uc29sZS5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICogICAgICAgfVxuICAgKiAgICAgfSk7XG4gICAqICBgYGBcbiAgICpcbiAgICovXG4gIGRpc3BsYXlEaWFsb2dBc3luYyh1cmw6IHN0cmluZywgcGF5bG9hZD86IHN0cmluZywgZGlhbG9nT3B0aW9ucz86IERpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEBleHBlcmltZW50YWxcbiAgICogU2VuZHMgYSBtZXNzYWdlIGZyb20gdGhlIGRpYWxvZyB0byB0aGUgaG9zdCBleHRlbnNpb24gb3IgdmljZSB2ZXJzYS5cbiAgICogRm9yIGRpYWxvZ3Mgc2VuZGluZyBtZXNzYWdlcyB0byBleHRlbnNpb25zLCB3ZSBtdXN0IGxpc3RlbiBmb3IgdGhlIERpYWxvZ01lc3NhZ2VFdmVudCBpbiB0aGUgZXh0ZW5zaW9uIGluIG9yZGVyIHRvIHJlY2VpdmUgdGhlIG1lc3NhZ2UuXG4gICAqIEZvciBleHRlbnNpb25zIHNlbmRpbmcgbWVzc2FnZXMgdG8gZGlhbG9nLCB3ZSBtdXN0IGxpc3RlbiBmb3IgdGhlIERpYWxvZ01lc3NhZ2VFdmVudCBpbiB0aGUgZGlhbG9nIGNvZGUgaW4gb3JkZXIgdG8gcmVjZWl2ZSB0aGUgbWVzc2FnZS5cbiAgICogRm9yIHR3byB3YXkgY29tbXVuaWNhdGlvbiwgbGlzdGVuIGZvciB0aGUgRGlhbG9nTWVzc2FnZUV2ZW50IGluIGJvdGggdGhlIGRpYWxvZyBhbmQgZXh0ZW5zaW9uIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIEEgbWVzc2FnZSB0byBzZW5kLlxuICAgKiBAcGFyYW0gdGFyZ2V0RGlhbG9nVXJsIFRoZSB1cmwgb2YgdGhlIGRpYWxvZyB0byBzZW5kIHRoZSBtZXNzYWdlIHRvLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcGFyZW50IGV4dGVuc2lvbi5cbiAgICpcbiAgICogYGBgXG4gICAqXG4gICAqICAgLy8gU2VuZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgZGlhbG9nIHRvIHRoZSBleHRlbnNpb246XG4gICAqXG4gICAqICAgLy8gZXh0ZW5zaW9uIGNvZGUgKGxpc3RlbmluZyBmb3IgbWVzc2FnZXMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgZGlhbG9nKVxuICAgKiAgIHRhYmxlYXUuZXh0ZW5zaW9ucy51aS5hZGRFdmVudExpc3RlbmVyKHRhYmxlYXUuVGFibGVhdUV2ZW50VHlwZS5EaWFsb2dNZXNzYWdlUmVjZWl2ZWQsIChlKSA9PiB7XG4gICAqICAgICBjb25zb2xlLmxvZygnTWVzc2FnZSByZWNlaXZlZCBmcm9tIGRpYWxvZzogJyArIGUubWVzc2FnZSk7XG4gICAqICAgfSlcbiAgICogICB0YWJsZWF1LmV4dGVuc2lvbnMudWkuZGlzcGxheURpYWxvZ0FzeW5jKHBvcHVwVXJsKTtcbiAgICogICAuLi5cbiAgICpcbiAgICogICAvLyBkaWFsb2cgY29kZSAoc2VuZGluZyBtZXNzYWdlIHRvIGV4dGVuc2lvbilcbiAgICogICBhd2FpdCB0YWJsZWF1LmV4dGVuc2lvbnMuaW5pdGlhbGl6ZURpYWxvZ0FzeW5jKCk7XG4gICAqICAgYXdhaXQgdGFibGVhdS5leHRlbnNpb25zLnVpLnNlbmREaWFsb2dNZXNzYWdlQXN5bmMoJ0hlbGxvIGZyb20gZGlhbG9nIScpO1xuICAgKlxuICAgKlxuICAgKiAgIC8vIFNlbmRpbmcgYSBtZXNzYWdlIGZyb20gdGhlIGV4dGVuc2lvbiB0byB0aGUgZGlhbG9nOlxuICAgKlxuICAgKiAgIC8vIGRpYWxvZyBjb2RlIChsaXN0ZW5pbmcgZm9yIG1lc3NhZ2VzIG9yaWdpbmF0aW5nIGZyb20gdGhlIGV4dGVuc2lvbilcbiAgICogICBhd2FpdCB0YWJsZWF1LmV4dGVuc2lvbnMuaW5pdGlhbGl6ZURpYWxvZ0FzeW5jKCk7XG4gICAqICAgdGFibGVhdS5leHRlbnNpb25zLnVpLmFkZEV2ZW50TGlzdGVuZXIodGFibGVhdS5UYWJsZWF1RXZlbnRUeXBlLkRpYWxvZ01lc3NhZ2VSZWNlaXZlZCwgKGUpID0+IHtcbiAgICogICAgIGNvbnNvbGUubG9nKCdNZXNzYWdlIHJlY2VpdmVkIGZyb20gZXh0ZW5zaW9uOiAnICsgZS5tZXNzYWdlKTtcbiAgICogICB9KVxuICAgKiAgIC4uLlxuICAgKlxuICAgKiAgIC8vIGV4dGVuc2lvbiBjb2RlIChzZW5kaW5nIG1lc3NhZ2UgdG8gZGlhbG9nKVxuICAgKiAgIHRhYmxlYXUuZXh0ZW5zaW9ucy51aS5kaXNwbGF5RGlhbG9nQXN5bmMocG9wdXBVcmwpO1xuICAgKiAgIC8vIHdhaXRpbmcgYSBiaXQgZm9yIGRpYWxvZyB0byBhcHBlYXIgYmVmb3JlIHNlbmRpbmcgbWVzc2FnZS5cbiAgICogICAvLyBub3RpY2UgdGhlIGludGVudGlvbmFsIG9taXNzaW9uIG9mIGF3YWl0IGluIGNhbGxzIHRvIGRpc3BsYXlEaWFsb2dBc3luYy5cbiAgICogICAvLyB0aGF0J3MgYmVjYXVzZSBpZiB3ZSBhd2FpdCwgd2Ugd29udCBydW4gYW55IGNvZGUgYWZ0ZXIgdGhhdCBsaW5lIHVudGlsIHRoZSBkaWFsb2cgY2xvc2VzIGFuZCB0aGUgcHJvbWlzZSByZXR1cm5zLlxuICAgKiAgIHNldFRpbWVvdXQoKCkgPT4gdGFibGVhdS5leHRlbnNpb25zLnVpLnNlbmREaWFsb2dNZXNzYWdlQXN5bmMoJ0hlbGxvIGZyb20gZXh0ZW5zaW9uIScsIHBvcHVwVXJsKSwgMTAwMCk7XG4gICAqIGBgYFxuICAgKlxuICAgKi9cbiAgc2VuZERpYWxvZ01lc3NhZ2VBc3luYyhtZXNzYWdlOiBzdHJpbmcsIHRhcmdldERpYWxvZ1VybD86IHN0cmluZyk7XG5cbiAgLyoqXG4gICAqIEBleHBlcmltZW50YWxcbiAgICogU2VuZHMgYSBtZXNzYWdlIGZyb20gdGhlIGRpYWxvZyB0byB0aGUgZXh0ZW5zaW9uIG9yIGRpYWxvZyB0aGF0IG9wZW5lZCBpdC5cbiAgICogVGhpcyBvbmx5IHdvcmtzIGlmIGNhbGxlZCBmcm9tIHRoZSBkaWFsb2cuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIEEgbWVzc2FnZSB0byBzZW5kLlxuICAgKlxuICAgKi9cbiAgc2VuZERpYWxvZ01lc3NhZ2VUb1BhcmVudEFzeW5jKG1lc3NhZ2U6IHN0cmluZyk7XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgZXh0ZW5zaW9uJ3MgZGlhbG9nLiBDYW4gYmUgY2FsbGVkIGZyb20gdGhlIHBvcHVwIGRpYWxvZyBvciBmcm9tIHRoZSBleHRlbnNpb24gaXRzZWxmLlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZCBUaGUgYHBheWxvYWRgIGlzIG9wdGlvbmFsLCBhbmQgaWYgc3BlY2lmaWVkLCBpdCBpcyBtYWRlIGF2YWlsYWJsZSB0byBwYXJlbnQgZXh0ZW5zaW9uIHdoZW5cbiAgICogICAgICAgICAgICAgICAgdGhpcyBwb3B1cCBkaWFsb2cgY2xvc2VzLiBJZiB0aGUgZXh0ZW5zaW9uIHJ1bm5pbmcgaW4gdGhlIHBvcHVwIGRpYWxvZyB3aW5kb3cgZG9lcyBub3QgcmV0dXJuXG4gICAqICAgICAgICAgICAgICAgIGEgcGF5bG9hZCwgeW91IG11c3Qgc3RpbGwgcHJvdmlkZSBhbiBlbXB0eSBzdHJpbmcgYFwiIFwiYCBhcyBhIHJldHVybiB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIGRpYWxvZ1VybCBTcGVjaWZpZXMgdGhlIHVybCBvZiB0aGUgZGlhbG9nIHRvIGNsb3NlLlxuICAgKiAgICAgICAgICAgICAgICAgIElmIHRoZSBtZXRob2QgaXMgY2FsbGVkIGZyb20gYSBkaWFsb2csIGFuZCB0aGUgZGlhbG9nVXJsIGlzIG5vdCBzcGVjaWZpZWQsIHRoaXMgd2lsbCBjbG9zZSB0aGUgY3VycmVudCBkaWFsb2cuXG4gICAqICAgICAgICAgICAgICAgICAgSWYgdGhlIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSBhbiBleHRlbnNpb24sIGFuZCB0aGUgZGlhbG9nVXJsIGlzIG5vdCBzcGVjaWZpZWQsIHRoaXMgd2lsbCBjbG9zZSBhbGwgb3BlbiBkaWFsb2dzLlxuICAgKiBgYGBcbiAgICogICAgdGFibGVhdS5leHRlbnNpb25zLnVpLmNsb3NlRGlhbG9nKCdteVBheWxvYWQgc3RyaW5nJyk7XG4gICAqXG4gICAqIGBgYFxuICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgYSBjYWxsIHRvIHRoZSBjbG9zZURpYWxvZyBtZXRob2Qgd2hlbiB0aGUgZGlhbG9nIGV4dGVuc2lvbiBkb2VzIG5vdCByZXR1cm4gYSBwYXlsb2FkLlxuICAgKlxuICAgKiBgYGBcbiAgICogICAgLy8gc3BlY2lmeSBhbiBlbXB0eSBzdHJpbmcgaWYgbm8gcGF5bG9hZCBpcyByZXR1cm5lZFxuICAgKiAgICB0YWJsZWF1LmV4dGVuc2lvbnMudWkuY2xvc2VEaWFsb2coJycpO1xuICAgKiBgYGBcbiAgICpcbiAgICovXG4gIGNsb3NlRGlhbG9nKHBheWxvYWQ/OiBzdHJpbmcsIGRpYWxvZ1VybD86IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlhbG9nT3B0aW9ucyB7XG4gIC8qKiBTcGVjaWZpZXMgdGhlIHN1Z2dlc3RlZCB3aWR0aCAoaW4gcGl4ZWxzKSBvZiBkaWFsb2cgdG8gZGlzcGxheS4gIE5vdCBndWFyYW50ZWVkIHRvIGJlIGV4YWN0bHkgdGhhdCB3aWR0aC4gKi9cbiAgcmVhZG9ubHkgd2lkdGg/OiBudW1iZXI7XG4gIC8qKiBTcGVjaWZpZXMgdGhlIHN1Z2dlc3RlZCBoZWlnaHQgKGluIHBpeGVscykgb2YgdGhlIHBvcHVwIGRpYWxvZy4gIE5vdCBndWFyYW50ZWVkIHRvIGJlIGV4YWN0bHkgdGhhdCBoZWlnaHQuICovXG4gIHJlYWRvbmx5IGhlaWdodD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgc3R5bGUgZm9yIHRoZSBwb3B1cCBkaWFsb2cuXG4gICAqIEBzaW5jZSAxLjEwLjAgYW5kIFRhYmxlYXUgMjAyMi40XG4gICAqL1xuICByZWFkb25seSBkaWFsb2dTdHlsZT86IERpYWxvZ1N0eWxlO1xufVxuIiwiaW1wb3J0IHsgRGF0YVZhbHVlIH0gZnJvbSAnLi4vU2hhcmVkL0RhdGFUYWJsZUludGVyZmFjZXMnO1xuaW1wb3J0IHsgRGF0YVR5cGUsIFBhcmFtZXRlclZhbHVlVHlwZSwgUGVyaW9kVHlwZSB9IGZyb20gJy4uL1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIgfSBmcm9tICcuL0V2ZW50SW50ZXJmYWNlJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcGFyYW1ldGVyIGluIFRhYmxlYXUgYW5kIHByb3ZpZGVzIHdheXMgdG8gaW50cm9zcGVjdCB0aGUgcGFyYW1ldGVyIGFuZCBjaGFuZ2UgaXRzIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJhbWV0ZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyTWFuYWdlciB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIHBhcmFtZXRlci5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgIERhdGFWYWx1ZSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci5cbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRWYWx1ZTogRGF0YVZhbHVlO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIHR5cGUgb2YgZGF0YSB0aGlzIHBhcmFtZXRlciBob2xkcy5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFUeXBlOiBEYXRhVHlwZTtcblxuICAvKipcbiAgICogQHJldHVybnMgIFRoZSBhbGxvd2FibGUgc2V0IG9mIHZhbHVlcyB0aGlzIHBhcmFtZXRlciBjYW4gdGFrZS5cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93YWJsZVZhbHVlczogUGFyYW1ldGVyRG9tYWluUmVzdHJpY3Rpb247XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gICBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIFBhcmFtZXRlci5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIHRoaXMgcGFyYW1ldGVyIGFuZCBhc3NpZ25zIGl0IGEgbmV3IHZhbHVlLiBUaGUgbmV3IHZhbHVlIG11c3QgZmFsbCB3aXRoaW5cbiAgICogdGhlIGRvbWFpbiByZXN0cmljdGlvbnMgZGVmaW5lZCBieSBgYWxsb3dhYmxlVmFsdWVzYC4gSWYgdGhlIGRvbWFpbiByZXN0cmljdGlvbiBpcyBgUGFyYW1ldGVyVmFsdWVUeXBlLlJhbmdlYCxcbiAgICogYmUgc3VyZSB0byBjaGVjayB0aGUgYGFsbG93YWJsZVZhbHVlc2AgYmVmb3JlIGFzc2lnbmluZyBhIG5ldyB2YWx1ZS4gSWYgdGhlIG5ldyB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UsIHRoZVxuICAgKiB1cGRhdGVkIHZhbHVlIHdpbGwgYmUgc2V0IHRvIGVpdGhlciB0aGUgYG1pblZhbHVlYCBvciB0aGUgYG1heFZhbHVlYCBvZiB0aGUgYWxsb3dhYmxlIHJhbmdlLiBJZiBhIHN0ZXAgc2l6ZSBpcyBhbHNvIHNwZWNpZmllZFxuICAgKiBhbmQgdGhlIG5ldyB2YWx1ZSBkb2VzIG5vdCBmYWxsIG9uIHRoZSBzdGVwIGludGVydmFscywgdGhlIHVwZGF0ZWQgdmFsdWUgd2lsbCBiZSBzZXQgdG8gdGhlIGNsb3Nlc3QsIGxvd2VyIHN0ZXAsXG4gICAqIG9yIGNsb3Nlc3QsIGVhcmxpZXIgZGF0ZS4gSWYgdGhlIGRvbWFpbiByZXN0cmljdGlvbiBpcyB0eXBlIGBQYXJhbWV0ZXJWYWx1ZVR5cGUuTGlzdGAsIGFuZCB0aGVyZSBhcmUgYWxpYXNlcyBkZWZpbmVkIGZvciB0aGUgbGlzdCxcbiAgICogdGhlIGFsaWFzZWQgdmFsdWUgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0gbmV3VmFsdWUgIFRoZSBuZXcgdmFsdWUgdG8gYXNzaWduIHRvIHRoaXMgcGFyYW1ldGVyLlxuICAgKiA+WyFOb3RlXSBGb3IgY2hhbmdpbmcgYERhdGVgIHBhcmFtZXRlcnMsIFVUQyBEYXRlIG9iamVjdHMgYXJlIGV4cGVjdGVkLlxuICAgKiBAcmV0dXJucyAgICAgICAgIFRoZSB1cGRhdGVkIGBEYXRhVmFsdWVgLiBUaGUgcHJvbWlzZSBpcyByZWplY3RlZCBpZiBgbmV3VmFsdWVgIGlzIGludmFsaWQuIEhvd2V2ZXIsIGlmIHRoZSBkb21haW4gcmVzdHJpY3Rpb25cbiAgICogaXMgdHlwZSBgQWxsb3dhYmxlVmFsdWVzVHlwZS5SYW5nZWAsIGFuZCB0aGUgYG5ld1ZhbHVlYCBpcyBvdXQgb2YgdGhlIHJhbmdlIGJvdW5kcywgdGhlIHBhcmFtZXRlciBnZXRzIHNldCB0byB0aGUgYG1pblZhbHVlYFxuICAgKiBvciB0aGUgYG1heFZhbHVlYCBvZiB0aGUgcmFuZ2UgKHdoaWNoZXZlciBpcyBjbG9zZXIpLiBJZiB0aGUgcmFuZ2UgaGFzIGEgYHN0ZXBTaXplYCBvciBgZGF0ZVN0ZXBQZXJpb2RgLCB0aGUgcGFyYW1ldGVyIGdldHMgc2V0XG4gICAqIHRvIHRoZSBjbG9zZXN0LCBsb3dlciBzdGVwLCBvciB0aGUgY2xvc2VzdCwgZWFybGllciBkYXRlLlxuICAgKlxuICAgKi9cbiAgY2hhbmdlVmFsdWVBc3luYyhuZXdWYWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IERhdGUpOiBQcm9taXNlPERhdGFWYWx1ZT47XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgYWxsb3dhYmxlIHNldCBvZiB2YWx1ZXMgd2hpY2ggYSBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0by5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJhbWV0ZXJEb21haW5SZXN0cmljdGlvbiB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIHR5cGUgb2YgcmVzdHJpY3Rpb24gd2UgaGF2ZSBvbiB0aGUgcGFyYW1ldGVyJ3MgZG9tYWluLiBUaGlzIHZhbHVlXG4gICAqICAgICAgICAgICB3aWxsIGVmZmVjdCB3aGF0IG90aGVyIHByb3BlcnRpZXMgYXJlIGNvbmZpZ3VyZWQgb24gdGhpcyBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBQYXJhbWV0ZXJWYWx1ZVR5cGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBJZiBgUGFyYW1ldGVyVmFsdWVUeXBlLkxpc3RgLCB0aGUgYXJyYXkgd2lsbCBiZSB0aGUgbGlzdCBvZlxuICAgKiAgICAgICAgICAgdmFsdWVzIHdoaWNoIHRoZSBwYXJhbWV0ZXIgaXMgYWxsb3dlZCB0byB0YWtlLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dhYmxlVmFsdWVzPzogQXJyYXk8RGF0YVZhbHVlPjtcblxuICAvKipcbiAgICogQHJldHVybnMgIElmIGBQYXJhbWV0ZXJWYWx1ZVR5cGUuUmFuZ2VgLCB0aGUgdmFsdWUgd2lsbCBiZSB0aGUgbG93ZXJcbiAgICogICAgICAgICAgIGJvdW5kIG9mIGFsbG93YWJsZSB2YWx1ZXMgZm9yIHRoZSBwYXJhbWV0ZXIuXG4gICAqL1xuICByZWFkb25seSBtaW5WYWx1ZT86IERhdGFWYWx1ZTtcblxuICAvKipcbiAgICogQHJldHVybnMgIElmIGBQYXJhbWV0ZXJWYWx1ZVR5cGUuUmFuZ2VgLCB0aGUgdmFsdWUgd2lsbCBiZSB0aGUgdXBwZXJcbiAgICogICAgICAgICAgIGJvdW5kIG9mIGFsbG93YWJsZSB2YWx1ZXMgZm9yIHRoZSBwYXJhbWV0ZXIuXG4gICAqL1xuICByZWFkb25seSBtYXhWYWx1ZT86IERhdGFWYWx1ZTtcblxuICAvKipcbiAgICogQHJldHVybnMgIElmIGBQYXJhbWV0ZXJWYWx1ZVR5cGUuUmFuZ2VgLCB0aGUgdmFsdWUgd2lsbFxuICAgKiAgICAgICAgICAgZGVmaW5lIHRoZSBzdGVwIHNpemUgdXNlZCBpbiB0aGUgcGFyYW1ldGVyIFVJIGNvbnRyb2wgc2xpZGVyLlxuICAgKiAgICAgICAgICAgTm90ZSB0aGF0IGlmIHlvdSBzcGVjaWZ5IGEgbmV3IHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyLCB1c2luZyB0aGUgYGNoYW5nZVZhbHVlQXN5bmMoKWAgbWV0aG9kLFxuICAgKiAgICAgICAgICAgdGhhdCBkb2VzIG5vdCBhbGlnbiBvbiB0aGUgYHN0ZXBTaXplYCBpbnRlcnZhbCwgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IHRvIHRoZSBjbG9zZXN0LCBsb3dlciBpbnRlcnZhbC5cbiAgICogICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB0aGUgYHN0ZXBTaXplYCB3YXMgNSBhbmQgdGhlIHN0ZXBzIHdlcmUgMSwgNSwgMTAsIGlmIHRoZSBuZXcgdmFsdWUgc3BlY2lmaWVkXG4gICAqICAgICAgICAgICB3YXMgOCwgdGhlIHZhbHVlIDUgd291bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RlcFNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBJZiBgUGFyYW1ldGVyVmFsdWVUeXBlLlJhbmdlYCwgdGhpcyBkZWZpbmVzIHRoZSBzdGVwIGRhdGUgcGVyaW9kXG4gICAqICAgICAgICAgICB1c2VkIGluIHRoZSBQYXJhbWV0ZXIgVUkgY29udHJvbCBzbGlkZXIuIE5vdGUgdGhhdCBpZiB5b3Ugc3BlY2lmeSBhIG5ldyB2YWx1ZSBmb3IgdGhlIHBhcmFtZXRlcixcbiAgICogICAgICAgICAgIHVzaW5nIHRoZSBgY2hhbmdlVmFsdWVBc3luYygpYCBtZXRob2QsIHRoYXQgZG9lcyBub3QgYWxpZ24gb24gdGhlIGBkYXRlU3RlcFBlcmlvZGAgaW50ZXJ2YWwsIHRoZVxuICAgKiAgICAgICAgICAgdmFsdWUgd2lsbCBiZSBzZXQgdG8gdGhlIGNsb3Nlc3QsIGVhcmxpZXIgZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGVTdGVwUGVyaW9kPzogUGVyaW9kVHlwZTtcbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICcuL05hbWVzcGFjZXMvVGFibGVhdSc7XG5cbi8qKlxuICogQ3VzdG9tIGVycm9yIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IEVycm9yIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZWF1RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUYWJsZWF1IHNwZWNpZmljIEVycm9yQ29kZVxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3JDb2RlOiBFcnJvckNvZGVzO1xufVxuIiwiaW1wb3J0IHsgQW5ub3RhdGlvblR5cGUgfSBmcm9tICcuL05hbWVzcGFjZXMvVGFibGVhdSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBhbm5vdGF0aW9uIGluIGEgd29ya3NoZWV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFubm90YXRpb24ge1xuICAvKipcbiAgICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBhbm5vdGF0aW9uIGFzIGEgSFRNTCBzdHJpbmcuIEhUTUwgaXMgY3VycmVudGx5IG5vdCBhY2NlcHRlZCB3aGVuIGFkZGluZyBhbiBhbm5vdGF0aW9uLlxuICAgKi9cbiAgYW5ub3RhdGlvbkhUTUw6IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgVW5pcXVlIGlkIHJlcHJlc2VudGluZyB0aGUgYW5ub3RhdGlvbi5cbiAgICovXG4gIGFubm90YXRpb25JZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgcGxhaW4gdGV4dCBvZiB0aGUgYW5ub3RhdGlvbi5cbiAgICovXG4gIGFubm90YXRpb25UZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBhbm5vdGF0aW9uIHR5cGUuXG4gICAqL1xuICBhbm5vdGF0aW9uVHlwZTogQW5ub3RhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFVuaXF1ZSB0dXBsZSByZXByZXNlbnRpbmcgdGhlIG1hcmsgdGhhdCBpcyBiZWluZyBhbm5vdGF0ZWQuIFRoZSB0dXBsZUlkIHdpbGwgYmUgMCBmb3IgQXJlYSBvciBQb2ludCBhbm5vdGF0aW9ucy5cbiAgICovXG4gIHR1cGxlSWQ6IG51bWJlcjtcbn1cbiIsImltcG9ydCB7IERhdGFUYWJsZSwgRGF0YVRhYmxlUmVhZGVyIH0gZnJvbSAnLi9EYXRhVGFibGVJbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gIENvbHVtblR5cGUsXG4gIERhdGFGb3JtYXRUeXBlLFxuICBEYXRhVHlwZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUsXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBOZWdhdGl2ZU51bWJlckZvcm1hdCxcbiAgTnVtYmVyRm9ybWF0VW5pdHMsXG59IGZyb20gJy4vTmFtZXNwYWNlcy9UYWJsZWF1JztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBkYXRhIHNvdXJjZSB1c2VkIGJ5IGEgV29ya3NoZWV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTb3VyY2Uge1xuICAvKipcbiAgICogQHJldHVybnMgVGhlIHVzZXIgZnJpZW5kbHkgbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UgYXMgc2VlbiBpbiB0aGUgVUkuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFVuaXF1ZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgZGF0YSBzb3VyY2UuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBmaWVsZHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGF0YSBzb3VyY2UuXG4gICAqL1xuICByZWFkb25seSBmaWVsZHM6IEFycmF5PEZpZWxkPjtcblxuICAvKipcbiAgICogQHJldHVybnMgTGFzdCB1cGRhdGUgdGltZSBvZiB0aGUgZGF0YSBzb3VyY2UncyBleHRyYWN0LCBvciB1bmRlZmluZWQgaWYgdGhpcyBkYXRhIHNvdXJjZSBpcyBsaXZlLlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFjdFVwZGF0ZVRpbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGlzIGRhdGEgc291cmNlIGlzIGFuIGV4dHJhY3QsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzRXh0cmFjdDogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGlzIGRhdGEgc291cmNlIGlzIHB1Ymxpc2hlZCB0byBzZXJ2ZXIsIGZhbHNlIG90aGVyd2lzZS4gQWx3YXlzIHVuZGVmaW5lZCBwcmlvciB0byBUYWJsZWF1IDIwMjEuNC5cbiAgICogQHNpbmNlIDEuNy4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgcmVhZG9ubHkgaXNQdWJsaXNoZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFVSTCBvZiBkYXRhIHNvdXJjZSBpZiBwdWJsaXNoZWQgdG8gc2VydmVyLCB1bmRlZmluZWQgb3RoZXJ3aXNlLiBBbHdheXMgdW5kZWZpbmVkIHByaW9yIHRvIFRhYmxlYXUgMjAyMS40LlxuICAgKiBAc2luY2UgMS43LjAgYW5kIFRhYmxlYXUgMjAyMS40XG4gICAqIEBoaWRkZW4gRm9yIGZpcnN0IGNsYXNzIGV4dGVuc2lvbnMgb25seVxuICAgKi9cbiAgcHVibGlzaGVkVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhpcyBjYWxsIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGNsaWNraW5nIHRoZSBSZWZyZXNoIG9wdGlvbiBvbiBhIGRhdGEgc291cmNlIGluXG4gICAqIFRhYmxlYXUuICBUaGlzIGRvZXMgbm90IHJlZnJlc2ggYW4gZXh0cmFjdC5cbiAgICpcbiAgICogPlshTm90ZV0gVGhlIGByZWZyZXNoQXN5bmMoKWAgbWV0aG9kIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gc2NlbmFyaW9zIHdoZXJlIG1hbnVhbFxuICAgKiBpbnRlcmFjdGlvbiBjYXVzZXMgYSBuZWVkIHRvIHJlZnJlc2ggdGhlIGRhdGEgaW4gdGhlIFRhYmxlYXUgdmlzdWFsaXphdGlvbi4gVGhlIG1ldGhvZCBpcyBub3QsXG4gICAqIGFzIGN1cnJlbnRseSBkZXNpZ25lZCwgbWVhbnQgdG8gc3VwcG9ydCBvciBlbXVsYXRlIHN0cmVhbWluZyBvciAqbGl2ZSogdmlzdWFsaXphdGlvbnMuXG4gICAqIEV4dGVuc2lvbnMgdGhhdCB1c2UgdGhlIG1ldGhvZCB0byByZWZyZXNoIGFnZ3Jlc3NpdmVseSBvciBhdXRvbWF0aWNhbGx5XG4gICAqIGNhbiBjYXVzZSBpc3N1ZXMgb24gVGFibGVhdSBTZXJ2ZXIgYW5kIFRhYmxlYXUgT25saW5lIGFuZCBhcmUgc3ViamVjdCB0byBiZWluZyBibG9ja2VkXG4gICAqIGJ5IHRoZSBUYWJsZWF1IE9ubGluZSBhZG1pbmlzdHJhdG9yLlxuICAgKlxuICAgKiBUaGlzIGNhbGwgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgcmVmcmVzaGluZyBsaXZlIEdvb2dsZSBTaGVldCBkYXRhIHNvdXJjZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkYXRhIHNvdXJjZSBoYXMgZmluaXNoZWQgcmVmcmVzaGluZy5cbiAgICovXG4gIHJlZnJlc2hBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB0YWJsZSBzdW1tYXJ5IG9iamVjdHMgdGhhdCBhcmUgY3VycmVudGx5IHVzZWQgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgKlxuICAgKiBAdGhyb3dzICBVbnN1cHBvcnRlZE1ldGhvZEZvckRhdGFTb3VyY2VUeXBlIGVycm9yIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhIEN1YmUgRGF0YVNvdXJjZSBvciBHQS5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAxLjQuMC4gIFVzZSBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYy5cbiAgICovXG4gIGdldEFjdGl2ZVRhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8VGFibGVTdW1tYXJ5Pj47XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGRlc2NyaXB0aW9ucyBvZiB0aGUgY29ubmVjdGlvbnMgd2l0aGluIHRoaXMgZGF0YSBzb3VyY2UuXG4gICAqL1xuICBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb25uZWN0aW9uU3VtbWFyeT4+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAgQ29sbGVjdGlvbiBvZiBvcHRpb25zIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGNhbGwuXG4gICAqIEByZXR1cm5zICAgICAgICBSZXR1cm5zIGEgcHJvbWlzZSBjb250YWluaW5nIGEgcGFnZSBvZiBkYXRhIGZyb20gdGhlIHVuZGVybHlpbmcgZGF0YSBvZiB0aGUgZGF0YSBzb3VyY2UuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB1c2Ugb2YgdGhlIGBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKClgIG1ldGhvZCB0byBnZXQgdGhlIHVuZGVybHlpbmcgZGF0YSBmcm9tIGEgc3BlY2lmaWMgZGF0YSBzb3VyY2UuXG4gICAqIFRoZSBleGFtcGxlIHVzZXMgdGhlIEphdmFTY3JpcHQgYGZpbmQoKWAgbWV0aG9kIHRvIHNlbGVjdCB0aGUgd29ya2Jvb2sgYW5kIGRhdGEgc291cmNlLlxuICAgKlxuICAgKiBgYGBcbiAgICogY29uc3QgZGF0YVNvdXJjZXMgPSBhd2FpdCB3b3Jrc2hlZXQuZ2V0RGF0YVNvdXJjZXNBc3luYygpO1xuICAgKiBjb25zdCBkYXRhU291cmNlID0gZGF0YVNvdXJjZXMuZmluZChkYXRhc291cmNlID0+IGRhdGFzb3VyY2UubmFtZSA9PT0gXCJTYW1wbGUgLSBTdXBlcnN0b3JlXCIpO1xuICAgKiBjb25zdCBkYXRhVGFibGUgPSBhd2FpdCBkYXRhU291cmNlLmdldFVuZGVybHlpbmdEYXRhQXN5bmMoKTtcbiAgICogbGV0IGZpZWxkID0gZGF0YVRhYmxlLmNvbHVtbnMuZmluZChjb2x1bW4gPT4gY29sdW1uLmZpZWxkTmFtZSA9PT0gXCJTdWItQ2F0ZWdvcnlcIik7XG4gICAqIGxldCBsaXN0ID0gW107XG4gICAqIGZvciAobGV0IHJvdyBvZiBkYXRhVGFibGUuZGF0YSkge1xuICAgKiAgICAgbGlzdC5wdXNoKHJvd1tmaWVsZC5pbmRleF0udmFsdWUpO1xuICAgKiB9XG4gICAqIGxldCB2YWx1ZXMgPSBsaXN0LmZpbHRlcigoZWwsIGksIGFycikgPT4gYXJyLmluZGV4T2YoZWwpID09PSBpKTtcbiAgICogY29uc29sZS5sb2codmFsdWVzKTtcbiAgICpcbiAgICogYGBgXG4gICAqIEBkZXByZWNhdGVkIFVzZSBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luYyBvciBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYy5cbiAgICovXG4gIGdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9ucz86IERhdGFTb3VyY2VVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPERhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqXG4gICAqIEdldHMgdGhlIHVuZGVybHlpbmcgbG9naWNhbCB0YWJsZXMgdXNlZCBpbiB0aGUgZGF0YSBzb3VyY2UuXG4gICAqXG4gICAqIEBzaW5jZSAxLjQuMFxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBsb2dpY2FsIHRhYmxlcyB0aGF0IGFyZSBjdXJyZW50bHkgdXNlZCBpbiB0aGUgZGF0YSBzb3VyY2UuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSB1c2VzIHRoZSBgZ2V0TG9naWNhbFRhYmxlc0FzeW5jYCBtZXRob2QgdG8gcHJpbnQgdGhlIG5hbWVzIG9mIHRoZVxuICAgKiB0aGUgbG9naWNhbCB0YWJsZXMgdG8gdGhlIGNvbnNvbGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBkYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYygpLnRoZW4oZnVuY3Rpb24gKGxvZ2ljYWxUYWJsZXMpIHtcbiAgICogICAvLyBMb29wIHRocm91Z2ggZWFjaCB0YWJsZSB0aGF0IHdhcyB1c2VkIGluIGNyZWF0aW5nIHRoaXMgZGF0YSBzb3VyY2VcbiAgICogICBsb2dpY2FsVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKHRhYmxlKSB7XG4gICAqICAgICAgY29uc29sZS5sb2codGFibGUuY2FwdGlvbik7XG4gICAqICAgfSk7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGdldExvZ2ljYWxUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PExvZ2ljYWxUYWJsZT4+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1bmRlcmx5aW5nIGRhdGEgdGFibGUgZm9yIHRoZSBnaXZlbiBsb2dpY2FsIHRhYmxlIGlkLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAgQ29sbGVjdGlvbiBvZiBvcHRpb25zIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGNhbGwuXG4gICAqIEByZXR1cm5zIEEgZGF0YSB0YWJsZSBjb250YWluaW5nIHRoZSB1bmRlcmx5aW5nIGRhdGEgb2YgdGhlIGRhdGEgc291cmNlLlxuICAgKiBAc2VlIGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luYyB0byByZWFkIG1vcmUgdGhhbiAxMCwwMDAgcm93cy5cbiAgICpcbiAgICogWW91IGNhbiB1c2UgdGhlIGBnZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMubWF4Um93c2AgcHJvcGVydHkgdG8gcmVxdWVzdCB0aGUgbnVtYmVyIG9mIHJvd3Mgb2YgZGF0YSB0byByZXR1cm4uXG4gICAqIElmIHVuc3BlY2lmaWVkIChtYXhSb3dzID09ICcwJyksIHRoZSBjYWxsIHRvIGBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmNgIHJlcXVlc3RzIGFsbCByb3dzIGluIHRoZSBsb2dpY2FsIHRhYmxlLlxuICAgKiBOb3RlIHRoYXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWQgZnJvbSB0aGUgYGdldExvZ2ljYWxUYWJsZURhdGFBc3luYygpYCBtZXRob2QgaXMgbGltaXRlZFxuICAgKiB0byAxMCwwMDAgcm93cy4gWW91IGNhbiB1c2UgdGhlIGBEYXRhVGFibGVgIHByb3BlcnR5LCBgaXNUb3RhbFJvd0NvdW50TGltaXRlZGAsIHRvIHRlc3Qgd2hldGhlciB0aGVyZSBpc1xuICAgKiBtb3JlIGRhdGEuIEEgdmFsdWUgb2YgdHJ1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbGluZyBmdW5jdGlvbiByZXF1ZXN0ZWQgbW9yZSByb3dzIHRoYW4gdGhlIGxpbWl0ICgxMCwwMDApIGFuZCB0aGVcbiAgICogdW5kZXJseWluZyBkYXRhIHNvdXJjZSBjb250YWlucyBtb3JlIHJvd3MgdGhhbiBjYW4gYmUgcmV0dXJuZWQuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB1c2Ugb2YgdGhlIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYygpIG1ldGhvZCB0byBnZXQgdGhlIGRhdGEgZnJvbSBhIHNwZWNpZmljIGxvZ2ljYWwgdGFibGUgaW4gYSBkYXRhIHNvdXJjZS5cbiAgICogVGhlIGV4YW1wbGUgdXNlcyB0aGUgSmF2YVNjcmlwdCBmaW5kKCkgbWV0aG9kIHRvIHNlbGVjdCB0aGUgd29ya2Jvb2ssIGFuZCB1c2VzIHRoZSBnZXRMb2dpY2FsVGFibGVzQXN5bmMgbWV0aG9kIHRvIGlkZW50aWZ5IHRoZSBsb2dpY2FsIHRhYmxlIGlkLlxuICAgKiBgYGBcbiAgICogY29uc3QgZGF0YVNvdXJjZXMgPSBhd2FpdCB3b3Jrc2hlZXQuZ2V0RGF0YVNvdXJjZXNBc3luYygpO1xuICAgKiBjb25zdCBkYXRhU291cmNlID0gZGF0YVNvdXJjZXMuZmluZChkYXRhc291cmNlID0+IGRhdGFzb3VyY2UubmFtZSA9PT0gXCJTYW1wbGUgLSBTdXBlcnN0b3JlXCIpO1xuICAgKiBjb25zdCBsb2dpY2FsVGFibGVzID0gYXdhaXQgZGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVzQXN5bmMoKVxuICAgKiBjb25zdCBkYXRhVGFibGUgPSBhd2FpdCBkYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVzWzBdLmlkKTtcbiAgICogY29uc29sZS5sb2coZGF0YVRhYmxlKTtcbiAgICogYGBgXG4gICAqL1xuXG4gIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8RGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgdW5kZXJseWluZyBkYXRhIHRhYmxlIHJlYWRlciBmb3IgdGhlIGdpdmVuIGxvZ2ljYWwgdGFibGUgaWQuXG4gICAqIE9ubHkgb25lIGFjdGl2ZSBEYXRhVGFibGVSZWFkZXIgcGVyIGxvZ2ljYWwgdGFibGUgaWQgaXMgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBAcGFyYW0gbG9naWNhbFRhYmxlSWQgbG9naWNhbCB0YWJsZSBpZC5cbiAgICogQHBhcmFtIHBhZ2VSb3dDb3VudCBUaGUgbnVtYmVyIG9mIHJvd3MgcGVyIHBhZ2UuIFRoZSBkZWZhdWx0IGFuZCBtYXhpbXVtIGlzIDEwLDAwMCByb3dzLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAgQ29sbGVjdGlvbiBvZiBvcHRpb25zIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHJlYWRlci5cbiAgICogQHJldHVybnMgICAgICAgIEEgZGF0YSB0YWJsZSByZWFkZXIgdG8gYWNjZXNzIHRoZSBsb2dpY2FsIHRhYmxlIGRhdGEgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgKiBAaGlkZGVuXG4gICAqIGBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmNgIGF0dGVtcHRzIHRvIHByZXBhcmUgYWxsIHRoZSByb3dzIG9mIHRoZSB0YWJsZSB0byBiZSByZWFkIGFzIHBhZ2VzLlxuICAgKiBUaGVyZSBpcyBhIGxpbWl0IHRvIHRoZSBudW1iZXIgb2Ygcm93cyB0aGF0IGNhbiBiZSBwcmVwYXJlZC4gVGhlIGRlZmF1bHQgbGltaXQgaXMgYWJvdXQgMSBtaWxsaW9uXG4gICAqIHJvd3Mgb2YgZGF0YS4gSG93ZXZlciwgaWYgdGhlIGRhdGEgc291cmNlIGhhcyBtYW55IGNvbHVtbnMsIHRoaXMgbnVtYmVyIHdpbGwgYmUgYWRqdXN0ZWQgZG93bndhcmQuXG4gICAqIFlvdSBjYW4gY2hhbmdlIHRoZSBkZWZhdWx0IGxpbWl0IHdpdGggdGhlIFRhYmxlYXUgU2VydmVyIChDbG91ZCkgb3IgVGFibGVhdSBEZXNrdG9wIG9wdGlvbjogRXh0ZW5zaW9uc0FuZEVtYmVkZGluZ1JlYWRlckNlbGxMaW1pdC5cbiAgICogSWYgdGhlIGRhdGEgc291cmNlIGhhcyBtYW55IGNvbHVtbnMsIGBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmNgIGNhbiBiZSBzcGVkIHVwIGJ5IG9ubHkgcmVxdWVzdGluZ1xuICAgKiBuYXRpdmUgZGF0YSB2YWx1ZXMgaW4gdGhlIGBEYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zYC5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHVzZSBvZiB0aGUgYGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luY2AgYW5kIGBnZXRBbGxQYWdlc0FzeW5jYCB0b1xuICAgKiBwcmVwYXJlIHBhZ2VzIG9mIDEwLDAwMCByb3dzIGVhY2gsIGFuZCB0aGVuIHRvIGdldCBhIG1heGltdW0gb2YgMTUwLDAwMCByb3dzIG9mIG5hdGl2ZSBkYXRhIGZyb21cbiAgICogYSBzcGVjaWZpYyBsb2dpY2FsIHRhYmxlIGluIGEgZGF0YSBzb3VyY2UuXG4gICAqXG4gICAqIGBgYFxuICAgKiBjb25zdCBkYXRhU291cmNlcyA9IGF3YWl0IHdvcmtzaGVldC5nZXREYXRhU291cmNlc0FzeW5jKCk7XG4gICAqIGNvbnN0IGRhdGFTb3VyY2UgPSBkYXRhU291cmNlcy5maW5kKGRhdGFzb3VyY2UgPT4gZGF0YXNvdXJjZS5uYW1lID09PSBcIlNhbXBsZSAtIFN1cGVyc3RvcmVcIik7XG4gICAqIGNvbnN0IGxvZ2ljYWxUYWJsZXMgPSBhd2FpdCBkYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYygpXG4gICAqIGNvbnN0IGRhdGFUYWJsZVJlYWRlciA9IGF3YWl0IGRhdGFTb3VyY2UuZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKGxvZ2ljYWxUYWJsZXNbMF0uaWQsIDEwMDAwLFxuICAgKiAgICAgeyBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogdGFibGVhdS5JbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5Pbmx5TmF0aXZlVmFsdWVzIH0pO1xuICAgKiBjb25zdCBkYXRhVGFibGUgPSBhd2FpdCBkYXRhVGFibGVSZWFkZXIuZ2V0QWxsUGFnZXNBc3luYygxNTAwMDApO1xuICAgKiBjb25zb2xlLmxvZyhkYXRhVGFibGUpO1xuICAgKiBhd2FpdCBkYXRhVGFibGVSZWFkZXIucmVsZWFzZUFzeW5jKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBEYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPERhdGFUYWJsZVJlYWRlcj47XG59XG5cbi8qKlxuICogQmFzaWMgcHJvcGVydGllcyBvZiBhIGZpZWxkXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRCYXNlIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zICBUaGUgbmFtZSBvZiB0aGUgZmllbGQgKGkuZS4gdGhlIGNhcHRpb24pLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVXNlciBkZXNjcmlwdGlvbiBvZiBmaWVsZCwgdW5kZWZpbmVkIGlmIHRoZXJlIGlzIG5vbmUuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgZGF0YSB0eXBlIG9mIHRoZSBmaWVsZFxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YVR5cGU6IERhdGFUeXBlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIHJvbGUgb2YgdGhpcyBmaWVsZC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU6IEZpZWxkUm9sZVR5cGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUaGUgdHlwZSBvZiBhZ2dyZWdhdGlvbiBmb3IgdGhpcyBmaWVsZC5cbiAgICovXG4gIHJlYWRvbmx5IGFnZ3JlZ2F0aW9uOiBGaWVsZEFnZ3JlZ2F0aW9uVHlwZTtcblxuICAvKipcbiAgICogQHJldHVybnMgIFRoZSB0eXBlIG9mIHRoZSBjb2x1bW4sIGVpdGhlciBkaXNjcmV0ZSBvciBjb250aW51b3VzLiBDb3VsZCBob2xkIHZhbHVlICdVbmtub3duJy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbHVtblR5cGU6IENvbHVtblR5cGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUcnVlIGlmIHRoaXMgZmllbGQgaXMgYSB0YWJsZSBjYWxjdWxhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ2FsY3VsYXRlZEZpZWxkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVHJ1ZSBpZiB0aGlzIGZpZWxkIGlzIGEgY29tYmluYXRpb24gb2YgbXVsdGlwbGUgZmllbGRzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICByZWFkb25seSBpc0NvbWJpbmVkRmllbGQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUcnVlIGlmIHRoaXMgZmllbGQgaXMgZ2VuZXJhdGVkIGJ5IFRhYmxlYXUsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogICAgICAgICAgIFRhYmxlYXUgZ2VuZXJhdGVzIGEgbnVtYmVyIG9mIGZpZWxkcyBmb3IgYSBkYXRhIHNvdXJjZSwgc3VjaCBhcyBOdW1iZXJcbiAgICogICAgICAgICAgIG9mIFJlY29yZHMsIG9yIE1lYXN1cmUgVmFsdWVzLiAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0b1xuICAgKiAgICAgICAgICAgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aG9zZSBmaWVsZHMgYW5kIGZpZWxkcyB0aGF0IGNvbWUgZnJvbSB0aGUgdW5kZXJseWluZ1xuICAgKiAgICAgICAgICAgZGF0YSBjb25uZWN0aW9uLCBvciB3ZXJlIGNyZWF0ZWQgYnkgYSB1c2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNHZW5lcmF0ZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhpcyByb2xlIGhhcyBhIHNlbWFudGljIHR5cGUgb2YgZ2Vvc3BhdGlhbDogZS5nIGxhdGl0dWRlLCBsb25naXR1ZGUsIHppcGNvZGUsIENpdHkgbmFtZS4uLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNHZW9zcGF0aWFsOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVHJ1ZSBpZiB0aGlzIGZpZWxkIGlzIGhpZGRlbiwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNIaWRkZW46IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUcnVlIGlmIHRoaXMgZmllbGQgY29tZXMgZnJvbSB0aGUgcHVibGlzaGVkIGRhdGFzb3VyY2UuIEZhbHNlIGlmIGl0IHdhcyBjcmVhdGVkIGluIFRhYmxlYXUgKGFzIGEgY2FsY3VsYXRlZCBmaWVsZCwgZm9yIGV4YW1wbGUpLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VtYW50aWMgcm9sZSBvZiB0aGUgZmllbGQuXG4gICAqIENhbiBiZSBlaXRoZXIgYSBnZW9ncmFwaGljIHJvbGUgKGUuZy4gbGF0aXR1ZGUsIGxvbmdpdHVkZSwgY2l0eSwgY291bnRyeSwgZXRjLi4uKSBvciBhbiBpbWFnZSByb2xlXG4gICAqIEBzaW5jZSAxLjE2LjBcbiAgICovXG4gIHNlbWFudGljUm9sZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGF0YSBmb3JtYXR0aW5nIG9wdGlvbnMgZm9yIHRoZSBmaWVsZC5cbiAgICogQHNpbmNlIDEuMTYuMFxuICAgKi9cbiAgZGF0YUZvcm1hdD86IERhdGFGb3JtYXQ7XG59XG5cbi8qKlxuICogQSBmaWVsZCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGRhdGEgc291cmNlIGl0IGJlbG9uZ3MgdG8sXG4gKiBpdHMgcm9sZSwgYW5kIHRoZSBhYmlsaXR5IHRvIGZldGNoIHRoZSBkb21haW4gdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkIGV4dGVuZHMgRmllbGRCYXNlIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zICBVbmlxdWUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIGZpZWxkIGluIHRoaXMgZGF0YXNvdXJjZS5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUaGUgZGF0YSBzb3VyY2UgdG8gd2hpY2ggdGhpcyBmaWVsZCBiZWxvbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YVNvdXJjZTogRGF0YVNvdXJjZTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY29ubmVjdGlvbiB3aXRoaW4gYSBkYXRhc291cmNlIChleDogQSBTUUwgU2VydmVyIGNvbm5lY3Rpb24pLlxuICogQSBkYXRhIHNvdXJjZSBjYW4gYmUgY29tcG9zZWQgb2Ygb25lIG9yIG1vcmUgY29ubmVjdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvblN1bW1hcnkge1xuICAvKipcbiAgICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gKGkuZS4gdGhlIGNhcHRpb24pLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBVbmlxdWUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIGNvbm5lY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgdHlwZSBvZiB0aGUgY29ubmVjdGlvbiAoaS5lLiBTUUwgU2VydmVyLCB3ZWIgZGF0YSBjb25uZWN0b3IpLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgVVJJIHRvIHdoaWNoIHRoZSBjb25uZWN0aW9uIGlzIHBvaW50aW5nLCBpZiBhcHBsaWNhYmxlLlxuICAgKiAgICAgICAgICBJZiBhIGRhdGEgc291cmNlIGlzIGEgcHVibGlzaGVkIGRhdGEgc291cmNlLCB0aGUgVVJJIGlzIHJldHVybmVkXG4gICAqICAgICAgICAgIGFzIGBsb2NhbGhvc3RgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmVyVVJJOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHRhYmxlIG9mIGRhdGEgaW4gYSBkYXRhIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZVN1bW1hcnkge1xuICAvKipcbiAgICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIHRhYmxlIChpLmUuIHRoZSBjYXB0aW9uKS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgVW5pcXVlIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcyB0YWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRoZSBJRCBvZiB0aGUgY29ubmVjdGlvbiB0aGF0IHRoaXMgdGFibGUgYmVsb25ncyB0by5cbiAgICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0aGUgY3VzdG9tIFNRTCB1c2VkIHRvIGNyZWF0ZSB0aGlzIHRhYmxlIGlmIGl0IHdhcyBjcmVhdGVkIHdpdGggQ3VzdG9tIFNRTCwgdW5kZWZpbmVkIG90aGVyd2lzZS5cbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVNRTDogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqXG4gKiBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgZmV0Y2hpbmcgZGF0YSBmcm9tIGFuIGRhdGEgc291cmNlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zIHtcbiAgLyoqXG4gICAqIERvIG5vdCB1c2UgYWxpYXNlcyBzcGVjaWZpZWQgaW4gdGhlIGRhdGEgc291cmNlIGluIFRhYmxlYXUuIERlZmF1bHQgaXMgZmFsc2UuXG4gICAqL1xuICBpZ25vcmVBbGlhc2VzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGNvbHVtbnMgdG8gcmV0dXJuIHNwZWNpZmllZCBieSBmaWVsZCBuYW1lLCByZXR1cm5zIGFsbCBieSBkZWZhdWx0LlxuICAgKi9cbiAgY29sdW1uc1RvSW5jbHVkZT86IEFycmF5PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW5zIHRvIHJldHVybiBzcGVjaWZpZWQgYnkgZmllbGQgaWQsIHJldHVybnMgYWxsIGJ5IGRlZmF1bHQuXG4gICAqIFNpbmNlIDEuNS4wLCBmaWVsZElkIGlzIGEgcHJvcGVydHkgb2YgdGhlIENvbHVtbiBvYmplY3QuXG4gICAqXG4gICAqIEBzaW5jZSAxLjUuMFxuICAgKi9cbiAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ/OiBBcnJheTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXR1cm4uIDEwLDAwMCBieSBkZWZhdWx0XG4gICAqIEBzaW5jZSAxLjEwLjAgYW5kIFRhYmxlYXUgMjAyMi40IENvbnNpZGVyIHVzaW5nIGEgRGF0YVRhYmxlUmVhZGVyIHJldHVybmVkIGJ5IG9uZSBvZiB0aGUgZ2V0Li4uRGF0YVJlYWRlckFzeW5jIG1ldGhvZHNcbiAgICogdG8gYXZvaWQgdGhlIDEwLDAwMCByb3cgbGltaXQuXG4gICAqL1xuICBtYXhSb3dzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoaWNoIHByb3BlcnRpZXMgdG8gcmV0dXJuIGluIERhdGFWYWx1ZXMuIFRoZSBkZWZhdWx0IGlzIGBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXNgLlxuICAgKiBBbGwgcHJvcGVydGllcyBub3QgcmVxdWVzdGVkIHdpbGwgYmUgYHVuZGVmaW5lZGAgaW4gdGhlIERhdGFWYWx1ZSByZXN1bHRzLlxuICAgKiBUaGlzIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIG9ubHksIGFuZCB3aWxsIGJlIGlnbm9yZWQgaW4gVGFibGVhdSB2ZXJzaW9ucyBwcmlvciB0byAyMDIxLjIuXG4gICAqXG4gICAqIEBzaW5jZSAxLjUuMFxuICAgKi9cbiAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24/OiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbjtcbn1cblxuLyoqXG4gKiBAc2luY2UgMS40LjBcbiAqIFJlcHJlc2VudHMgYSBsb2dpY2FsIHRhYmxlIGluIGEgZGF0YSBzb3VyY2Ugb3IgYSBsb2dpY2FsIHRhYmxlIHVzZWQgaW4gYSB3b3Jrc2hlZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dpY2FsVGFibGUge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IGNhcHRpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBAc2luY2UgMS4xNi4wXG4gKiBGb3JtYXR0aW5nIG9wdGlvbnMgZm9yIGEgbnVtYmVyIG9yIGRhdGUgY29sdW1uXG4gKi9cbmV4cG9ydCB0eXBlIERhdGFGb3JtYXQgPSB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBmb3JtYXR0aW5nIG9wdGlvbnMgZm9yIGVhY2ggbWFyay5cbiAgICovXG4gIGRlZmF1bHRPcHRpb25zOiBEYXRhRm9ybWF0dGluZ09wdGlvbnM7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgc3VidG90YWxzIGZvcm1hdHRpbmcgb3B0aW9ucyBmb3IgYSBncm91cCBvZiBtYXJrcy5cbiAgICovXG4gIHN1YnRvdGFsc09wdGlvbnM/OiBEYXRhRm9ybWF0dGluZ09wdGlvbnM7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgdG90YWxzIGZvcm1hdHRpbmcgb3B0aW9ucyBmb3IgYWxsIG1hcmtzLlxuICAgKi9cbiAgdG90YWxzT3B0aW9ucz86IERhdGFGb3JtYXR0aW5nT3B0aW9ucztcbiAgLyoqXG4gICAqIEByZXR1cm5zIEZvcm1hdHRpbmcgb3ByaW9ucyBmb3IgdGhlIGZpZWxkJ3MgYXhpcy5cbiAgICovXG4gIGF4aXNPcHRpb25zPzogRGF0YUZvcm1hdHRpbmdPcHRpb25zO1xufTtcblxuLyoqXG4gKiBAc2luY2UgMS4xNi4wXG4gKiBGb3JtYXR0aW5nIG9wdGlvbnMgZm9yIGEgbnVtYmVyIG9yIGRhdGUgY29sdW1uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUZvcm1hdHRpbmdPcHRpb25zIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSB0eXBlIG9mIHRoZSBmb3JtYXQuXG4gICAqIENhbiBzcGVjaWZ5IG51bWJlciwgY3VycmVuY3ksIGRhdGUsIHRpbWUsIHBlcmNlbnRhZ2UsIHNjaWVudGlmaWMsIG9yIGF1dG8tZm9ybWF0IChkZWZhdWx0KS5cbiAgICogRm9yIG51bWJlcnMsIGNhbiBhbHNvIHNwZWNpZnkgY3VzdG9tIG51bWJlciBmb3JtYXQuXG4gICAqL1xuICBmb3JtYXRUeXBlOiBEYXRhRm9ybWF0VHlwZTtcbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBsb2NhbGUgb2YgdGhlIGZvcm1hdCAoZS5nLiBlbi1VUywgZnItRlIsIGV0Yy4pLlxuICAgKi9cbiAgbG9jYWxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGRpZ2l0cyB0byBkaXNwbGF5IGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LlxuICAgKi9cbiAgZGVjaW1hbHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBjaGFyYWN0ZXIgdG8gdXNlIGFzIHRoZSBkZWNpbWFsIHBvaW50LlxuICAgKi9cbiAgZGVjaW1hbENoYXJhY3Rlcjogc3RyaW5nO1xuICAvKipcbiAgICogQHJldHVybnMgV2hldGhlciB0byBzaG93IHRob3VzYW5kIHNlcGFyYXRvcnMuXG4gICAqL1xuICBzaG93U2VwYXJhdG9yczogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBjaGFyYWN0ZXIgdG8gdXNlIGFzIHRoZSB0aG91c2FuZCBzZXBhcmF0b3IuXG4gICAqL1xuICBzZXBhcmF0b3JDaGFyYWN0ZXI6IHN0cmluZztcbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBwcmVmaXggdG8gZGlzcGxheSBiZWZvcmUgdGhlIHZhbHVlLlxuICAgKi9cbiAgcHJlZml4OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgc3VmZml4IHRvIGRpc3BsYXkgYWZ0ZXIgdGhlIHZhbHVlLlxuICAgKi9cbiAgc3VmZml4OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBEaXNwbGF5IHRoZSBudW1iZXIgdXNpbmcgc3BlY2lmaWVkIHVuaXRzIChlLmcuIGBLYCBmb3IgdGhvdXNhbmRzLCBgTWAgZm9yIG1pbGxpb25zLCBgQmAgZm9yIGJpbGxpb25zLCBldGMuKS5cbiAgICovXG4gIHVuaXRzOiBOdW1iZXJGb3JtYXRVbml0cztcbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBmb3JtYXQgZm9yIGRpc3BsYXlpbmcgLlxuICAgKi9cbiAgbmVnYXRpdmVGb3JtYXQ6IE5lZ2F0aXZlTnVtYmVyRm9ybWF0O1xuICAvKipcbiAgICogQHJldHVybnMgVGhlIGN1c3RvbSBmb3JtYXQgc3RyaW5nIHRvIGRpc3BsYXkgZm9yIHRoZSB2YWx1ZS5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gbnVtYmVyIGZvcm1hdHMsIHNlZSBbRm9ybWF0IE51bWJlcnMgYW5kIE51bGwgVmFsdWVzXShodHRwczovL2hlbHAudGFibGVhdS5jb20vY3VycmVudC9wcm8vZGVza3RvcC9lbi11cy9mb3JtYXR0aW5nX3NwZWNpZmljX251bWJlcnMuaHRtKS5cbiAgICogV2hlbiB0aGUgY3VzdG9tIGZvcm1hdCBzdHJpbmcgaXMgdXNlZCBmb3IgbnVtYmVycywgb3RoZXIgZm9ybWF0dGluZyBvcHRpb25zIGFyZSBpZ25vcmVkLlxuICAgKiBGb3IgaW5mb3JtYXRpb24gb24gZm9ybWF0dGluZyBkYXRlcywgc2VlIFtDdXN0b20gRGF0ZSBGb3JtYXRzXShodHRwczovL2hlbHAudGFibGVhdS5jb20vY3VycmVudC9wcm8vZGVza3RvcC9lbi11cy9kYXRlc19jdXN0b21fZGF0ZV9mb3JtYXRzLmh0bSkuXG4gICAqIFRoZSBjdXN0b20gZm9ybWF0IHN0cmluZyBpcyBhbHdheXMgdXNlZCBmb3IgZGF0ZXMgYW5kIHRoZSBvdGhlciBmb3JtYXR0aW5nIG9wdGlvbnMgZG8gbm90IGFwcGx5IChleGNlcHQgZm9yIHRoZSBgZm9ybWF0VHlwZWAgYW5kIGBsb2NhbGVgKS5cbiAgICovXG4gIGN1c3RvbUZvcm1hdFN0cmluZzogc3RyaW5nO1xufVxuIiwiaW1wb3J0IHsgRGF0YVR5cGUsIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIH0gZnJvbSAnLi9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuaW1wb3J0IHsgTWFya0luZm8gfSBmcm9tICcuL1NlbGVjdGlvbkludGVyZmFjZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbiB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBjb2x1bW4uIEluIHN1bW1hcnkgZGF0YSwgdGhpcyBpbmNsdWRlcyB0aGUgYWdncmVnYXRpb24uXG4gICAqIFRoZSBzdW1tYXJ5IGRhdGEgZmllbGQgbmFtZSBpcyBub3Qgc3RhYmxlIGFjcm9zcyBsYW5ndWFnZXMuXG4gICAqIEZvciBleGFtcGxlLCBpbiBhbiBFbmdsaXNoIHZlcnNpb24gb2YgVGFibGVhdSwgdGhlIGZpZWxkIG5hbWUgbWlnaHQgYmUgU1VNKFNhbGVzKS4gSW4gRnJlbmNoLCB0aGlzIHdvdWxkIGJlIFNPTU1FKFNhbGVzKS5cbiAgICovXG4gIHJlYWRvbmx5IGZpZWxkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIGZpZWxkSWQgb2YgdGhlIGZpZWxkIGluIHRoZSBjb2x1bW4uIEluIHN1bW1hcnkgZGF0YSwgdGhpcyBpbmNsdWRlcyB0aGUgYWdncmVnYXRpb24uXG4gICAqIFRoZSBmaWVsZElkIGlzIG5vdCBzdGFibGUgYWNyb3NzIHJlcGxhY2luZyBkYXRhIHNvdXJjZXMuXG4gICAqIEZvciBleGFtcGxlIGFmdGVyIHJlcGxhY2luZyB0aGUgZGF0YSBzb3VyY2UgW0NsaXBib2FyZF8yMDIxMDMwNVQxNjQwMDBdLltzdW06U2FsZXM6cWtdIGNvdWxkIGJlY29tZVxuICAgKiBbZmVkZXJhdGVkLjEydXN1b3ExMTcxbzFiMWViZHloNjBmam5ldjFdLltzdW06U2FsZXM6cWtdLlxuICAgKlxuICAgKiBAc2luY2UgMS41LjBcbiAgICovXG4gIHJlYWRvbmx5IGZpZWxkSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgVGhlIGRhdGEgdHlwZSBvZiB0aGUgY29sdW1uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlXG4gICAqICAgICAgICAgICBmbG9hdCwgaW50ZWdlciwgc3RyaW5nLCBib29sZWFuLCBkYXRlLCBkYXRldGltZSBhbmQgc3BhdGlhbFxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YVR5cGU6IERhdGFUeXBlO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgV2hldGhlciB0aGUgY29sdW1uIGRhdGEgaXMgcmVmZXJlbmNlZCBpbiB0aGUgdmlzdWFsaXphdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGlzUmVmZXJlbmNlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHJldHVybnMgIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICovXG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVRhYmxlIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zICBFaXRoZXIgXCJVbmRlcmx5aW5nIERhdGEgVGFibGVcIiBvciBcIlN1bW1hcnkgRGF0YSBUYWJsZVwiLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgQSB0d28tZGltZW5zaW9uYWwgYXJyYXkgb2YgZGF0YSB3aXRob3V0IHRoZSBzaGVldCBvciBjb2x1bW5cbiAgICogICAgICAgICAgIG1ldGFkYXRhLiBUaGUgZmlyc3QgYXJyYXkgaW5kZXggaXMgdGhlIHJvdyBpbmRleCBhbmQgdGhlIHNlY29uZFxuICAgKiAgICAgICAgICAgYXJyYXkgaW5kZXggaXMgdGhlIGNvbHVtbiBpbmRleC5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE6IEFycmF5PEFycmF5PERhdGFWYWx1ZT4+O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgQW4gYXJyYXkgb2YgaW5mb3JtYXRpb24gYWJvdXQgbWFya3MuICBFYWNoIG1hcmsgaW4gdGhlIGFycmF5IGNvcnJlc3BvbmRzXG4gICAqICAgICAgICAgICB0byBhIHJvdyBpbiB0aGUgZGF0YSBvZiB0aGlzIERhdGFUYWJsZS4gTWFya0luZm8gaXMgY3VycmVudGx5IG9ubHkgcGFydGlhbGx5XG4gICAqICAgICAgICAgICBhdmFpbGFibGUgd2l0aGluIHJlc3VsdHMgZnJvbSBnZXRTZWxlY3RlZE1hcmtzQXN5bmMgLyBnZXRNYXJrc0FzeW5jLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFya3NJbmZvPzogQXJyYXk8TWFya0luZm8+O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIGNvbHVtbiBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHRoZSBuYW1lLCBkYXRhIHR5cGUsIGFuZCBpbmRleC4uXG4gICAqL1xuICByZWFkb25seSBjb2x1bW5zOiBBcnJheTxDb2x1bW4+O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSByZXR1cm5lZCBkYXRhLlxuICAgKi9cbiAgcmVhZG9ubHkgdG90YWxSb3dDb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSByb3dzIHJldHVybmVkIGhhdmUgYmVlbiBsaW1pdGVkIHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWV2YWJsZSByb3dzLlxuICAgKiAgICAgICAgICBBIHZhbHVlIG9mIHRydWUgaW5kaWNhdGVzIHRoYXQgdGhlIGNhbGxlciByZXF1ZXN0ZWQgbW9yZSByb3dzIHRoYW4gdGhlIGxpbWl0XG4gICAqICAgICAgICAgIGFuZCB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZSBjb250YWlucyBtb3JlIHJvd3MgdGhhbiBjYW4gYmUgcmV0dXJuZWQuXG4gICAqICAgICAgICAgIGlzVG90YWxSb3dDb3VudExpbWl0ZWQgY2FuIGJlIHRydWUgaW4gdGhlIGNhc2Ugb2YgLi4uXG4gICAqICAgICAgICAgIGBnZXRBbGxQYWdlc0FzeW5jYCB3aXRoIG1vcmUgdGhhbiA0LDAwMCwwMDAgcm93cyBpbiB0aGUgc3VtbWFyeSBvciB1bmRlcmx5aW5nIGRhdGEuXG4gICAqICAgICAgICAgIGBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmNgIG9yIGBnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmNgIHdpdGggbW9yZSB0aGFuIDEwLDAwMCByb3dzIGluIHRoZSBkYXRhLlxuICAgKiAgICAgICAgICBJbiBhbGwgdGhlc2UgY2FzZXMsIGxpbWl0cyBjYW4gYmUgYXZvaWRlZCBieSBwcm9jZXNzaW5nIHRoZSBkYXRhIGluIHBhZ2Ugc2l6ZWQgY2h1bmtzIHdpdGggYERhdGFUYWJsZVJlYWRlcmAuXG4gICAqICAgICAgICAgIGlzVG90YWxSb3dDb3VudExpbWl0ZWQgaXMgYWx3YXlzIGZhbHNlIGluIHRoZSByZXN1bHRzIG9mIERhdGFUYWJsZVJlYWRlci5nZXRQYWdlQXN5bmMoKS5cbiAgICovXG4gIHJlYWRvbmx5IGlzVG90YWxSb3dDb3VudExpbWl0ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgV2hldGhlciB0aGUgZGF0YSBpcyBzdW1tYXJ5IGRhdGEgb3IgdW5kZXJseWluZyBkYXRhLlxuICAgKiAgICAgICAgICAgUmV0dXJucyB0cnVlIGZvciBzdW1tYXJ5IGRhdGEuXG4gICAqL1xuICByZWFkb25seSBpc1N1bW1hcnlEYXRhPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhVmFsdWUge1xuICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1hbnkgKi9cbiAgLyoqXG4gICAqIEBzaW5jZSAxLjIuMCBGaXhlcyB0aGUgdHlwZSB0byBiZSB0aGUgcmF3IG5hdGl2ZSB2YWx1ZSByYXRoZXIgdGhhbiBhIHN0cmluZy5cbiAgICogQHJldHVybnMgIENvbnRhaW5zIHRoZSByYXcgbmF0aXZlIHZhbHVlIGFzIGEgSmF2YVNjcmlwdCB0eXBlLCB3aGljaCBpc1xuICAgKiAgICAgICAgICAgb25lIG9mIHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBvciBEYXRlIChhcyBhIHN0cmluZykuIFBsZWFzZSBub3RlIHRoYXQgc3BlY2lhbFxuICAgKiAgICAgICAgICAgdmFsdWVzLCByZWdhcmRsZXNzIG9mIHR5cGUsIGFyZSBhbHdheXMgcmV0dXJuZWQgYXMgYSBTdHJpbmcgc3Vycm91bmRlZCBieVxuICAgKiAgICAgICAgICAgcGVyY2VudCBzaWducywgc3VjaCBhcyAnJW51bGwlJywgb3IgJyVuby1hY2Nlc3MlJy5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBhbnk7XG5cbiAgLyoqXG4gICAqIEBzaW5jZSAxLjQuMFxuICAgKiBAcmV0dXJucyBUaGUgcmF3IG5hdGl2ZSB2YWx1ZSBhcyBhIEphdmFTY3JpcHQgdHlwZSwgd2hpY2ggaXNcbiAgICogICAgICAgICAgb25lIG9mIHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBvciBEYXRlIG9iamVjdC4gUGxlYXNlIG5vdGUgdGhhdCBzcGVjaWFsXG4gICAqICAgICAgICAgIHZhbHVlcyBhcmUgcmV0dXJuZWQgYXMgbnVsbC4gVGhlIGFjdHVhbCBzcGVjaWFsIHZhbHVlIGNhbiBiZSBmb3VuZFxuICAgKiAgICAgICAgICBpbiBmb3JtYXR0ZWRWYWx1ZSwgd2hpY2ggd291bGQgYmUgc29tZXRoaW5nIGxpa2UgJ051bGwnLCBvciAnTm8tQWNjZXNzJy5cbiAgICogICAgICAgICAgVXNpbmcgbmF0aXZlVmFsdWUgY2FuIGdyZWF0bHkgc2ltcGxpZnkgeW91ciBlcnJvciBjaGVja2luZyBzaW5jZSBhbGwgdmFsdWVzXG4gICAqICAgICAgICAgIHdpbGwgYmUgdGhlaXIgbmF0aXZlIHR5cGUgdmFsdWUgb3IgbnVsbC5cbiAgICovXG4gIHJlYWRvbmx5IG5hdGl2ZVZhbHVlOiBhbnk7XG4gIC8qIHRzbGludDplbmFibGU6bm8tYW55ICovXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUaGUgdmFsdWUgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgbG9jYWxlIGFuZCB0aGVcbiAgICogICAgICAgICAgIGZvcm1hdHRpbmcgYXBwbGllZCB0byB0aGUgZmllbGQgb3IgcGFyYW1ldGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVkVmFsdWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBhbGlhcyBvZiBhIHZhbHVlIG9ubHkgaWYgYGhhc0FsaWFzYCBpcyB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXNWYWx1ZT86IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgSW5kaWNhdGVzIGlmIHRoZSBEYXRhVmFsdWUgY29udGFpbnMgYW4gYWxpYXMgKGZvciBEYXRhVmFsdWVzIG9mIFBhcmFtZXRlcnMgd2l0aCBkb21haW4gcmVzdHJpY3Rpb24gdHlwZVxuICAgKiAgICAgICAgICBgUGFyYW1ldGVyVmFsdWVUeXBlLkxpc3RgKS5cbiAgICovXG4gIHJlYWRvbmx5IGhhc0FsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGFyZ3VtZW50IGZvciB0aGUgV29ya3NoZWV0LkdldFN1bW1hcnlEYXRhQXN5bmMgQVBJXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0U3VtbWFyeURhdGFPcHRpb25zIHtcbiAgLyoqXG4gICAqIERvIG5vdCB1c2UgYWxpYXNlcyBzcGVjaWZpZWQgaW4gdGhlIGRhdGEgc291cmNlIGluIFRhYmxlYXUuIERlZmF1bHQgaXMgZmFsc2UuXG4gICAqL1xuICBpZ25vcmVBbGlhc2VzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT25seSByZXR1cm4gZGF0YSBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtYXJrcy4gRGVmYXVsdCBpcyBmYWxzZS5cbiAgICovXG4gIGlnbm9yZVNlbGVjdGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW5zIHRvIHJldHVybiBzcGVjaWZpZWQgYnkgZmllbGQgaWQsIHJldHVybnMgYWxsIGJ5IGRlZmF1bHQuXG4gICAqIFNpbmNlIDEuNS4wLCBmaWVsZElkIGlzIGEgcHJvcGVydHkgb2YgdGhlIENvbHVtbiBvYmplY3QuXG4gICAqXG4gICAqIEBzaW5jZSAxLjUuMFxuICAgKi9cbiAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ/OiBBcnJheTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHJvd3Mgb2YgZGF0YSB0aGF0IHlvdSB3YW50IHRvIHJldHVybi4gQSB2YWx1ZSBvZiBgMGAgd2lsbCBhdHRlbXB0IHRvIHJldHVybiBhbGwgcm93cy5cbiAgICogYDBgIGlzIHRoZSBkZWZhdWx0IGlmIG1heFJvd3MgaXMgbm90IHNwZWNpZmllZC5cbiAgICogYGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luY2AgLSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHJldHVybmVkIGlzIGNhcHBlZCBhdCAxMCwwMDAgcmVnYXJkbGVzcyBvZiBtYXhSb3dzLlxuICAgKiBgZ2V0U3VtbWFyeURhdGFBc3luY2AgLSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHJldHVybmVkIGlzIG5vdCBjYXBwZWQsIGJ1dCBwZXJmb3JtYW5jZSBtYXkgc3VmZmVyIHdpdGggbGFyZ2Ugcm93IGNvdW50cy5cbiAgICpcbiAgICogQHNpbmNlIDEuNS4wIG1heFJvd3MgaXMgbm93IHN1cHBvcnRlZCBpbiBib3RoIGBHZXRTdW1tYXJ5RGF0YU9wdGlvbnNgIGFuZCBgR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zYC5cbiAgICogQHNpbmNlIDEuMTAuMCBtYXhSb3dzIGlzIGlnbm9yZWQgd2hlbiBnZXR0aW5nIGEgRGF0YVRhYmxlUmVhZGVyXG4gICAqL1xuICBtYXhSb3dzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoaWNoIHByb3BlcnRpZXMgdG8gcmV0dXJuIGluIERhdGFWYWx1ZXMuIFRoZSBkZWZhdWx0IGlzIGBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXNgLlxuICAgKiBBbGwgcHJvcGVydGllcyBub3QgcmVxdWVzdGVkIHdpbGwgYmUgYHVuZGVmaW5lZGAgaW4gdGhlIERhdGFWYWx1ZSByZXN1bHRzLlxuICAgKiBUaGlzIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIG9ubHksIGFuZCB3aWxsIGJlIGlnbm9yZWQgaW4gVGFibGVhdSB2ZXJzaW9ucyBwcmlvciB0byAyMDIxLjIuXG4gICAqXG4gICAqIEBzaW5jZSAxLjUuMFxuICAgKi9cbiAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24/OiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gYXBwbHkgd29ya3NoZWV0IGxldmVsIGZvcm1hdHRpbmcgdG8gbnVtYmVycyBhbmQgZGF0ZXNcbiAgICogTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGdsb2JhbCBmaWVsZCBmb3JtYXR0aW5nIGRlZ2luZWQgaW4gdGhlIFNjaGVtYSBWaWV3ZXJcbiAgICpcbiAgICogQHNpbmNlIDEuMTMuMCBhbmQgVGFibGVhdSAyMDI1LjFcbiAgICovXG4gIGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBhcmd1bWVudCBmb3IgdGhlIFdvcmtzaGVldC5nZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMgQVBJLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyBleHRlbmRzIEdldFN1bW1hcnlEYXRhT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYWxsIHRoZSBjb2x1bW5zIGZvciB0aGUgZGF0YSBzb3VyY2UuIERlZmF1bHQgaXMgZmFsc2UuXG4gICAqL1xuICBpbmNsdWRlQWxsQ29sdW1ucz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBEYXRhVGFibGVSZWFkZXIgYWxsb3dzIGl0ZXJhdGlvbiBvdmVyIHN1bW1hcnkgb3IgdW5kZXJseWluZyBkYXRhIGJ5IHBhZ2VzLlxuICogVGhlIHBhZ2Ugc2l6ZSBpcyBlc3RhYmxpc2hlZCB3aGVuIHRoZSBEYXRhVGFibGVSZWFkZXIgaXMgY3JlYXRlZC5cbiAqIChTZWUgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jLCBnZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jLCBvciBnZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyQXN5bmMuKVxuICogVGhlIG5vcm1hbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIHdvdWxkIGJlIHRvXG4gKiAxLiBDcmVhdGUgdGhlIERhdGFUYWJsZVJlYWRlciBmb3IgdGhlIGRlc2lyZWQgRGF0YVRhYmxlLlxuICogMi4gVXNlIERhdGFUYWJsZVJlYWRlci50b3RhbFJvd0NvdW50IG9yIERhdGFUYWJsZVJlYWRlci5wYWdlQ291bnQgdG8gZGlzY292ZXIgaG93IG1hbnkgcm93cyBvciBwYWdlcyBhcmUgaW4gdGhlIGRlc2lyZWQgRGF0YVRhYmxlLlxuICogMy4gQ2FsbCBEYXRhVGFibGVSZWFkZXIuZ2V0UGFnZUFzeW5jKCkgdG8gZ2V0IHRoZSBwYWdlKHMpIGRlc2lyZWQuIEVhY2ggcGFnZSBpcyBhIERhdGFUYWJsZSBmb3IgdGhhdCBwYWdlLlxuICogICAgQWx0ZXJuYXRpdmVseSwgYmFzZWQgb24gdGhlIERhdGFUYWJsZVJlYWRlci50b3RhbFJvd0NvdW50LCBEYXRhVGFibGVSZWFkZXIuZ2V0QWxsUGFnZXNBc3luYyBjYW4gYmUgdXNlZCB0byBmZXRjaCB0aGUgZW50aXJlIERhdGFUYWJsZS5cbiAqIDQuIENhbGwgRGF0YVRhYmxlUmVhZGVyLnJlbGVhc2VBc3luYygpIHRvIGZyZWUgdXAgcmVzb3VyY2VzLlxuICpcbiAqIE5vdGVzIGZvciB1c2FnZSBvZiBhIERhdGFUYWJsZVJlYWRlcjpcbiAqIDEuIFNpbmNlIERhdGFUYWJsZVJlYWRlcnMgY29uc3VtZSBzZXJ2ZXIgcmVzb3VyY2VzLCBhbiBpbmFjdGl2ZSBEYXRhVGFibGVSZWFkZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5XG4gKiAgICByZWxlYXNlZCBhZnRlciA2MCBtaW51dGVzIG9mIGluYWN0aXZpdHkuIChBIG5ldyBEYXRhVGFibGVSZWFkZXIgY2FuIGJlIGNyZWF0ZWQgYXQgdGhhdCB0aW1lLCBpZiBuZWVkZWQuKVxuICogMi4gQ2FsbGluZyBnZXRQYWdlQXN5bmMoKSBhZnRlciBhbiBleHBsaWNpdCBvciBhdXRvbWF0aWMgcmVsZWFzZUFzeW5jKCkgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uXG4gKiAzLiBPbmx5IG9uZSBhY3RpdmUgRGF0YVRhYmxlUmVhZGVyIHBlciBsb2dpY2FsIHRhYmxlIGlkIGlzIHN1cHBvcnRlZC5cbiAqIDQuIFRoZXJlIGFyZSBzdGlsbCBsaW1pdHMgb24gdGhlIG51bWJlciBvZiByb3dzIHN1cHBvcnRlZCBmb3IgdW5kZXJseWluZyBhbmQgbG9naWNhbCBkYXRhIHRhYmxlIHJlYWRlcnMuXG4gKiAgICBUaGUgZGVmYXVsdCBsaW1pdCBpcyBhcHByb3hpbWF0ZWx5IDEgbWlsbGlvbiByb3dzIG9mIGRhdGEgZm9yIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyxcbiAqICAgIGFuZCBhcHByb3hpbWF0ZWx5IDMyIG1pbGxpb24gY2VsbHMgKHJvd3MgKiBjb2x1bW5zKSBmb3IgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jLlxuICogICAgQWRtaW5pc3RyYXRvcnMgbWF5IGNoYW5nZSB0aGVzZSBsaW1pdHMgdG8gYmV0dGVyIG1hdGNoIGNvbXB1dGluZyByZXNvdXJjZXMgd2l0aCB0aGUgVGFibGVhdSBTZXJ2ZXIgKENsb3VkKSBvciBUYWJsZWF1IERlc2t0b3Agb3B0aW9uczpcbiAqICAgIEV4dGVuc2lvbnNBbmRFbWJlZGRpbmdSZWFkZXJSb3dMaW1pdCBmb3IgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jIG9yXG4gKiAgICBFeHRlbnNpb25zQW5kRW1iZWRkaW5nUmVhZGVyQ2VsbExpbWl0IGZvciBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMuXG4gKlxuICogQHNpbmNlIDEuMTAuMCBhbmQgVGFibGVhdSAyMDIyLjRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhVGFibGVSZWFkZXIge1xuICAvKipcbiAgICogQHJldHVybnMgIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgZnVsbCBkYXRhIHRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgdG90YWxSb3dDb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgZnVsbCBkYXRhIHRhYmxlLiBUaGUgbGFzdCBwYWdlIGNvdWxkIGJlIGEgcGFydGlhbCBwYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFnZUNvdW50OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdldCBhIHBhZ2Ugb2YgZGF0YS4gVGhlIHBhZ2UgaXMgcmV0dXJuZWQgYXMgYSBEYXRhVGFibGUuXG4gICAqIENhbGxzIHRvIGdldFBhZ2VBc3luYygpIGFmdGVyIHJlbGVhc2VBc3luYygpIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFnZU51bWJlciAgVGhlIHBhZ2UgbnVtYmVyICh6ZXJvLWluZGV4ZWQpIHRvIGZldGNoLiBUaGUgcGFnZSBudW1iZXIgc2hvdWxkIGJlIHRyZWF0ZWRcbiAgICogICAgICAgICAgICAgICAgICAgIGxpa2UgYW4gYXJyYXkgaW5kZXggd2l0aCByYW5nZTogMCA8PSBwYWdlTnVtYmVyIDwgcGFnZUNvdW50LlxuICAgKiBAcmV0dXJucyAgICAgICAgICAgQSBEYXRhVGFibGUgY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIHBhZ2UuIFRoZSBudW1iZXIgb2Ygcm93cyByZXR1cm5lZFxuICAgKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGxlc3MgdGhhbiB0aGUgcGFnZSBzaXplIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEuXG4gICAqXG4gICAqIGBgYFxuICAgKiBjb25zdCBwYWdlUm93Q291bnQgPSAyMDA7XG4gICAqIGNvbnN0IGRhdGFUYWJsZVJlYWRlciA9IGF3YWl0IHdvcmtzaGVldC5nZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gICAqIGZvciAobGV0IGN1cnJlbnRQYWdlID0gMDsgY3VycmVudFBhZ2UgPCBkYXRhVGFibGVSZWFkZXIucGFnZUNvdW50OyBjdXJyZW50UGFnZSsrKSB7XG4gICAqICAgY29uc3QgY3VycmVudFBhZ2VEYXRhVGFibGUgPSBhd2FpdCBkYXRhVGFibGVSZWFkZXIuZ2V0UGFnZUFzeW5jKGN1cnJlbnRQYWdlKTtcbiAgICogICAvLyAuLi4gcHJvY2VzcyBjdXJyZW50IHBhZ2UgLi4uXG4gICAqIH1cbiAgICogYXdhaXQgZGF0YVRhYmxlUmVhZGVyLnJlbGVhc2VBc3luYygpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldFBhZ2VBc3luYyhwYWdlTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPERhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgdGhlIHBhZ2VzIG9mIGRhdGEgaW50byBhIHNpbmdsZSBEYXRhVGFibGUuXG4gICAqIENhbGxzIHRvIGdldEFsbFBhZ2VzQXN5bmMoKSBhZnRlciByZWxlYXNlQXN5bmMoKSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi5cbiAgICogVG8gcHJvdGVjdCBhZ2FpbnN0IHBvc3NpYmxlIGJyb3dzZXIgZmFpbHVyZSwgZ2V0QWxsUGFnZXNBc3luYyB3aWxsIGNhcCB0aGUgZGF0YSBhdCBhIG1heGltdW0gb2YgNDAwIHBhZ2VzLlxuICAgKiBXaXRoIGEgZGVmYXVsdCBwYWdlUm93Q291bnQgb2YgMTAsMDAwIHRoaXMgd2lsbCBnaXZlIHlvdSBhIG1heGltdW0gb2YgNCwwMDAsMDAwIHJvd3Mgb2YgZGF0YS5cbiAgICpcbiAgICogSWYgc2l6ZXMgYXJlIGxhcmdlciB0aGFuIHRoaXMsIHBsZWFzZSBwcm9jZXNzIHlvdXIgZGF0YSBpbiBwYWdlIHNpemUgY2h1bmtzLlxuICAgKiBAcGFyYW0gbWF4Um93cyBMaW1pdHMgdGhlIHJlcXVlc3QgdG8gbWF4Um93cy4gSWYgbWF4Um93cyA9PT0gMCwgcmVxdWVzdHMgYWxsIHJvd3MuXG4gICAqIEByZXR1cm5zICAgICAgIEEgRGF0YVRhYmxlIGNvbnRhaW5pbmcgYWxsIHRoZSBkYXRhIGF2YWlsYWJsZSB0byB0aGUgRGF0YVRhYmxlUmVhZGVyIHdpdGggdGhlIG1heGltdW0gcGFnZSBjb3VudCBhYm92ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIC8vIFRvIHNpbXBsaWZ5IHRoZSBleGFtcGxlLCB3ZSBhc3N1bWUgd2UgaGF2ZSBsZXNzIHRoYW4gNG0gcm93cyBvZiBkYXRhXG4gICAqIC8vIFNpbmNlIHdlIGFyZSBmZXRjaGluZyBhbGwgb2YgdGhlIGRhdGEsIHVzZSB0aGUgZGVmYXVsdCBwYWdlIHNpemUgaW4gZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luY1xuICAgKiBjb25zdCBkYXRhVGFibGVSZWFkZXIgPSBhd2FpdCB3b3Jrc2hlZXQuZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYygpO1xuICAgKiBjb25zdCBkYXRhVGFibGUgPSBhd2FpdCBkYXRhVGFibGVSZWFkZXIuZ2V0QWxsUGFnZXNBc3luYygpO1xuICAgKiBhd2FpdCBkYXRhVGFibGVSZWFkZXIucmVsZWFzZUFzeW5jKCk7XG4gICAqIC8vIC4uLiBwcm9jZXNzIHRoZSBkYXRhIHRhYmxlIC4uLlxuICAgKiBgYGBcbiAgICovXG4gIGdldEFsbFBhZ2VzQXN5bmMobWF4Um93cz86IG51bWJlcik6IFByb21pc2U8RGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogUmVsZWFzZSBhbGwgcmVzb3VyY2VzIGhlbGQgYnkgdGhlIERhdGFUYWJsZVJlYWRlci5cbiAgICogQ2FsbGluZyB0aGlzIHdoZW4gZG9uZSB3aXRoIHRoZSBEYXRhVGFibGVSZWFkZXIgaXMgcmVxdWlyZWQgcHJhY3RpY2UgYXMgaXQgZnJlZXMgdXAgcmVzb3VyY2VzLlxuICAgKiBDYWxscyB0byBnZXRQYWdlQXN5bmMoKSBhZnRlciByZWxlYXNlQXN5bmMoKSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi5cbiAgICovXG4gIHJlbGVhc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xufVxuIiwiZXhwb3J0IGVudW0gU2hhcmVkRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBBIENTViBvciBFeGNlbCBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkIGluIFZpei5leHBvcnRDcm9zc3RhYkFzeW5jKCkuXG4gICAqL1xuICBDcm9zc3RhYkNyZWF0aW9uRXJyb3IgPSAnY3Jvc3N0YWItY3JlYXRpb24tZXJyb3InLFxuICAvKipcbiAgICogQSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0RGF0YUFzeW5jKCkuXG4gICAqL1xuICBEYXRhQ3JlYXRpb25FcnJvciA9ICdkYXRhLWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgYWdncmVnYXRpb24gd2FzIHNwZWNpZmllZCBmb3IgdGhlIGZpbHRlciwgc3VjaCBhcyBzZXR0aW5nIGEgcmFuZ2UgZmlsdGVyIHRvIFwiU1VNKFNhbGVzKVwiIGluc3RlYWQgb2ZcbiAgICogXCJTYWxlc1wiLlxuICAgKi9cbiAgSW52YWxpZEFnZ3JlZ2F0aW9uRmllbGROYW1lID0gJ2ludmFsaWQtYWdncmVnYXRpb24tZmllbGQtbmFtZScsXG4gIC8qKlxuICAgKiBBIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgSW52YWxpZEZpbHRlckZpZWxkTmFtZSA9ICdpbnZhbGlkLWZpbHRlci1uYW1lJyxcbiAgLyoqXG4gICAqIEEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHVzaW5nIGEgdmFsdWUgdGhhdCBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIEludmFsaWRGaWx0ZXJGaWVsZFZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkVmFsdWUnLFxuICAvKipcbiAgICogQW4gaW52YWxpZCBkYXRlIHZhbHVlIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCBmb3IgYSBkYXRlIGZpZWxkLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvbkRhdGUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZGF0ZScsXG4gIC8qKlxuICAgKiBBIGZpZWxkIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhIHNvdXJjZS5cbiAgICovXG4gIEludmFsaWRTZWxlY3Rpb25GaWVsZE5hbWUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZmllbGROYW1lJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBpbiBhIFNoZWV0LnNlbGVjdE1hcmtzQXN5bmMoKSBjYWxsLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblZhbHVlID0gJ2ludmFsaWQtc2VsZWN0aW9uLXZhbHVlJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGRpZCBub3QgaW5jbHVkZSBhIHZhbGlkIHNoZWV0IHNlbGVjdGlvbiBmb3IgZXhwb3J0aW5nLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblNoZWV0ID0gJ2ludmFsaWQtc2VsZWN0aW9uLXNoZWV0JyxcbiAgLyoqXG4gICAqIEFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgVGFibGVhdSBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBIHBhcmFtZXRlciBpcyBub3QgdGhlIGNvcnJlY3QgZGF0YSB0eXBlIG9yIGZvcm1hdC4gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgaW4gdGhlIEVycm9yLm1lc3NhZ2UgZmllbGQuXG4gICAqL1xuICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEEgUERGIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQgaW4gVml6LmV4cG9ydFBERkFzeW5jKCkuXG4gICAqL1xuICBQREZDcmVhdGlvbkVycm9yID0gJ3BkZi1jcmVhdGlvbi1lcnJvcicsXG4gIC8qKlxuICAgKiBBIFBvd2VyUG9pbnQgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKCkuXG4gICAqL1xuICBQb3dlclBvaW50Q3JlYXRpb25FcnJvciA9ICdwb3dlcnBvaW50LWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBpcyBub3QgYWN0aXZlIG9yIGVtYmVkZGVkIHdpdGhpbiB0aGUgYWN0aXZlIGRhc2hib2FyZC5cbiAgICovXG4gIE5vdEFjdGl2ZVNoZWV0ID0gJ25vdC1hY3RpdmUtc2hlZXQnLFxuICAvKipcbiAgICogUHJvcGVydHkgb3IgRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoaW4gdGhlIFRhYmxlYXUgQVBJLlxuICAgKi9cbiAgSW1wbGVtZW50YXRpb25FcnJvciA9ICd3cm9uZy1pbXBsZW1lbnRhdGlvbicsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgd2hlbiB0d28gaW5jb21wYXRpYmxlIGNhbGxzIGFyZSB0cmlnZ2VyZWQgdG9nZXRoZXIuXG4gICAqL1xuICBBcGlFeGVjdXRpb25FcnJvciA9ICdhcGktZXhlY3V0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEEgZ2VuZXJhbC1wdXJwb3NlIHNlcnZlciBlcnJvciBvY2N1cnJlZC4gRGV0YWlscyBhcmUgY29udGFpbmVkIGluIHRoZSBFcnJvciBvYmplY3QuXG4gICAqL1xuICBTZXJ2ZXJFcnJvciA9ICdzZXJ2ZXItZXJyb3InLFxuICAvKipcbiAgICogQ2FuIG9jY3VyIHdoZW4gYW4gYXBpIGNhbGwgdGltZXMgb3V0LlxuICAgKi9cbiAgVGltZW91dCA9ICd0aW1lb3V0Jyxcbn1cbiIsIi8qKlxuICogQGhpZGRlblxuICogUmVwcmVzZW50cyB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBzZXJ2ZXIuXG4gKiBSZXNlcnZlZCBmb3IgZmlyc3QgY2xhc3MgZXh0ZW5zaW9ucyBvbmx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3RlZFNlcnZlciB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyAgUmV0dXJucyBhbiBpZCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgdXNlciBzaWduZWQgaW50byBzZXJ2ZXIuXG4gICAqICAgICAgICAgICBSZXR1cm5zIHVuZGVmaW5lZCBpZiBvbiBkZXNrdG9wIGFuZCBub3QgY29ubmVjdGVkIHRvIHNlcnZlci5cbiAgICovXG4gIHJlYWRvbmx5IHVzZXJJZD86IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgIFJldHVybnMgYW4gaWQgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHNpdGUgd2hlbiBzaWduZWQgaW50byBzZXJ2ZXIuXG4gICAqICAgICAgICAgICBSZXR1cm5zIHVuZGVmaW5lZCBpZiBvbiBkZXNrdG9wIGFuZCBub3QgY29ubmVjdGVkIHRvIHNlcnZlci5cbiAgICovXG4gIHJlYWRvbmx5IHNpdGVJZD86IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgIFJldHVybnMgYW4gc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBzaXRlTmFtZXNwYWNlIHdoZW4gc2lnbmVkIGludG8gc2VydmVyLlxuICAgKiAgICAgICAgICAgUmV0dXJucyB1bmRlZmluZWQgaWYgb24gZGVza3RvcCBhbmQgbm90IGNvbm5lY3RlZCB0byBzZXJ2ZXIuXG4gICAqL1xuICByZWFkb25seSBzaXRlTmFtZXNwYWNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgUmV0dXJucyBhbiBpZCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgd29ya2Jvb2sgd2hlbiBsb2FkZWQgZnJvbSBzZXJ2ZXIuXG4gICAqICAgICAgICAgICBSZXR1cm5zIHVuZGVmaW5lZCBpZiBvbiBkZXNrdG9wIHdpdGggYSBsb2NhbCB3b3JrYm9vay5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtib29rSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFJldHVybnMgYSBsaXN0IG9mIGVuYWJsZWQgZmVhdHVyZSBmbGFncyBtZWFudCBmb3IgZXh0ZW5zaW9ucyxcbiAgICogICAgICAgICAgb3IgdW5kZWZpbmVkIGlmIG5vIGZsYWdzIGhhdmUgYmVlbiBwYXNzZWQuXG4gICAqL1xuICByZWFkb25seSBmZWF0dXJlRmxhZ3M/OiBzdHJpbmdbXTtcbn1cbiIsImltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9EYXRhU291cmNlSW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuL0RhdGFUYWJsZUludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRmlsdGVyRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbixcbiAgRmlsdGVyVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSxcbiAgUGVyaW9kVHlwZSxcbn0gZnJvbSAnLi9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuXG4vKipcbiAqXG4gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgb2YgdGhlIGZpbHRlciB0eXBlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXIge1xuICAvKipcbiAgICogQHJldHVybnMgIFRoZSBwYXJlbnQgd29ya3NoZWV0LlxuICAgKi9cbiAgcmVhZG9ubHkgd29ya3NoZWV0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIHR5cGUgb2YgdGhlIGZpbHRlci5cbiAgICovXG4gIHJlYWRvbmx5IGZpbHRlclR5cGU6IEZpbHRlclR5cGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUaGUgbmFtZSBvZiB0aGUgZmllbGQgYmVpbmcgZmlsdGVyZWQuICBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgY2FwdGlvblxuICAgKiAgICAgICAgICAgYXMgc2hvd24gaW4gdGhlIFVJLCBhbmQgbm90IHRoZSBhY3R1YWwgZGF0YWJhc2UgZmllbGQgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IGZpZWxkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIGlkIG9mIHRoZSBmaWVsZCBiZWluZyBmaWx0ZXJlZC5cbiAgICovXG5cbiAgcmVhZG9ubHkgZmllbGRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBhIHByb21pc2UgY29udGFpbmluZyB0aGUgZmllbGQgZm9yIHRoZSBmaWx0ZXIuXG4gICAqIEBzaW5jZSAxLjUuMCBGaXhlZCB0byBwcm9wZXJseSByZXR1cm4gdGhlIGZpZWxkLiBBbHNvIHJlcXVpcmVzIFRhYmxlYXUgMjAxOS4yKy5cbiAgICovXG4gIGdldEZpZWxkQXN5bmMoKTogUHJvbWlzZTxGaWVsZD47XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRoZSBsaXN0IG9mIHdvcmtzaGVldCBuYW1lcyB0aGF0IGhhdmUgdGhlIGZpbHRlciBhcHBsaWVkLlxuICAgKiBAc2luY2UgMS45LjAgYW5kIFRhYmxlYXUgMjAyMi4yXG4gICAqL1xuICBnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKCk6IFByb21pc2U8QXJyYXk8c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGZpbHRlciB0byB0aGUgc3BlY2lmaWVkIGxpc3Qgb2Ygd29ya3NoZWV0cy5cbiAgICogSWYgdGhlIHdvcmtzaGVldChzKSBkbyBub3QgZXhpc3Qgb3IgZG8gbm90IGNvbnRhaW4gdGhlIGZpZWxkIGluIHRoZWlyIGRhdGEgc291cmNlcywgYW4gZXhjZXB0aW9uIGlzIHRocm93bi5cbiAgICpcbiAgICogQHBhcmFtIGFwcGx5VG9Xb3Jrc2hlZXRzIGxpc3Qgb2Ygd29ya3NoZWV0cyB0byBhcHBseSB0aGUgZmlsdGVyIG9uXG4gICAqIEByZXR1cm5zIHRoZSBsaXN0IG9mIHdvcmtzaGVldCBuYW1lcyB0aGF0IGhhdmUgdGhlIGZpbHRlciBhcHBsaWVkXG4gICAqIEBzaW5jZSAxLjkuMCBhbmQgVGFibGVhdSAyMDIyLjJcbiAgICovXG4gIHNldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoYXBwbHlUb1dvcmtzaGVldHM6IEFycmF5PHN0cmluZz4pOiBQcm9taXNlPEFycmF5PHN0cmluZz4+O1xufVxuXG4vKipcbiAqIEEgQ2F0ZWdvcmljYWwgRmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcmljYWxGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIge1xuICAvKipcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBhbGwgdGhlIHZhbHVlcyBhcmUgc2VsZWN0ZWQgZm9yIHRoaXMgZmlsdGVyLiBXaGVuICdBbGwnIGlzIHNlbGVjdGVkLFxuICAgKiBhcHBsaWVkVmFsdWVzIHJldHVybnMgYW4gZW1wdHkgbGlzdC5cbiAgICpcbiAgICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgaW4gVGFibGVhdSAyMDE5LjIgb3IgbGF0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGlzQWxsU2VsZWN0ZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogQHJldHVybnMgIEEgbGlzdCBvZiB2YWx1ZXMgYXBwbGllZCB0byB0aGlzIGNhdGVnb3JpY2FsIGZpbHRlci4gTm90aWNlIHRoYXQgaWYgdGhpcyBpcyBhXG4gICAqIGRlcGVuZGVudCBmaWx0ZXIsIHRoZSBjdXJyZW50IHJlbGF2ZW50IHZhbHVlcyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nXG4gICAqIGBnZXREb21haW5Bc3luYyh0YWJsZWF1LkZpbHRlckRvbWFpblR5cGUuUmVsZXZhbnQpYC5cbiAgICovXG4gIHJlYWRvbmx5IGFwcGxpZWRWYWx1ZXM6IEFycmF5PERhdGFWYWx1ZT47XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUcnVlIGlmIHRoaXMgZmlsdGVyIGlzIGFuIGV4Y2x1ZGUgZmlsdGVyLCBmYWxzZSBpZiBhbiBpbmNsdWRlIGZpbHRlci5cbiAgICovXG4gIHJlYWRvbmx5IGlzRXhjbHVkZU1vZGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGEgcHJvbWlzZSBjb250YWluaW5nIHRoZSBjYXRlZ29yaWNhbCBkb21haW4gZm9yIHRoZSBmaWx0ZXIuIE5vdGUgaWYgYSBmaWx0ZXIgY29udGFpbnNcbiAgICogbXVsdGlwbGUgZmllbGRzIChzdWNoIGFzIGEgZmlsdGVyIGFjdGlvbiB3aXRoIG11bHRpcGxlIGZpZWxkcyksIHRoZSB2YWx1ZXMgYXJyYXkgaW4gdGhlIHJldHVybmVkXG4gICAqIENhdGVnb3JpY2FsRG9tYWluICh7QGxpbmsgQ2F0ZWdvcmljYWxEb21haW4udmFsdWVzfSkgd2lsbCBiZSBlbXB0eS4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGZpZWxkc1xuICAgKiBpbiB0aGUgZmlsdGVyLCB0aGUgcmVzdWx0cyBuZWVkIHRvIGJlIHJlcHJlc2VudGVkIGJ5IGEgdGFibGUsIHdoaWNoIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICAgKi9cbiAgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENhdGVnb3JpY2FsRG9tYWluPjtcbn1cblxuLyoqXG4gKiBBIEhpZXJhcmNoaWNhbCBGaWx0ZXJcbiAqIEhpZXJhcmNoaWNhbCBGaWx0ZXJzIGFyZSB1c2VkIHdoZW4gYSBoaWVyYXJjaGljYWwgZmllbGQgaXMgdXNlZCBhcyBhIGZpbHRlciBvbiBhIGN1YmUgZGF0YWJhc2UuXG4gKiBBcyBhbiBleGFtcGxlLCBhc3N1bWUgYSBoaWVyYXJjaGljYWwgZmllbGQgaW4gUHJvZHVjdCwgbmFtZWQgQnlDYXRlZ29yeS5cbiAqIEJ5Q2F0ZWdvcnkgaGFzIHRoZSBmb2xsb3dpbmcgZml2ZSBsZXZlbHM6IEZhbWlseSwgQ2F0ZWdvcnksIFN1YmNhdGVnb3J5LCBCcmFuZCwgU2t1LlxuICogQHNpbmNlIEV4dGVuc2lvbnMgMS4xMC4wIGFuZCBUYWJsZWF1IHZlcnNpb24gMjAyMi4zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGllcmFyY2hpY2FsRmlsdGVyIGV4dGVuZHMgRmlsdGVyIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBkaW1lbnNpb24gbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbHRlci4gSW4gdGhlIEJ5Q2F0ZWdvcnkgZmlsdGVyIGV4YW1wbGUsIHRoaXMgd291bGQgYmUgJ1Byb2R1Y3QnXG4gICAqL1xuICByZWFkb25seSBkaW1lbnNpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBoaWVyYXJjaHkgY2FwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbHRlci4gSW4gdGhlIEJ5Q2F0ZWdvcnkgZmlsdGVyIGV4YW1wbGUsIHRoaXMgd291bGQgYmUgJ1tQcm9kdWN0XS5bQnlDYXRlZ29yeV0nXG4gICAqL1xuICByZWFkb25seSBoaWVyYXJjaHlDYXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgbGV2ZWxzIGluIHRoZSBoaWVyYXJjaGljYWwgZmlsdGVyLiBJbiB0aGUgQnlDYXRlZ29yeSBmaWx0ZXIgZXhhbXBsZSwgdGhpcyB3b3VsZCBiZSA1XG4gICAqL1xuICByZWFkb25seSBudW1iZXJPZkxldmVsczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBEZXRhaWxzIGFib3V0IGVhY2ggbGV2ZWwgaW4gdGhlIGhpZXJhcmNoaWNhbCBmaWx0ZXIuXG4gICAqL1xuICByZWFkb25seSBsZXZlbERldGFpbHM6IEFycmF5PEhpZXJhcmNoaWNhbExldmVsRGV0YWlsPjtcblxuICAvKipcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBhbGwgdGhlIHZhbHVlcyBhcmUgc2VsZWN0ZWQgZm9yIHRoaXMgZmlsdGVyLiBXaGVuICdBbGwnIGlzIHNlbGVjdGVkLFxuICAgKiBhcHBsaWVkVmFsdWVzIHJldHVybnMgYW4gZW1wdHkgbGlzdC5cbiAgICovXG4gIHJlYWRvbmx5IGlzQWxsU2VsZWN0ZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBBIGxpc3Qgb2YgdmFsdWVzIGFwcGxpZWQgdG8gdGhpcyBoaWVyYXJjaGljYWwgZmlsdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGllZFZhbHVlczogQXJyYXk8SGllcmFyY2hpY2FsRmlsdGVyRGF0YVZhbHVlPjtcbn1cblxuLyoqXG4gKiBBIFJhbmdlIEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlRmlsdGVyIGV4dGVuZHMgRmlsdGVyIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zICBNaW5pbXVtIHZhbHVlLCBpbmNsdXNpdmUsIGFwcGxpZWQgdG8gdGhlIGZpbHRlci5cbiAgICovXG4gIHJlYWRvbmx5IG1pblZhbHVlOiBEYXRhVmFsdWU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBNYXhpbXVtIHZhbHVlLCBpbmNsdXNpdmUsIGFwcGxpZWQgdG8gdGhlIGZpbHRlci5cbiAgICovXG4gIHJlYWRvbmx5IG1heFZhbHVlOiBEYXRhVmFsdWU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUcnVlIGlmIG51bGwgdmFsdWVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgZmlsdGVyLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlTnVsbFZhbHVlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHBhcmFtIGRvbWFpblR5cGUgdGhlIGRvbWFpbiB0eXBlLCBkZWZhdWx0cyB0byByZWxldmFudFxuICAgKiBAcmV0dXJucyBhIHByb21pc2UgY29udGFpbmluZyB0aGUgZG9tYWluIGZvciB0aGUgcmFuZ2UgZmlsdGVyXG4gICAqL1xuICBnZXREb21haW5Bc3luYyhkb21haW5UeXBlPzogRmlsdGVyRG9tYWluVHlwZSk6IFByb21pc2U8UmFuZ2VEb21haW4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbGF0aXZlRGF0ZUZpbHRlciBleHRlbmRzIEZpbHRlciB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyB0aGUgYW5jaG9yIGRhdGUgb2YgdGhlIGZpbHRlclxuICAgKi9cbiAgcmVhZG9ubHkgYW5jaG9yRGF0ZTogRGF0YVZhbHVlO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgZGF0ZSBwZXJpb2Qgb2YgdGhlIGZpbHRlci5cbiAgICovXG4gIHJlYWRvbmx5IHBlcmlvZFR5cGU6IFBlcmlvZFR5cGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSByYW5nZSBvZiB0aGUgZGF0ZSBmaWx0ZXIgKHllYXJzLCBtb250aHMsIGV0Yy4pLlxuICAgKi9cbiAgcmVhZG9ubHkgcmFuZ2VUeXBlOiBEYXRlUmFuZ2VUeXBlO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBXaGVuIGdldFJhbmdlIHJldHVybnMgTEFTVE4gb3IgTkVYVE4sIHRoaXMgaXMgdGhlIE4gdmFsdWUgKGhvdyBtYW55IHllYXJzLCBtb250aHMsIGV0Yy4pLlxuICAgKi9cbiAgcmVhZG9ubHkgcmFuZ2VOOiBudW1iZXI7XG59XG5cbi8qKiAqXG4gKiBQYXNzZWQgaW50byB0aGUgYXBwbHlGaWx0ZXIgbWV0aG9kcyB0byBjb250cm9sIGFkdmFuY2VkIGZpbHRlcmluZyBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlck9wdGlvbnMge1xuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBmaWx0ZXIgd2lsbCBhcHBseSBpbiBleGNsdWRlIG1vZGUgb3IgaW5jbHVkZSBtb2RlLlxuICAgKiBUaGUgZGVmYXVsdCBpcyBpbmNsdWRlLCB3aGljaCBtZWFucyB0aGF0IHlvdSB1c2UgdGhlIGZpZWxkcyBhcyBwYXJ0IG9mIGEgZmlsdGVyLlxuICAgKiBFeGNsdWRlIG1vZGUgbWVhbnMgdGhhdCB5b3UgaW5jbHVkZSBldmVyeXRoaW5nIGVsc2UgZXhjZXB0IHRoZSBzcGVjaWZpZWQgZmllbGRzLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFeGNsdWRlTW9kZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBSYW5nZSBGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZUZpbHRlck9wdGlvbnMge1xuICByZWFkb25seSBtaW4/OiBudW1iZXIgfCBEYXRlO1xuICByZWFkb25seSBtYXg/OiBudW1iZXIgfCBEYXRlO1xuICByZWFkb25seSBudWxsT3B0aW9uPzogRmlsdGVyTnVsbE9wdGlvbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBSZWxhdGl2ZSBEYXRlIEZpbHRlclxuICogQHNpbmNlIHZlcnNpb24gMS45LjAgYW5kIFRhYmxlYXUgMjAyMi4yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVsYXRpdmVEYXRlRmlsdGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyB0aGUgYW5jaG9yIGRhdGUgb2YgdGhlIGZpbHRlclxuICAgKi9cbiAgcmVhZG9ubHkgYW5jaG9yRGF0ZT86IERhdGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBkYXRlIHBlcmlvZCBvZiB0aGUgZmlsdGVyICh5ZWFycywgbW9udGhzLCBldGMuKS5cbiAgICovXG4gIHJlYWRvbmx5IHBlcmlvZFR5cGU6IFBlcmlvZFR5cGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSByYW5nZSBvZiB0aGUgZGF0ZSBmaWx0ZXIuXG4gICAqL1xuICByZWFkb25seSByYW5nZVR5cGU6IERhdGVSYW5nZVR5cGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdoZW4gZ2V0UmFuZ2UgcmV0dXJucyBMQVNUTiBvciBORVhUTiwgdGhpcyBpcyB0aGUgTiB2YWx1ZSAoaG93IG1hbnkgeWVhcnMsIG1vbnRocywgZXRjLikuXG4gICAqL1xuICByZWFkb25seSByYW5nZU4/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGRvbWFpbiBvZiByYW5nZSBmaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZURvbWFpbiB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyB0aGUgZG9tYWluIHR5cGUgKHJlbGV2YW50LCBhbGwpXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBGaWx0ZXJEb21haW5UeXBlO1xuICAvKipcbiAgICogQHJldHVybnMgIE1pbmltdW0gdmFsdWUgYXMgc3BlY2lmaWVkIGluIHRoZSBkb21haW4uXG4gICAqL1xuICByZWFkb25seSBtaW46IERhdGFWYWx1ZTtcbiAgLyoqXG4gICAqIEByZXR1cm5zICBNYXhpbXVtIHZhbHVlIGFzIHNwZWNpZmllZCBpbiB0aGUgZG9tYWluLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4OiBEYXRhVmFsdWU7XG59XG5cbi8qKlxuICogVGhlIGRvbWFpbiBvZiBhIGNhdGVnb3JpY2FsIGZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpY2FsRG9tYWluIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zIHRoZSBkb21haW4gdHlwZSAocmVsZXZhbnQsIGFsbClcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IEZpbHRlckRvbWFpblR5cGU7XG4gIC8qKlxuICAgKiBAcmV0dXJucyB0aGUgbGlzdCBvZiB2YWx1ZXMgaW4gdGhlIGRvbWFpbiBvZiB0aGUgZmlsdGVyXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM6IEFycmF5PERhdGFWYWx1ZT47XG59XG5cbi8qKlxuICogQSBzZWxlY3RlZCB2YWx1ZSBpbiBhIGhpZXJhcmNoaWNhbCBmaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWUge1xuICAvKipcbiAgICogQHJldHVybnMgdGhlIERhdGFWYWx1ZSBvZiB0aGUgc2VsZXRlZCBpdGVtXG4gICAqL1xuICB2YWx1ZTogRGF0YVZhbHVlO1xuICAvKipcbiAgICogQHJldHVybnMgdGhlIHBhdGggdG8gdGhpcyBzZWxlY3RlZCBpdGVtLiBJbiB0aGUgQnlDYXRlZ29yeSBleGFtcGxlLCB0aGUgaGllcmFyY2hpY2FsUGF0aCBmb3IgYSBsZXZlbCAyIGl0ZW0gY291bGQgYmVcbiAgICogJ1tPdXRkb29yICYgU3BvcnRpbmddLltCaWtlc10uW0tpZHMnIEJpa2VzXScuXG4gICAqL1xuICByZWFkb25seSBoaWVyYXJjaGljYWxQYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAcmV0dXJucyB0aGUgbGV2ZWwgb2YgdGhpcyBzZWxlY3RlZCBpdGVtLiBJbiB0aGUgQnlDYXRlZ29yeSBleGFtcGxlLCB0aGUgbGV2ZWwgY291bGQgYmUgMC00LlxuICAgKiBGb3IgJ1tPdXRkb29yICYgU3BvcnRpbmddLltCaWtlc10uW0tpZHMnIEJpa2VzXScsIHRoZSBsZXZlbCBpcyAyLlxuICAgKi9cbiAgbGV2ZWw6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGVhY2ggbGV2ZWwgaW4gYSBoaWVyYXJjaGljYWwgZmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwge1xuICAvKipcbiAgICogQHJldHVybnMgdGhlIGxldmVsIG5hbWUuIEluIHRoZSBCeUNhdGVnb3J5IGV4YW1wbGUsIHRoZSBuYW1lIGNvdWxkIGJlICdGYW1pbHknLCAnQ2F0ZWdvcnknLCAnU3ViY2F0ZWdvcnknLCAnQnJhbmQnLCBvciAnU2t1Jy5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgdGhlIGxldmVsIHNlbGVjdGlvbiBzdGF0ZVxuICAgKi9cbiAgbGV2ZWxTZWxlY3Rpb25TdGF0ZTogSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZTtcbn1cbiIsIi8qKlxuICogVGhlIHRhYmxlYXUgbmFtZXNwYWNlIGV4aXN0cyBmb3Igb3JnYW5pemF0aW9uIGFuZCB0byBhdm9pZCBwb2xsdXRpbmdcbiAqIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBJdCBjb250YWlucyBubyBjb25zdHJ1Y3RzIG90aGVyIHRoYW4gc3ViLW5hbWVzcGFjZXMgYW5kIHRoZSBUYWJsZWF1IGVudW1lcmF0aW9ucy5cbiAqL1xuXG5uYW1lc3BhY2UgVGFibGVhdSB7XG4gIGV4cG9ydCBlbnVtIEFuYWx5dGljc09iamVjdFR5cGUge1xuICAgIENsdXN0ZXIgPSAnY2x1c3RlcicsXG4gICAgRm9yZWNhc3QgPSAnZm9yZWNhc3QnLFxuICAgIFRyZW5kTGluZSA9ICd0cmVuZC1saW5lJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIEFubm90YXRpb25UeXBlIHtcbiAgICBNYXJrID0gJ21hcmsnLFxuICAgIFBvaW50ID0gJ3BvaW50JyxcbiAgICBBcmVhID0gJ2FyZWEnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG4gICAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICAgIENvbnRpbnVvdXMgPSAnY29udGludW91cycsXG4gICAgVW5rbm93biA9ICd1bmtub3duJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIENsYXNzTmFtZUtleSB7XG4gICAgV29ya3NoZWV0VGl0bGUgPSAndGFibGVhdS13b3Jrc2hlZXQtdGl0bGUnLFxuICAgIFdvcmtzaGVldCA9ICd0YWJsZWF1LXdvcmtzaGVldCcsXG4gICAgVG9vbHRpcCA9ICd0YWJsZWF1LXRvb2x0aXAnLFxuICAgIFN0b3J5VGl0bGUgPSAndGFibGVhdS1zdG9yeS10aXRsZScsXG4gICAgRGFzaGJvYXJkVGl0bGUgPSAndGFibGVhdS1kYXNoYm9hcmQtdGl0bGUnLFxuICAgIFBhbmUgPSAndGFibGVhdS1wYW5lJyxcbiAgICBSb3dEaXZpZGVycyA9ICd0YWJsZWF1LXJvdy1kaXZpZGVycycsXG4gICAgQ29sdW1uRGl2aWRlcnMgPSAndGFibGVhdS1jb2x1bW4tZGl2aWRlcnMnLFxuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhlIG9iamVjdCByZXByZXNlbnRzIGluIGEgZGFzaGJvYXJkLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VHlwZSB7XG4gICAgQmxhbmsgPSAnYmxhbmsnLFxuICAgIFdvcmtzaGVldCA9ICd3b3Jrc2hlZXQnLFxuICAgIFF1aWNrRmlsdGVyID0gJ3F1aWNrLWZpbHRlcicsXG4gICAgUGFyYW1ldGVyQ29udHJvbCA9ICdwYXJhbWV0ZXItY29udHJvbCcsXG4gICAgUGFnZUZpbHRlciA9ICdwYWdlLWZpbHRlcicsXG4gICAgTGVnZW5kID0gJ2xlZ2VuZCcsXG4gICAgVGl0bGUgPSAndGl0bGUnLFxuICAgIFRleHQgPSAndGV4dCcsXG4gICAgSW1hZ2UgPSAnaW1hZ2UnLFxuICAgIFdlYlBhZ2UgPSAnd2ViLXBhZ2UnLFxuICAgIEV4dGVuc2lvbiA9ICdleHRlbnNpb24nLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSB2aXNpYmlsaXR5IHN0YXRlIG9mIGEgZGFzaGJvYXJkIG9iamVjdC5cbiAgICogQHNpbmNlIDEuNy4wXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZSB7XG4gICAgLyoqIFVzZWQgZm9yIHR1cm5pbmcgb24gdGhlIHZpc2liaWxpdHkgb2YgYSBkYXNoYm9hcmQgb2JqZWN0LiovXG4gICAgU2hvdyA9ICdzaG93JyxcblxuICAgIC8qKiBVc2VkIGZvciB0dXJuaW5nIG9mZiB0aGUgdmlzaWJpbGl0eSBvZiBhIGRhc2hib2FyZCBvYmplY3QuKi9cbiAgICBIaWRlID0gJ2hpZGUnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgZGF0YSBhIHZhbHVlIGNhbiBoYXZlXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXRhVHlwZSB7XG4gICAgU3RyaW5nID0gJ3N0cmluZycsXG4gICAgSW50ID0gJ2ludCcsXG4gICAgRmxvYXQgPSAnZmxvYXQnLFxuICAgIEJvb2wgPSAnYm9vbCcsXG4gICAgRGF0ZSA9ICdkYXRlJyxcbiAgICBEYXRlVGltZSA9ICdkYXRlLXRpbWUnLFxuICAgIFNwYXRpYWwgPSAnc3BhdGlhbCcsXG4gICAgVW5rbm93biA9ICd1bmtub3duJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgY2hhbmdlcyB0aGF0IG9jY3VyIHRvIGEgZGFzaGJvYXJkIG9iamVjdC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhc2hib2FyZExheW91dENoYW5nZSB7XG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCB3YXMgYWRkZWQgKi9cbiAgICBBZGRlZCA9ICdhZGRlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IHdhcyByZW1vdmVkICovXG4gICAgUmVtb3ZlZCA9ICdyZW1vdmVkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QncyBmbG9hdGluZyBzdGF0ZSBjaGFuZ2VkICovXG4gICAgSXNGbG9hdGluZ0NoYW5nZWQgPSAnaXMtZmxvYXRpbmctY2hhbmdlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0J3MgdmlzaWJpbGl0eSBjaGFuZ2VkICovXG4gICAgSXNWaXNpYmxlQ2hhbmdlZCA9ICdpcy12aXNpYmxlLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHBvc2l0aW9uIGNoYW5nZWQgKi9cbiAgICBQb3NpdGlvbkNoYW5nZWQgPSAncG9zaXRpb24tY2hhbmdlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0J3Mgc2l6ZSBjaGFuZ2VkICovXG4gICAgU2l6ZUNoYW5nZWQgPSAnc2l6ZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3Qgd2FzIHJlbmFtZWQgKi9cbiAgICBOYW1lQ2hhbmdlZCA9ICduYW1lLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCBpcyBzZWxlY3RlZCAqL1xuICAgIFNlbGVjdGVkID0gJ3NlbGVjdGVkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QgaXMgZGVzZWxlY3RlZCAqL1xuICAgIERlc2VsZWN0ZWQgPSAnZGVzZWxlY3RlZCcsXG5cbiAgICAvKiogTmF2aWdhdGUgdG8gYW5vdGhlciBkYXNoYm9hcmQgKi9cbiAgICBEYXNoYm9hcmRDaGFuZ2VkID0gJ2Rhc2hib2FyZC1jaGFuZ2VkJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZCBkYXRlIHJhbmdlcyBmb3IgYSByZWxhdGl2ZSBkYXRlIGZpbHRlci5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhdGVSYW5nZVR5cGUge1xuICAgIExhc3QgPSAnbGFzdCcsXG4gICAgTGFzdE4gPSAnbGFzdC1uJyxcbiAgICBOZXh0ID0gJ25leHQnLFxuICAgIE5leHROID0gJ25leHQtbicsXG4gICAgQ3VycmVudCA9ICdjdXJyZW50JyxcbiAgICBUb0RhdGUgPSAndG8tZGF0ZScsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHR5cGVzIG9mIGRpYWxvZyBwb3B1cCBzdHlsZXMuXG4gICAqL1xuICBleHBvcnQgZW51bSBEaWFsb2dTdHlsZSB7XG4gICAgV2luZG93ID0gJ3dpbmRvdycsXG4gICAgTW9kYWwgPSAnbW9kYWwnLFxuICAgIE1vZGVsZXNzID0gJ21vZGVsZXNzJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIEVuY29kaW5nVHlwZSB7XG4gICAgQ29sdW1uID0gJ2NvbHVtbicsXG4gICAgUm93ID0gJ3JvdycsXG4gICAgUGFnZSA9ICdwYWdlJyxcbiAgICBGaWx0ZXIgPSAnZmlsdGVyJyxcbiAgICBNYXJrc1R5cGUgPSAnbWFya3MtdHlwZScsXG4gICAgTWVhc3VyZVZhbHVlcyA9ICdtZWFzdXJlLXZhbHVlcycsXG4gICAgQ29sb3IgPSAnY29sb3InLFxuICAgIFNpemUgPSAnc2l6ZScsXG4gICAgTGFiZWwgPSAnbGFiZWwnLFxuICAgIERldGFpbCA9ICdkZXRhaWwnLFxuICAgIFRvb2x0aXAgPSAndG9vbHRpcCcsXG4gICAgU2hhcGUgPSAnc2hhcGUnLFxuICAgIFBhdGggPSAncGF0aCcsXG4gICAgQW5nbGUgPSAnYW5nbGUnLFxuICAgIEdlb21ldHJ5ID0gJ2dlb21ldHJ5JyxcbiAgICBDdXN0b20gPSAnY3VzdG9tJyxcbiAgfVxuXG4gIC8qKlxuICAgKiAgVHlwZSBvZiBhZ2dyZWdhdGlvbiBvbiBhIGZpZWxkLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmllbGRBZ2dyZWdhdGlvblR5cGUge1xuICAgIFN1bSA9ICdzdW0nLFxuICAgIEF2ZyA9ICdhdmcnLFxuICAgIE1pbiA9ICdtaW4nLFxuICAgIE1heCA9ICdtYXgnLFxuICAgIFN0ZGV2ID0gJ3N0ZGV2JyxcbiAgICBTdGRldnAgPSAnc3RkZXZwJyxcbiAgICBWYXIgPSAndmFyJyxcbiAgICBWYXJwID0gJ3ZhcnAnLFxuICAgIENvbGxlY3QgPSAnY29sbGVjdCcsXG4gICAgQ291bnQgPSAnY291bnQnLFxuICAgIENvdW50ZCA9ICdjb3VudGQnLFxuICAgIE1lZGlhbiA9ICdtZWRpYW4nLFxuICAgIEF0dHIgPSAnYXR0cicsXG4gICAgTm9uZSA9ICdub25lJyxcbiAgICBZZWFyID0gJ3llYXInLFxuICAgIFF0ciA9ICdxdHInLFxuICAgIE1vbnRoID0gJ21vbnRoJyxcbiAgICBEYXkgPSAnZGF5JyxcbiAgICBIb3VyID0gJ2hvdXInLFxuICAgIE1pbnV0ZSA9ICdtaW51dGUnLFxuICAgIFNlY29uZCA9ICdzZWNvbmQnLFxuICAgIFdlZWsgPSAnd2VlaycsXG4gICAgV2Vla2RheSA9ICd3ZWVrZGF5JyxcbiAgICBNb250aFllYXIgPSAnbW9udGgteWVhcicsXG4gICAgTWR5ID0gJ21keScsXG4gICAgRW5kID0gJ2VuZCcsXG4gICAgVHJ1bmNZZWFyID0gJ3RydW5jLXllYXInLFxuICAgIFRydW5jUXRyID0gJ3RydW5jLXF0cicsXG4gICAgVHJ1bmNNb250aCA9ICd0cnVuYy1tb250aCcsXG4gICAgVHJ1bmNXZWVrID0gJ3RydW5jLXdlZWsnLFxuICAgIFRydW5jRGF5ID0gJ3RydW5jLWRheScsXG4gICAgVHJ1bmNIb3VyID0gJ3RydW5jLWhvdXInLFxuICAgIFRydW5jTWludXRlID0gJ3RydW5jLW1pbnV0ZScsXG4gICAgVHJ1bmNTZWNvbmQgPSAndHJ1bmMtc2Vjb25kJyxcbiAgICBRdWFydDEgPSAncXVhcnQxJyxcbiAgICBRdWFydDMgPSAncXVhcnQzJyxcbiAgICBTa2V3bmVzcyA9ICdza2V3bmVzcycsXG4gICAgS3VydG9zaXMgPSAna3VydG9zaXMnLFxuICAgIEluT3V0ID0gJ2luLW91dCcsXG4gICAgVXNlciA9ICd1c2VyJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBSb2xlIG9mIGEgZmllbGQuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWVsZFJvbGVUeXBlIHtcbiAgICBEaW1lbnNpb24gPSAnZGltZW5zaW9uJyxcbiAgICBNZWFzdXJlID0gJ21lYXN1cmUnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICAvKipcbiAgICogQW4gZW51bWVyYXRpb24gb2YgdGhlIHZhbGlkIHR5cGVzIG9mIGZpbHRlcnMgdGhhdCBjYW4gYmUgYXBwbGllZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlclR5cGUge1xuICAgIENhdGVnb3JpY2FsID0gJ2NhdGVnb3JpY2FsJyxcbiAgICBSYW5nZSA9ICdyYW5nZScsXG4gICAgSGllcmFyY2hpY2FsID0gJ2hpZXJhcmNoaWNhbCcsXG4gICAgUmVsYXRpdmVEYXRlID0gJ3JlbGF0aXZlLWRhdGUnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaWZmZXJlbnQgdXBkYXRlIHR5cGVzIGZvciBhcHBseWluZyBmaWx0ZXJcbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlclVwZGF0ZVR5cGUge1xuICAgIEFkZCA9ICdhZGQnLFxuICAgIEFsbCA9ICdhbGwnLFxuICAgIFJlcGxhY2UgPSAncmVwbGFjZScsXG4gICAgUmVtb3ZlID0gJ3JlbW92ZScsXG4gIH1cblxuICAvKipcbiAgICogVGhlIGRvbWFpbiB0eXBlIGZvciBhIGZpbHRlclxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmlsdGVyRG9tYWluVHlwZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRvbWFpbiB2YWx1ZXMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gdGhlIHNwZWNpZmllZCBmaWx0ZXJcbiAgICAgKiBpLmUuIHRoZSBkb21haW4gaXMgcmVzdHJpY3RlZCBieSBhIHByZXZpb3VzIGZpbHRlclxuICAgICAqL1xuICAgIFJlbGV2YW50ID0gJ3JlbGV2YW50JyxcbiAgICAvKipcbiAgICAgKiBsaXN0IG9mIGFsbCBwb3NzaWJsZSBkb21haW4gdmFsdWVzIGZyb20gZGF0YWJhc2VcbiAgICAgKi9cbiAgICBEYXRhYmFzZSA9ICdkYXRhYmFzZScsXG4gIH1cblxuICAvKipcbiAgICogVGhlIG9wdGlvbiBmb3Igc3BlY2lmeWluZyB3aGljaCB2YWx1ZXMgdG8gaW5jbHVkZSBmb3IgZmlsdGVyaW5nXG4gICAqIEluZGljYXRlcyB3aGF0IHRvIGRvIHdpdGggbnVsbCB2YWx1ZXMgZm9yIGEgZ2l2ZW4gZmlsdGVyIG9yIG1hcmsgc2VsZWN0aW9uIGNhbGwuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJOdWxsT3B0aW9uIHtcbiAgICBOdWxsVmFsdWVzID0gJ251bGwtdmFsdWVzJyxcbiAgICBOb25OdWxsVmFsdWVzID0gJ25vbi1udWxsLXZhbHVlcycsXG4gICAgQWxsVmFsdWVzID0gJ2FsbC12YWx1ZXMnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCBzZXJ2ZXMgYXMgYSBmaWx0ZXIgb24gdGhlIERhdGFWYWx1ZXMgcmV0dXJuZWQgZnJvbSBgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luY2AsXG4gICAqIGBnZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyQXN5bmNgIGFuZCBgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jYC5cbiAgICogVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gb2YgcmV0dXJuZWQgZGF0YSB2YWx1ZXMgb25seS4gVGFibGVhdSB2ZXJzaW9ucyBwcmlvciB0byAyMDIxLjJcbiAgICogd2lsbCBwYXNzIHRoZSBkYXRhIGFjcm9zcyBhbmQgcG9wdWxhdGUgdGhlIERhdGFWYWx1ZSBwcm9wZXJ0aWVzLlxuICAgKiBQbGVhc2Ugbm90ZSB0aGF0IGFsbCBwcm9wZXJ0aWVzIG5vdCByZXF1ZXN0ZWQgd2lsbCBiZSBgdW5kZWZpbmVkYCBpbiB0aGUgRGF0YVZhbHVlIHJlc3VsdHMuXG4gICAqIEBzaW5jZSAxLjUuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24ge1xuICAgIC8qKiBEYXRhVmFsdWVzIHdpbGwgaW5jbHVkZSBhbGwgcHJvcGVydGllcy4qL1xuICAgIEFsbFZhbHVlcyA9ICdhbGwtdmFsdWVzJyxcblxuICAgIC8qKiBEYXRhVmFsdWVzIHdpbGwgb25seSBpbmNsdWRlIHZhbHVlIGFuZCBuYXRpdmVWYWx1ZSBwcm9wZXJ0aWVzLiovXG4gICAgT25seU5hdGl2ZVZhbHVlcyA9ICdvbmx5LW5hdGl2ZS12YWx1ZXMnLFxuXG4gICAgLyoqIERhdGFWYWx1ZXMgd2lsbCBvbmx5IGluY2x1ZGUgZm9ybWF0dGVkVmFsdWUgcHJvcGVydGllcy4gKi9cbiAgICBPbmx5Rm9ybWF0dGVkVmFsdWVzID0gJ29ubHktZm9ybWF0dGVkLXZhbHVlcycsXG4gIH1cblxuICAvKipcbiAgICogVHlwZSBvZiBtYXJrIGZvciBhIGdpdmVuIG1hcmtzIGNhcmQgaW4gYSB2aXouXG4gICAqL1xuICBleHBvcnQgZW51bSBNYXJrVHlwZSB7XG4gICAgQmFyID0gJ2JhcicsXG4gICAgTGluZSA9ICdsaW5lJyxcbiAgICBBcmVhID0gJ2FyZWEnLFxuICAgIFNxdWFyZSA9ICdzcXVhcmUnLFxuICAgIENpcmNsZSA9ICdjaXJjbGUnLFxuICAgIFNoYXBlID0gJ3NoYXBlJyxcbiAgICBUZXh0ID0gJ3RleHQnLFxuICAgIE1hcCA9ICdtYXAnLFxuICAgIFBpZSA9ICdwaWUnLFxuICAgIEdhbnR0QmFyID0gJ2dhbnR0LWJhcicsXG4gICAgUG9seWdvbiA9ICdwb2x5Z29uJyxcbiAgICBIZWF0bWFwID0gJ2hlYXRtYXAnLFxuICAgIFZpekV4dGVuc2lvbiA9ICd2aXotZXh0ZW5zaW9uJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIERhdGFGb3JtYXRUeXBlIHtcbiAgICBBdXRvRm9ybWF0ID0gJ2F1dG8tZm9ybWF0JyxcbiAgICBTeXN0ZW1OdW1iZXIgPSAnc3lzdGVtLW51bWJlcicsXG4gICAgU3lzdGVtQ3VycmVuY3kgPSAnc3lzdGVtLWN1cnJlbmN5JyxcbiAgICBTeXN0ZW1Mb25nRGF0ZSA9ICdzeXN0ZW0tbG9uZy1kYXRlJyxcbiAgICBTeXN0ZW1TaG9ydERhdGUgPSAnc3lzdGVtLXNob3J0LWRhdGUnLFxuICAgIFN5c3RlbVRpbWUgPSAnc3lzdGVtLXRpbWUnLFxuICAgIEN1c3RvbSA9ICdjdXN0b20nLFxuICAgIEN1c3RvbU51bWJlciA9ICdjdXN0b20tbnVtYmVyJyxcbiAgICBDdXN0b21DdXJyZW5jeSA9ICdjdXN0b20tY3VycmVuY3knLFxuICAgIEN1c3RvbVNjaWVudGlmaWMgPSAnY3VzdG9tLXNjaWVudGlmaWMnLFxuICAgIEN1c3RvbVBlcmNlbnRhZ2UgPSAnY3VzdG9tLXBlcmNlbnRhZ2UnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gTnVtYmVyRm9ybWF0VW5pdHMge1xuICAgIE5vbmUgPSAndW5pdHMtbm9uZScsXG4gICAgVGhvdXNhbmRzID0gJ3VuaXRzLXRob3VzYW5kcycsXG4gICAgTWlsbGlvbnMgPSAndW5pdHMtbWlsbGlvbnMnLFxuICAgIEJpbGxpb25zRW5nbGlzaCA9ICd1bml0cy1iaWxsaW9ucy1lbmdsaXNoJyxcbiAgICBCaWxsaW9uc1N0YW5kYXJkID0gJ3VuaXRzLWJpbGxpb25zLXN0YW5kYXJkJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIE5lZ2F0aXZlTnVtYmVyRm9ybWF0IHtcbiAgICBBdXRvbWF0aWMgPSAnYXV0b21hdGljJyxcbiAgICBQYXJlbnRoZXNlcyA9ICdwYXJlbnRoZXNlcycsXG4gICAgT3V0ZXJQcmVmaXggPSAnb3V0ZXItcHJlZml4JyxcbiAgICBPdXRlclN1ZmZpeCA9ICdvdXRlci1zdWZmaXgnLFxuICAgIElubmVyUHJlZml4ID0gJ2lubmVyLXByZWZpeCcsXG4gICAgSW5uZXJTdWZmaXggPSAnaW5uZXItc3VmZml4JyxcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgYWxsb3dhYmxlIHZhbHVlcy5cbiAgICogVGhpcyBpcyB1c2VkIGZvciByZXN0cmljdGluZyB0aGUgZG9tYWluIG9mIGEgcGFyYW1ldGVyXG4gICAqL1xuICBleHBvcnQgZW51bSBQYXJhbWV0ZXJWYWx1ZVR5cGUge1xuICAgIEFsbCA9ICdhbGwnLFxuICAgIExpc3QgPSAnbGlzdCcsXG4gICAgUmFuZ2UgPSAncmFuZ2UnLFxuICB9XG5cbiAgLyoqXG4gICAqIERhdGUgcGVyaW9kIHVzZWQgaW4gZmlsdGVycyBhbmQgaW4gcGFyYW1ldGVycy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIFBlcmlvZFR5cGUge1xuICAgIFllYXJzID0gJ3llYXJzJyxcbiAgICBRdWFydGVycyA9ICdxdWFydGVycycsXG4gICAgTW9udGhzID0gJ21vbnRocycsXG4gICAgV2Vla3MgPSAnd2Vla3MnLFxuICAgIERheXMgPSAnZGF5cycsXG4gICAgSG91cnMgPSAnaG91cnMnLFxuICAgIE1pbnV0ZXMgPSAnbWludXRlcycsXG4gICAgU2Vjb25kcyA9ICdzZWNvbmRzJyxcbiAgICBJc29ZZWFycyA9ICdpc28teWVhcnMnLFxuICAgIElzb1F1YXJ0ZXJzID0gJ2lzby1xdWFydGVycycsXG4gICAgSXNvV2Vla3MgPSAnaXNvLXdlZWtzJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIFF1aWNrVGFibGVDYWxjVHlwZSB7XG4gICAgUnVubmluZ1RvdGFsID0gJ3J1bm5pbmctdG90YWwnLFxuICAgIERpZmZlcmVuY2UgPSAnZGlmZmVyZW5jZScsXG4gICAgUGVyY2VudERpZmZlcmVuY2UgPSAncGVyY2VudC1kaWZmZXJlbmNlJyxcbiAgICBQZXJjZW50T2ZUb3RhbCA9ICdwZXJjZW50LW9mLXRvdGFsJyxcbiAgICBSYW5rID0gJ3JhbmsnLFxuICAgIFBlcmNlbnRpbGUgPSAncGVyY2VudGlsZScsXG4gICAgTW92aW5nQXZlcmFnZSA9ICdtb3ZpbmctYXZlcmFnZScsXG4gICAgWVREVG90YWwgPSAneXRkLXRvdGFsJyxcbiAgICBDb21wb3VuZEdyb3d0aFJhdGUgPSAnY29tcG91bmQtZ3Jvd3RoLXJhdGUnLFxuICAgIFllYXJPdmVyWWVhckdyb3d0aCA9ICd5ZWFyLW92ZXIteWVhci1ncm93dGgnLFxuICAgIFlUREdyb3d0aCA9ICd5dGQtZ3Jvd3RoJyxcbiAgICBVbmRlZmluZWQgPSAndW5kZWZpbmVkJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Rpb24gdHlwZSBmb3Igc2VsZWN0IG1hcmtzIGFwaS5cbiAgICovXG4gIGV4cG9ydCBlbnVtIFNlbGVjdGlvblVwZGF0ZVR5cGUge1xuICAgIFJlcGxhY2UgPSAnc2VsZWN0LXJlcGxhY2UnLFxuICAgIEFkZCA9ICdzZWxlY3QtYWRkJyxcbiAgICBSZW1vdmUgPSAnc2VsZWN0LXJlbW92ZScsXG4gIH1cblxuICAvKipcbiAgICogRW51bSBmb3Igc3BlY2lmeWluZyB0aGUgc2VsZWN0IG9wdGlvbiBmb3IgdGhlIGBleHRlbnNpb25zLldvcmtzaGVldC5zZWxlY3RUdXBsZXNBc3luY2AgbWV0aG9kLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gU2VsZWN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGV4aXN0aW5nIHNlbGVjdGlvbiBiZWZvcmUgc2VsZWN0aW5nIHRoZSB0dXBsZXMgc3BlY2lmaWVkXG4gICAgICovXG4gICAgU2ltcGxlID0gJ3NlbGVjdC1vcHRpb25zLXNpbXBsZScsXG4gICAgLyoqXG4gICAgICogQWRkcyBzcGVjaWZpZWQgdHVwbGVzIHRvIHRoZSBleGlzdGluZyBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBUb2dnbGUgPSAnc2VsZWN0LW9wdGlvbnMtdG9nZ2xlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBzaGVldCBhIFtbU2hlZXRdXSBvYmplY3QgcmVwcmVzZW50c1xuICAgKi9cbiAgZXhwb3J0IGVudW0gU2hlZXRUeXBlIHtcbiAgICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgICBTdG9yeSA9ICdzdG9yeScsXG4gICAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG4gIH1cblxuICBleHBvcnQgZW51bSBTb3J0RGlyZWN0aW9uIHtcbiAgICBJbmNyZWFzaW5nID0gJ2luY3JlYXNpbmcnLFxuICAgIERlY3JlYXNpbmcgPSAnZGVjcmVhc2luZycsXG4gIH1cblxuICBleHBvcnQgZW51bSBUcmVuZExpbmVNb2RlbFR5cGUge1xuICAgIExpbmVhciA9ICdsaW5lYXInLFxuICAgIExvZ2FyaXRobWljID0gJ2xvZ2FyaXRobWljJyxcbiAgICBFeHBvbmVudGlhbCA9ICdleHBvbmVudGlhbCcsXG4gICAgUG9seW5vbWlhbCA9ICdwb2x5bm9taWFsJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgcmVwbGF5IHNwZWVkIG9mIGFuIGFuaW1hdGlvbi5cbiAgICogQHNpbmNlIDEuNy4wXG4gICAqL1xuICBleHBvcnQgZW51bSBSZXBsYXlTcGVlZFR5cGUge1xuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDAuNXguKi9cbiAgICBTbG93ID0gJ3Nsb3cnLFxuXG4gICAgLyoqIFVzZWQgZm9yIHNldHRpbmcgdGhlIHJlcGxheSBzcGVlZCBvZiBhbiBhbmltYXRpb24gdG8gMS4weC4qL1xuICAgIE5vcm1hbCA9ICdub3JtYWwnLFxuXG4gICAgLyoqIFVzZWQgZm9yIHNldHRpbmcgdGhlIHJlcGxheSBzcGVlZCBvZiBhbiBhbmltYXRpb24gdG8gMi4weC4qL1xuICAgIEZhc3QgPSAnZmFzdCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiBhIGxldmVsIGluIGEgaGllcmFyY2hpY2FsIGZpbHRlclxuICAgKiBAc2luY2UgRXh0ZW5zaW9ucyAxLjEwLjBcbiAgICovXG4gIGV4cG9ydCBlbnVtIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUge1xuICAgIEFsbFNlbGVjdGVkID0gJ2FsbC1zZWxlY3RlZCcsXG4gICAgTm9uZVNlbGVjdGVkID0gJ25vbmUtc2VsZWN0ZWQnLFxuICAgIFNvbWVTZWxlY3RlZCA9ICdzb21lLXNlbGVjdGVkJyxcbiAgICBVbmtub3duU2VsZWN0ZWQgPSAndW5rbm93bi1zZWxlY3RlZCcsXG4gIH1cblxuICAvKipcbiAgICogWm9uZVZpc2liaWxpdHlUeXBlXG4gICAqIEBkZXByZWNhdGVkIHVzZSBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZVxuICAgKi9cbiAgZXhwb3J0IGRlY2xhcmUgdHlwZSBab25lVmlzaWJpbGl0eVR5cGUgPSBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZTtcbiAgZXhwb3J0IGNvbnN0IFpvbmVWaXNpYmlsaXR5VHlwZSA9IHsgLi4uRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUgfTtcbn1cbmV4cG9ydCA9IFRhYmxlYXU7XG4iLCJpbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uL0V4dGVuc2lvbnMvU2hlZXRJbnRlcmZhY2VzJztcbmltcG9ydCB7IERhdGFUYWJsZSB9IGZyb20gJy4vRGF0YVRhYmxlSW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBGaWx0ZXJOdWxsT3B0aW9uLCBNYXJrVHlwZSB9IGZyb20gJy4vTmFtZXNwYWNlcy9UYWJsZWF1JztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBtYXJrcyBvbiBhIHZpei4gVGhpcyBjb2xsZWN0aW9uIGNvdWxkIGJlXG4gKiBtYXJrcyB0aGF0IGFyZSBlaXRoZXIgc2VsZWN0ZWQgb3IgaGlnaGxpZ2h0ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFya3NDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zICBBIGNvbGxlY3Rpb24gb2YgZGF0YSB0YWJsZXMuIEVhY2ggcm93IGluIGVhY2ggZGF0YSB0YWJsZSByZXByZXNlbnRzIGEgc2luZ2xlXG4gICAqICAgICAgICAgICBtYXJrIG9uIHRoZSB2aXouIFNpbmNlIG1hcmtzIGNhbiBjb250YWluIGNvbHVtbnMgZGlmZmVyZW50IHRoYW4gdGhlIGNvbHVtbnMgb2YgYW5vdGhlciBtYXJrLFxuICAgKiAgICAgICAgICAgZm9yIGV4YW1wbGUsIGEgZHVhbCBheGlzIGNoYXJ0LCBlYWNoIHRhYmxlIHJlcHJlc2VudHMgb25lIHNwZWNpZmljIHNjaGVtYSBvZiBhIG1hcmsuXG4gICAqL1xuICByZWFkb25seSBkYXRhOiBBcnJheTxEYXRhVGFibGU+O1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBtYXJrIGluIGEgd29ya3NoZWV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtJbmZvIHtcbiAgLyoqXG4gICAqIEBiZXRhXG4gICAqIEByZXR1cm5zICBUaGUgdHlwZSBvZiB0aGlzIG1hcmsuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBNYXJrVHlwZTtcblxuICAvKipcbiAgICogQGJldGFcbiAgICogQHJldHVybnMgIFRoZSBSR0JBIHZhbHVlIG9mIHRoaXMgbWFyay5cbiAgICovXG4gIHJlYWRvbmx5IGNvbG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBVbmlxdWUgdHVwbGUgcmVwcmVzZW50aW5nIHRoaXMgbWFyayBpbiBhIGRyYXduIHZpc3VhbGl6YXRpb24uXG4gICAqL1xuICB0dXBsZUlkPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFNlbGVjdGlvbkNyaXRlcmlhIGludGVyZmFjZSBpcyB1c2VkIHRvIHNwZWNpZnkgdG8gdGhlIGZpZWxkTmFtZSB0byB2YWx1ZXMgZm9yIEhpZXJhcmNoaWNhbCwgQ2F0ZWdvcmljYWwgYW5kIFJhbmdlIGJhc2VkIHNlbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0aW9uQ3JpdGVyaWEge1xuICAvKipcbiAgICogQGhpZGRlblxuICAgKiB0dXBsZUlkcyBhcmUgb2YgbnVtYmVyIHR5cGUuXG4gICAqL1xuICByZWFkb25seSB0dXBsZUlkPzogbnVtYmVyO1xuICAvKipcbiAgICogRmllbGRuYW1lIG9mIHRoZSBtYXJrIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgc2VsZWN0ZWQuXG4gICAqIEhpZXJhcmNoaWNhbCBmaWVsZHMgZm9sbG93IHRoZSBjb252ZW50aW9uIG9mIFwiW3twYXJlbnRGaWVsZH1dLlt7c2VsZWN0aW5nRmllbGR9XVwiXG4gICAqL1xuICByZWFkb25seSBmaWVsZE5hbWU6IHN0cmluZztcbiAgLyogdHNsaW50OmRpc2FibGU6bm8tYW55ICovXG4gIC8qKlxuICAgKiBWYWx1ZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIHNlbGVjdGVkLiBUaGlzIGNhbiBiZSBzcGVjaWZpZWQgYXMgdGhlIGxpc3Qgb2YgdmFsdWVzIG9yIGEgc2luZ2xlIHZhbHVlLlxuICAgKiBSYW5nZS1iYXNlZCBzZWxlY3Rpb25zIG5lZWQgdG8gcHJvdmlkZSB0aGUgdmFsdWUgaW4gdGhlIGZvcm1hdCBvZiBSYW5nZVZhbHVlIGludGVyZmFjZS5cbiAgICogVG8gc2VsZWN0IGEgc2luZ2xlIHF1YW50aXRhdGl2ZSB2YWx1ZSwgdXNlIHRoZSBSYW5nZVZhbHVlIGludGVyZmFjZSB3aGVyZSBib3RoIG1heCBhbmQgbWluIGFyZSB0aGUgdmFsdWUgeW91IHdhbnQgdG8gc2VsZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IENhdGVnb3JpY2FsVmFsdWUgfCBSYW5nZVZhbHVlO1xufVxuXG4vKipcbiAqIENhdGVnb3JpY2FsIHZhbHVlcyBmb3Igc2VsZWN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBDYXRlZ29yaWNhbFZhbHVlID0gc3RyaW5nIHwgQXJyYXk8c3RyaW5nPjtcblxuLyoqXG4gKiBSYW5nZVZhbHVlIGludGVyZmFjZSB0byBwcm92aWRlIHNlbGVjdGlvbiB2YWx1ZSBmb3IgcmFuZ2UgYmFzZWQgc2VsZWN0aW9ucy5cbiAqIFRoZSBhc3NvY2lhdGVkIGZpZWxkIHNob3VsZCBiZSBhIHF1YW50aXRhdGl2ZSBmaWVsZC5cbiAqIEZvciBEYXRlIFZhbHVlcywgVVRDIERhdGUgb2JqZWN0cyBhcmUgZXhwZWN0ZWQuIChpLmUuLCBgdmFyIG1pbiA9IG5ldyBEYXRlKERhdGUuVVRDKDE5OTksIDAsIDEpKWApLlxuICogV2hpbGUgZGF0ZSBzdHJpbmcgaW5wdXRzIHdvcmssIFVUQyBkYXRlIGlucHV0cyBhcmUgb2ZmaWNpYWxseSBzdXBwb3J0ZWQgZ29pbmcgZm9yd2FyZCBmb3IgUmFuZ2VWYWx1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZVZhbHVlIHtcbiAgLyoqXG4gICAqIG1pbiByYW5nZSB2YWx1ZSBmb3IgdGhlIHJhbmdlIGJhc2VkIHNlbGVjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbWluOiBudW1iZXIgfCBEYXRlO1xuICAvKipcbiAgICogbWF4IHJhbmdlIHZhbHVlIGZvciB0aGUgcmFuZ2UgYmFzZWQgc2VsZWN0aW9uXG4gICAqL1xuICByZWFkb25seSBtYXg6IG51bWJlciB8IERhdGU7XG4gIC8qKlxuICAgKiBJbmNsdWRpbmcgbnVsbG9wdGlvbnMgcGFyYW1ldGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgbnVsbE9wdGlvbj86IEZpbHRlck51bGxPcHRpb247XG59XG5cbi8qKlxuICogUHJvdmlkZXMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgaG93IHRvIGRpc3BsYXkgYSBUYWJsZWF1IHRvb2x0aXAuXG4gKiBAc2luY2UgMS4xMi4wIGFuZCBUYWJsZWF1IDIwMjQuMlxuICogQGNhdGVnb3J5IFZpeiBFeHRlbnNpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbHRpcENvbnRleHQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXJlIHRoZSB0b29sdGlwIHNob3VsZCBiZSBkaXNwbGF5ZWQgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZWZ0IG9mIHRoZSB2aXN1YWxpemF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdG9vbHRpcEFuY2hvclBvaW50OiBQb2ludDtcbn1cbiIsIi8qKlxuICogUmVwcmVzZW50cyBhIHdpZHRoIGFuZCBoZWlnaHQgaW4gcGl4ZWxzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpemUge1xuICAvKipcbiAgICogQHJldHVybnMgIEhlaWdodCBvZiB0aGUgc2l6ZSBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSBoZWlnaHQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQHJldHVybnMgIFdpZHRoIG9mIHRoZSBzaXplIG9iamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG59XG4iLCJpbXBvcnQgeyBGaWVsZEJhc2UgfSBmcm9tICcuL0RhdGFTb3VyY2VJbnRlcmZhY2VzJztcbmltcG9ydCB7IEVuY29kaW5nVHlwZSwgTWFya1R5cGUgfSBmcm9tICcuL05hbWVzcGFjZXMvVGFibGVhdSc7XG5cbi8qKlxuICogQHNpbmNlIDEuMTEuMFxuICogUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgZmllbGRzIG9uIHZhcmlvdXMgZW5jb2RpbmdzIGFzIHdlbGwgYXMgb3RoZXIgdml6IHNwZWNpZmljIGluZm9ybWF0aW9uIGZvciBhIHdvcmtzaGVldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpc3VhbFNwZWNpZmljYXRpb24ge1xuICByZWFkb25seSByb3dGaWVsZHM6IEZpZWxkSW5zdGFuY2VbXTtcbiAgcmVhZG9ubHkgY29sdW1uRmllbGRzOiBGaWVsZEluc3RhbmNlW107XG4gIHJlYWRvbmx5IGFjdGl2ZU1hcmtzU3BlY2lmaWNhdGlvbkluZGV4OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1hcmtzU3BlY2lmaWNhdGlvbnM6IE1hcmtzU3BlY2lmaWNhdGlvbltdO1xufVxuXG4vKipcbiAqIEBzaW5jZSAxLjExLjBcbiAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIGZpZWxkcyBvbiB2YXJpb3VzIGVuY29kaW5ncyBmb3IgYSBzaW5nbGUgbWFya3MgY2FyZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtzU3BlY2lmaWNhdGlvbiB7XG4gIHJlYWRvbmx5IHByaW1pdGl2ZVR5cGU6IE1hcmtUeXBlO1xuICByZWFkb25seSBlbmNvZGluZ3M6IEVuY29kaW5nW107XG59XG5cbi8qKlxuICogQHNpbmNlIDEuMTEuMFxuICogUmVwcmVzZW50cyBhIHNpbmdsZSBmaWVsZCBhbmQgaXRzIGFzc29jaWF0ZWQgZW5jb2Rpbmcgb24gYSBtYXJrcyBjYXJkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5jb2Rpbmcge1xuICAvKipcbiAgICogQHJldHVybnMgaW5idWlsdCBlbmNvZGluZyB0eXBlIG9yIHRoZSBjdXN0b20gZW5jb2RpbmdcbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSB1bmlxdWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVuY29kaW5ncyxcbiAgICogVGhpcyBhbGxvd3MgdG8gaWRlbnRpZnkgdGhlIGR1cGxpY2F0ZSBmaWVsZHMgdGhhdCBhcmUgYWRkZWQgdG8gZW5jb2RpbmdzLlxuICAgKiBAc2luY2UgMS4xMy4wXG4gICAqL1xuICByZWFkb25seSBmaWVsZEVuY29kaW5nSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgdHlwZSBvZiB0aGUgZW5jb2RpbmdcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IEVuY29kaW5nVHlwZTtcblxuICAvKipcbiAgICogQHJldHVybnMgRmllbGQgYW5kIGl0cyBwcm9wZXJ0aWVzXG4gICAqL1xuICByZWFkb25seSBmaWVsZDogRmllbGRJbnN0YW5jZTtcbn1cblxuLyoqXG4gKiBAc2luY2UgMS4xMS4wXG4gKiBSZXByZXNlbnRzIGEgZmllbGQgYW5kIGl0cyBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRJbnN0YW5jZSBleHRlbmRzIEZpZWxkQmFzZSB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgdW5pcXVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmaWVsZCBhY3Jvc3MgYWxsIGRhdGEgc291cmNlcyBpbiB0aGUgd29ya2Jvb2suIEluIHN1bW1hcnkgZGF0YSwgdGhpcyBpbmNsdWRlcyBhZ2dyZWdhdGlvbi5cbiAgICogTm90ZSB0aGF0IHRoZSBmaWVsZElkIGNvdWxkIGNoYW5nZSBpZiB5b3UgY2hhbmdlIHRoZSBkYXRhIHNvdXJjZS5cbiAgICogRm9yIGV4YW1wbGUgYWZ0ZXIgcmVwbGFjaW5nIHRoZSBkYXRhIHNvdXJjZSBbQ2xpcGJvYXJkXzIwMjEwMzA1VDE2NDAwMF0uW3N1bTpTYWxlczpxa10gY291bGQgYmVjb21lXG4gICAqIFtmZWRlcmF0ZWQuMTJ1c3VvcTExNzFvMWIxZWJkeWg2MGZqbmV2MV0uW3N1bTpTYWxlczpxa10uXG4gICAqL1xuICByZWFkb25seSBmaWVsZElkOiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgeyBDbGFzc05hbWVLZXkgfSBmcm9tICcuL05hbWVzcGFjZXMvVGFibGVhdSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya3NoZWV0Rm9ybWF0dGluZyB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyAgQW4gYXJyYXkgb2YgZm9ybWF0dGluZyBzaGVldHMgdGhhdCBjb250YWluIHRoZSBjc3MgcHJvcGVydGllcyBmb3IgYSB3b3Jrc2hlZXQuXG4gICAqIEBzaW5jZSAxLjI5LjAgYW5kIFRhYmxlYXUgMjAyNS4zXG4gICAqL1xuICByZWFkb25seSBmb3JtYXR0aW5nU2hlZXRzOiBBcnJheTxGb3JtYXR0aW5nU2hlZXQ+O1xufVxuXG4vKipcbiAqIFRoZSBXb3JrYm9vayBmb3JtYXR0aW5nIGNvbnRhaW5zIGFuIGFycmF5IG9mIEZvcm1hdHRpbmcgc2hlZXRzLlxuICogRWFjaCBvZiB0aGVzZSBzaGVldHMgY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlIENsYXNzTmFtZUtleSBhbmRcbiAqIGNvbnRhaW5zIHRoZSBDU1MgcHJvcGVydGllcyBuZWVkZWQgdG8gbWltaWMgdGhlIGZvcm1hdHRpbmcgb24geW91ciB3b3JrYm9vay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrYm9va0Zvcm1hdHRpbmcge1xuICAvKipcbiAgICogQHJldHVybnMgIEFuIGFycmF5IG9mIGZvcm1hdHRpbmcgc2hlZXRzIHRoYXQgY29udGFpbiB0aGUgY3NzIHByb3BlcnRpZXMgZm9yIGEgdGFibGVhdSB3b3JrYm9vay5cbiAgICogQHNpbmNlIDEuNy4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGluZ1NoZWV0czogQXJyYXk8Rm9ybWF0dGluZ1NoZWV0Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXR0aW5nU2hlZXQge1xuICAvKipcbiAgICogQHJldHVybnMgIElzIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgQ2xhc3NOYW1lS2V5IHdoaWNoIHJlcHJlc2VudHMgYSB0eXBlIG9mXG4gICAqIGZvcm1hdHRpbmcgaW4gYSB3b3JrYm9vazogV29ya3NoZWV0VGl0bGUsIFdvcmtzaGVldCwgVG9vbHRpcCwgU3RvcnlUaXRsZSwgYW5kIERhc2hib2FyZFRpdGxlLlxuICAgKiBAc2luY2UgMS43LjAgYW5kIFRhYmxlYXUgMjAyMS40XG4gICAqL1xuICByZWFkb25seSBjbGFzc05hbWVLZXk6IENsYXNzTmFtZUtleTtcbiAgcmVhZG9ubHkgY3NzUHJvcGVydGllczogUmVhY3QuQ1NTUHJvcGVydGllcztcbn1cbiIsIi8vIFRoaXMgZmlsZSByZS1leHBvcnRzIGV2ZXJ5dGhpbmcgd2hpY2ggaXMgcGFydCBvZiB0aGUgc2hhcmVkIGFwaSBwdWJsaWMgaW50ZXJmYWNlXG5cbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvQW5ub3RhdGlvbkludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9EYXRhU291cmNlSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0RhdGFUYWJsZUludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9FbnVtcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0Vudmlyb25tZW50SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0ZpbHRlckludGVyZmFjZXMnO1xuZXhwb3J0IHtcbiAgQW5hbHl0aWNzT2JqZWN0VHlwZSxcbiAgQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLFxuICBEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZSxcbiAgRGF0YUZvcm1hdFR5cGUsXG4gIERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlLFxuICBEaWFsb2dTdHlsZSxcbiAgRW5jb2RpbmdUeXBlLFxuICBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSxcbiAgRmlsdGVyRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbixcbiAgRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSxcbiAgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gIE1hcmtUeXBlLFxuICBOZWdhdGl2ZU51bWJlckZvcm1hdCxcbiAgTnVtYmVyRm9ybWF0VW5pdHMsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgUGVyaW9kVHlwZSxcbiAgUXVpY2tUYWJsZUNhbGNUeXBlLFxuICBSZXBsYXlTcGVlZFR5cGUsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gIFNlbGVjdE9wdGlvbnMsXG4gIFNoZWV0VHlwZSxcbiAgU29ydERpcmVjdGlvbixcbiAgVHJlbmRMaW5lTW9kZWxUeXBlLFxuICBab25lVmlzaWJpbGl0eVR5cGUsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvU2VsZWN0aW9uSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL1NoZWV0SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL1Zpc3VhbE1vZGVsSW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvV29ya2Jvb2tGb3JtYXR0aW5nSW50ZXJmYWNlcyc7XG4iLCIvKipcbiAqIFRoaXMgaXMgeW91ciBtYWluLiBUaGlzIGlzIHdoZXJlIHlvdSByZS1leHBvcnQgZXZlcnl0aGluZyB5b3Ugd2FudCB0byBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gKlxuICogVGhlIGJ1aWxkIGVuZm9yY2VzIHRoYXQgdGhlIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGlzIGV4cG9ydGVkLlxuICovXG5cbi8vIEV4cG9ydCB0aGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdG8gYmUgYXZhaWxhYmxlIGF0IHJ1bnRpbWVcbi8vICBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IHlhcm4gcHVibGlzaDpidW1wIHZpYSBzY3JpcHRzL3B1Ymxpc2gtY2hlY2sudHNcbi8vICB1cGRhdGVJbnRlcm5hbENvbnRyYWN0UnVudGltZVZlcnNpb24gaW4gdGhlIG1vbm9yZXBvIHJvb3QuXG5pbXBvcnQgKiBhcyBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbiBmcm9tICcuLi9pbnRlcm5hbC1jb250cmFjdC12ZXJzaW9uLmpzb24nO1xuZXhwb3J0IGNvbnN0IElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04gPSBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbjtcblxuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9EYXRhVHlwZUNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L0VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvTW9kZWxzJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L1BhcmFtZXRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9WZXJicyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9Bc2tEYXRhSW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9JbnRlcm5hbEFwaURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvUHVsc2VJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9WcWxJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvQ3Jvc3NGcmFtZU1lc3Nlbmdlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VMaXN0ZW5lcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzZW5nZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvVmVyc2lvbkNvbnZlcnRlckZhY3RvcnknO1xuXG4vLyBFeHBvcnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIG1lc3NhZ2luZyBmb3IgY29uc3VtZXJzIHRvIHVzZS5cbi8vIEJlIHZlcnkgY2FyZWZ1bCBtYWtpbmcgYW55IHVwZGF0ZXMgdG8gdGhpcyBjb250cmFjdCB3aGljaCBicmVhayB2ZXJzaW9uIGNvbXBhdGliaWxpdHkuXG5leHBvcnQgY29uc3QgTUVTU0FHSU5HX1ZFUlNJT04gPSB7XG4gIG1ham9yOiAxLFxuICBtaW5vcjogMCxcbiAgZml4OiAwLFxufTtcbiIsImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi9FbnVtcyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhVHlwZUNvbnZlcnRlciB7XG4gIHByaXZhdGUgc3RhdGljIGlzU3BlY2lhbCh2YWx1ZUFzU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBQcmlvciB0byBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyBjb21lIHRvIHVzIGFzXG4gICAgLy8gJyVudWxsJScsICclYWxsJScsICcld2lsZGNhcmQlJywgJyVtaXNzaW5nJScuLi5cbiAgICAvLyBXaGlsZSB0aGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcmV0dXJuIHRydWUgZm9yIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgY29udmVyc2lvbixcbiAgICAvLyBpdCBpcyBhcyBjaGVhcCBhcyBwYXNzaW5nIGFyb3VuZCBhIHZlcnNpb24gYW5kIGNoZWNraW5nIHRoYXQuXG4gICAgLy8gKFNlZSBEYXRhVmFsdWVGb3JtYXR0ZXIuY3BwKVxuXG4gICAgaWYgKHZhbHVlQXNTdHJpbmcubGVuZ3RoID4gMiAmJiB2YWx1ZUFzU3RyaW5nWzBdID09PSAnJScgJiYgdmFsdWVBc1N0cmluZ1t2YWx1ZUFzU3RyaW5nLmxlbmd0aCAtIDFdID09PSAnJScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzcGVjaWFsVmFsdWVJbmRpY2F0b3IgPSAnJW51bGwlJztcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHByaXZhdGUgc3RhdGljIHBhcnNlQm9vbGVhbihib29sZWFuU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHwgc3RyaW5nIHtcbiAgICAvLyBib29sZWFuIHZhbHVlcyBjb21lIHRvIHVzIGFzICd0cnVlJ3wnZmFsc2UnXG4gICAgY29uc3Qgbm9ybWFsaXplZEJvb2xlYW46IHN0cmluZyA9IGJvb2xlYW5TdHJpbmcudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gbm9ybWFsaXplZEJvb2xlYW4gIT09ICd0cnVlJyAmJiBub3JtYWxpemVkQm9vbGVhbiAhPT0gJ2ZhbHNlJyA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogbm9ybWFsaXplZEJvb2xlYW4gPT09ICd0cnVlJztcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VOdW1iZXIodmFsdWVBc1N0cmluZzogc3RyaW5nKTogbnVtYmVyIHwgc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IE51bWJlcih2YWx1ZUFzU3RyaW5nKTtcbiAgICByZXR1cm4gaXNOYU4odmFsdWUpID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlRGF0ZShkYXRlQXNTdHJpbmc6IHN0cmluZyk6IERhdGUgfCBudWxsIHtcbiAgICAvLyBOb3RlIHRoYXQgd2l0aG91dCBhIHRpbWUsIHRoZSBkYXRlIGlzIGFzc3VtZWQgdG8gYmUgVVRDXG4gICAgLy8gSW5wdXQgb2YgMjAyMC0wMy0yNSBpcyBwcmludGVkIGFzOiBNYXIgMjQgMjAyMCAxNzowMDowMCBHTVQtMDcwMFxuICAgIC8vIFRoaXMgbWF0Y2hlcyBzdHlsZSB1c2VkIGluIGV4aXN0aW5nIGNvbnZlcnRGaWx0ZXJWYWx1ZVByZXNNb2RlbFxuICAgIGNvbnN0IHZhbHVlID0gbmV3IERhdGUoZGF0ZUFzU3RyaW5nKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZURhdGVUaW1lKGRhdGVBc1N0cmluZzogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIC8vIFdpdGggYSB0aW1lLCB0aGUgZGF0ZSBpcyBhc3N1bWVkIHRvIGJlIFVUQy5cbiAgICAvLyBPdXIgZGF0ZSBmb3JtYXQgaXMgYWx3YXlzOiB5eXl5LW1tLWRkIGhoOm1tOnNzXG4gICAgLy8gVW5mb3J0dW5hdGVseSwgSUUxMSBjYW4ndCBwYXJzZSB0aGF0IGZvcm1hdCBzbyB3ZSBhZGQgYSBUIGJldHdlZW4gdGhlIGRheSBhbmQgdGltZS5cbiAgICAvLyBXZSBhbHNvIGFkZCBhIFogc28gdGhhdCBpdCBpcyBVVEMuIChXaXRob3V0IHRoZSBaLCBzb21lIGJyb3dzZXJzIGFzc3VtZSBsb2NhbCwgYW5kIG90aGVycyBVVEMpXG4gICAgLy8gRXZlbiB0aG91Z2ggd2UndmUgZHJvcHBlZCBzdXBwb3J0IGZvciBJRTExLCBpdCdzIHJpc2tpZXIvY29zdGxpZXIgdG8gbWFrZSB1cGRhdGVzIGhlcmUuXG4gICAgY29uc3QgZm9ybWF0dGVkRGF0ZVN0cmluZzogc3RyaW5nID0gZGF0ZUFzU3RyaW5nLnJlcGxhY2UoJyAnLCAnVCcpLmNvbmNhdCgnWicpO1xuICAgIGNvbnN0IHZhbHVlID0gbmV3IERhdGUoZm9ybWF0dGVkRGF0ZVN0cmluZyk7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTih2YWx1ZS5nZXRUaW1lKCkpID8gbnVsbCA6IHZhbHVlO1xuICB9XG5cbiAgLy8gSXQgd291bGQgYmUgbmljZSB0byBtZXJnZSB0aGlzIGFuZCB0aGUgbWV0aG9kIEZpbHRlckNvbnZlcnRlcjo6Y29udmVydEZpbHRlclZhbHVlUHJlc01vZGVsIGluIGFwaS1wbGF0Zm9ybS1qc1xuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRWYWx1ZUFzU3RyaW5nVG9WYWx1ZSh2YWx1ZUFzU3RyaW5nOiBzdHJpbmcsIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gVGhpcyBpcyBib3RoIERhdGFEaWN0aW9uYXJ5IGFuZCBTaG93RGF0YVRhYmxlUHJlc01vZGVsIGNvbXBhdGlibGUuXG4gICAgLy8gSW4gdGhlIERhdGFEaWN0aW9uYXJ5LCB2YWx1ZUFzU3RyaW5nIGNhbiBiZSAnJW51bGwlJyBvciAnJW1pc3NpbmclJywgd2hpbGUgaW5cbiAgICAvLyBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCB3ZSBjYW4gZ2V0ICdudWxsJyBvciAnbWlzc2luZycsIG9yICclbnVsbCUnIGZvciBzdHJpbmcgc3BlY2lhbCB2YWx1ZXMuXG4gICAgLy8gRm9yIGVpdGhlciBvZiB0aGVzZSBjYXNlcywgd2UgcmV0dXJuIHNwZWNpYWxWYWx1ZUluZGljYXRvciAob3IgdGhlIG9yaWdpbmFsIHNwZWNpYWwgc3RyaW5nKS5cbiAgICAvLyBUbyBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbHR5LCB0aGlzIGNvbnZlcnRlcjpcbiAgICAvLyAxLiByZXR1cm5zIGEgc3RyaW5nIGZvciBhbnkgc3BlY2lhbCB2YWx1ZXNcbiAgICAvLyAyLiByZXR1cm5zIGEgc3RyaW5nIGZvciBhbnkgZGF0ZVxuXG4gICAgLy8gUGFyYW1ldGVyIG1pbi9tYXggdmFsdWVzIGNhbiBiZSB1bmRlZmluZWQsIHNvIHJlc3VsdCBpcyBhbHNvIHVuZGVmaW5lZFxuICAgIGlmICh2YWx1ZUFzU3RyaW5nID09PSB1bmRlZmluZWQgfHwgdmFsdWVBc1N0cmluZyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1NwZWNpYWwodmFsdWVBc1N0cmluZykpIHtcbiAgICAgIHJldHVybiB2YWx1ZUFzU3RyaW5nO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBEYXRhVHlwZS5Cb29sOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUJvb2xlYW4odmFsdWVBc1N0cmluZyk7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuSW50OlxuICAgICAgY2FzZSBEYXRhVHlwZS5GbG9hdDpcbiAgICAgICAgLy8gUmV0dXJuIHNwZWNpYWwgdmFsdWUgJyVudWxsJScgZm9yIGFueSBmYWlsdXJlIGluIHBhcnNpbmcuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhhdCBiZWNhdXNlIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgd2lsbCBnaXZlIHVzIHN0cmluZ3MgbGlrZSAnbnVsbCdcbiAgICAgICAgLy8gZm9yIHNwZWNpYWwgdmFsdWVzLlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU51bWJlcih2YWx1ZUFzU3RyaW5nKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlOlxuICAgICAgICAvLyBGb3IgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCwgc3BlY2lhbCB2YWx1ZXMgd2lsbCBiZSBcIm51bGxcIiB3aGljaCB3aWxsIGZhaWwgdG8gcGFyc2UuXG4gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgcmV0dXJuICclbnVsbCUnLlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGUodmFsdWVBc1N0cmluZykgPT09IG51bGwgPyB0aGlzLnNwZWNpYWxWYWx1ZUluZGljYXRvciA6IHZhbHVlQXNTdHJpbmc7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZVRpbWU6XG4gICAgICAgIC8vIEZvciBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyB3aWxsIGJlIFwibnVsbFwiIHdoaWNoIHdpbGwgZmFpbCB0byBwYXJzZS5cbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSByZXR1cm4gJyVudWxsJSdcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlVGltZSh2YWx1ZUFzU3RyaW5nKSA9PT0gbnVsbCA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogdmFsdWVBc1N0cmluZztcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TcGF0aWFsOlxuICAgICAgY2FzZSBEYXRhVHlwZS5TdHJpbmc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWVBc1N0cmluZztcbiAgICB9XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSh2YWx1ZTogYW55LCB0eXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4gfCBudW1iZXIgfCBEYXRlIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVGhpcyBjb252ZXJ0cyBmcm9tIG91ciAxLjIgQVBJIHRoYXQgcmV0dXJucyBzdHJpbmdzIGZvciBzcGVjaWFscywgYW5kIGRhdGVzIGFzIHN0cmluZ3MuXG4gICAgLy8gSXQgdGFrZXMgdGhlIHNwZWNpYWwgY2FzZSBvZiAnJW51bGwlJyBhbmQgcmV0dXJucyBhIG51bGwuXG4gICAgLy8gRm9yIGRhdGVzLCBpdCByZXR1cm5zIGEgRGF0ZSBvYmplY3QgcmF0aGVyIHRoYW4gYSBzdHJpbmcuXG4gICAgLy8gY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSBzaG91bGQgYmUgdXNlZCB0byBidWlsZCBhIERhdGFWYWx1ZS5uYXRpdmVWYWx1ZSBmaWVsZC5cblxuICAgIC8vIFBhcmFtZXRlciBtaW4vbWF4IGNhbiBiZSB1bmRlZmluZWQuIElmIHRoYXQgaXMgdGhlIGNhc2UsIG5hdGl2ZVZhbHVlIGlzIHRyZWF0ZWQgbGlrZSBhIHNwZWNpYWxcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIERhdGFUeXBlLkJvb2w6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gbnVsbCA6IHZhbHVlO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkludDpcbiAgICAgIGNhc2UgRGF0YVR5cGUuRmxvYXQ6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gbnVsbCA6IHZhbHVlO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGU6XG4gICAgICAgIC8vIENvbnZlcnQgdGhlIHN0cmluZyB0byBEYXRlIG9iamVjdCAob3IgbnVsbCBpZiBwYXJzaW5nIGZhaWxzIC4uLiB3ZSBhc3N1bWUgc3BlY2lhbClcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlKHZhbHVlKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgLy8gQ29udmVydCB0aGUgc3RyaW5nIHRvIERhdGUgb2JqZWN0IChvciBudWxsIGlmIHBhcnNpbmcgZmFpbHMgLi4uIHdlIGFzc3VtZSBzcGVjaWFsKVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGVUaW1lKHZhbHVlKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TdHJpbmc6XG4gICAgICAgIHJldHVybiB0aGlzLmlzU3BlY2lhbCh2YWx1ZSkgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuU3BhdGlhbDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFN0cmluZ1ZhbHVlVG9OYXRpdmVWYWx1ZSh2YWx1ZTogc3RyaW5nLCB0eXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4gfCBudW1iZXIgfCBEYXRlIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIGZyb20gc3RyaW5nIGRpcmVjdGx5IHRvIG5hdGl2ZSB2YWx1ZSBmb3IgYWxsIHR5cGVzXG4gICAgcmV0dXJuIHRoaXMuY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSh0aGlzLmNvbnZlcnRWYWx1ZUFzU3RyaW5nVG9WYWx1ZSh2YWx1ZSwgdHlwZSksIHR5cGUpO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBFeHRlbnNpb25Db250ZXh0IHtcbiAgRGVza3RvcCA9ICdkZXNrdG9wJyxcbiAgU2VydmVyID0gJ3NlcnZlcicsXG4gIFVua25vd24gPSAndW5rbm93bicsXG4gIENsb3VkID0gJ2Nsb3VkJyxcbiAgUHVibGljV2ViID0gJ3B1YmxpYy13ZWInLFxuICBQdWJsaWNEZXNrdG9wID0gJ3B1YmxpYy1kZXNrdG9wJyxcbn1cblxuZXhwb3J0IGVudW0gRXh0ZW5zaW9uTW9kZSB7XG4gIEF1dGhvcmluZyA9ICdhdXRob3JpbmcnLFxuICBWaWV3aW5nID0gJ3ZpZXdpbmcnLFxuICBVbmtub3duID0gJ3Vua25vd24nLFxufVxuXG5leHBvcnQgZW51bSBFeHBvcnRlZE1lZGlhVHlwZSB7XG4gIEltYWdlID0gJ2ltYWdlJyxcbiAgUGRmID0gJ3BkZicsXG4gIFN2ZyA9ICdzdmcnLFxuICBIdG1sID0gJ2h0bWwnLFxuICBQb3dlclBvaW50ID0gJ3Bvd2VycG9pbnQnLFxuICBFeGNlbCA9ICdleGNlbCcsXG59XG5cbmV4cG9ydCBlbnVtIEFubm90YXRlRW51bSB7XG4gIE1hcmsgPSAnbWFyaycsXG4gIFBvaW50ID0gJ3BvaW50JyxcbiAgQXJlYSA9ICdhcmVhJyxcbn1cblxuZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG4gIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgQ29udGludW91cyA9ICdjb250aW51b3VzJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbn1cblxuZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VHlwZSB7XG4gIEJsYW5rID0gJ2JsYW5rJyxcbiAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG4gIFF1aWNrRmlsdGVyID0gJ3F1aWNrLWZpbHRlcicsXG4gIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICBQYWdlRmlsdGVyID0gJ3BhZ2UtZmlsdGVyJyxcbiAgTGVnZW5kID0gJ2xlZ2VuZCcsXG4gIFRpdGxlID0gJ3RpdGxlJyxcbiAgVGV4dCA9ICd0ZXh0JyxcbiAgSW1hZ2UgPSAnaW1hZ2UnLFxuICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgRXh0ZW5zaW9uID0gJ2V4dGVuc2lvbicsXG59XG5cbmV4cG9ydCBlbnVtIERhdGFUeXBlIHtcbiAgU3RyaW5nID0gJ3N0cmluZycsXG4gIEludCA9ICdpbnQnLFxuICBGbG9hdCA9ICdmbG9hdCcsXG4gIEJvb2wgPSAnYm9vbCcsXG4gIERhdGUgPSAnZGF0ZScsXG4gIERhdGVUaW1lID0gJ2RhdGUtdGltZScsXG4gIFNwYXRpYWwgPSAnc3BhdGlhbCcsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbmV4cG9ydCBlbnVtIERpYWxvZ1N0eWxlIHtcbiAgV2luZG93ID0gJ3dpbmRvdycsXG4gIE1vZGFsID0gJ21vZGFsJyxcbiAgTW9kZWxlc3MgPSAnbW9kZWxlc3MnLFxufVxuXG5leHBvcnQgZW51bSBFbmNvZGVkRGF0YVR5cGUge1xuICBOdW1iZXIgPSAnbnVtYmVyJyxcbiAgU3RyaW5nID0gJ3N0cmluZycsXG4gIERhdGUgPSAnZGF0ZScsXG4gIEJvb2xlYW4gPSAnYm9vbGVhbicsXG59XG5cbmV4cG9ydCBlbnVtIEVycm9yQ29kZXMge1xuICBJTklUSUFMSVpBVElPTl9FUlJPUiA9ICdpbml0aWFsaXphdGlvbi1lcnJvcicsXG4gIElOVEVSTkFMX0VSUk9SID0gJ2ludGVybmFsLWVycm9yJyxcbiAgTUlTU0lOR19FTlVNX01BUFBJTkcgPSAnbWlzc2luZy1lbnVtLW1hcHBpbmcnLFxuICBNSVNTSU5HX1BBUkFNRVRFUiA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gIFBFUk1JU1NJT05fREVOSUVEID0gJ3Blcm1pc3Npb24tZGVuaWVkJyxcbiAgUFJFU19NT0RFTF9QQVJTSU5HX0VSUk9SID0gJ3ByZXMtbW9kZWwtcGFyc2luZy1lcnJvcicsXG4gIFZFUlNJT05fTk9UX0NPTkZJR1VSRUQgPSAndmVyc2lvbi1ub3QtY29uZmlndXJlZCcsXG4gIFZJU0lCSUxJVFlfRVJST1IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gIFVOS05PV05fVkVSQl9JRCA9ICd1bmtub3duLXZlcmItaWQnLFxufVxuXG5leHBvcnQgZW51bSBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSB7XG4gIFN1bSA9ICdzdW0nLFxuICBBdmcgPSAnYXZnJyxcbiAgTWluID0gJ21pbicsXG4gIE1heCA9ICdtYXgnLFxuICBTdGRldiA9ICdzdGRldicsXG4gIFN0ZGV2cCA9ICdzdGRldnAnLFxuICBWYXIgPSAndmFyJyxcbiAgVmFycCA9ICd2YXJwJyxcbiAgQ29sbGVjdCA9ICdjb2xsZWN0JyxcbiAgQ291bnQgPSAnY291bnQnLFxuICBDb3VudGQgPSAnY291bnRkJyxcbiAgTWVkaWFuID0gJ21lZGlhbicsXG4gIEF0dHIgPSAnYXR0cicsXG4gIE5vbmUgPSAnbm9uZScsXG4gIFllYXIgPSAneWVhcicsXG4gIFF0ciA9ICdxdHInLFxuICBNb250aCA9ICdtb250aCcsXG4gIERheSA9ICdkYXknLFxuICBIb3VyID0gJ2hvdXInLFxuICBNaW51dGUgPSAnbWludXRlJyxcbiAgU2Vjb25kID0gJ3NlY29uZCcsXG4gIFdlZWsgPSAnd2VlaycsXG4gIFdlZWtkYXkgPSAnd2Vla2RheScsXG4gIE1vbnRoWWVhciA9ICdtb250aC15ZWFyJyxcbiAgTWR5ID0gJ21keScsXG4gIEVuZCA9ICdlbmQnLFxuICBUcnVuY1llYXIgPSAndHJ1bmMteWVhcicsXG4gIFRydW5jUXRyID0gJ3RydW5jLXF0cicsXG4gIFRydW5jTW9udGggPSAndHJ1bmMtbW9udGgnLFxuICBUcnVuY1dlZWsgPSAndHJ1bmMtd2VlaycsXG4gIFRydW5jRGF5ID0gJ3RydW5jLWRheScsXG4gIFRydW5jSG91ciA9ICd0cnVuYy1ob3VyJyxcbiAgVHJ1bmNNaW51dGUgPSAndHJ1bmMtbWludXRlJyxcbiAgVHJ1bmNTZWNvbmQgPSAndHJ1bmMtc2Vjb25kJyxcbiAgUXVhcnQxID0gJ3F1YXJ0MScsXG4gIFF1YXJ0MyA9ICdxdWFydDMnLFxuICBTa2V3bmVzcyA9ICdza2V3bmVzcycsXG4gIEt1cnRvc2lzID0gJ2t1cnRvc2lzJyxcbiAgSW5PdXQgPSAnaW4tb3V0JyxcbiAgVXNlciA9ICd1c2VyJyxcbn1cblxuZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gIERpbWVuc2lvbiA9ICdkaW1lbnNpb24nLFxuICBNZWFzdXJlID0gJ21lYXN1cmUnLFxuICBVbmtub3duID0gJ3Vua25vd24nLFxufVxuXG4vKipcbiAqICBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyLlxuICovXG5leHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgQWRkID0gJ2FkZCcsXG4gIEFsbCA9ICdhbGwnLFxuICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICBSZW1vdmUgPSAncmVtb3ZlJyxcbn1cblxuZXhwb3J0IGVudW0gU2hlZXRUeXBlIHtcbiAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gIFN0b3J5ID0gJ3N0b3J5JyxcbiAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG59XG5cbmV4cG9ydCBlbnVtIERvbWFpblJlc3RyaWN0aW9uVHlwZSB7XG4gIEFsbCA9ICdhbGwnLFxuICBMaXN0ID0gJ2xpc3QnLFxuICBSYW5nZSA9ICdyYW5nZScsXG59XG5cbmV4cG9ydCBlbnVtIERhdGVTdGVwUGVyaW9kIHtcbiAgWWVhcnMgPSAneWVhcnMnLFxuICBRdWFydGVycyA9ICdxdWFydGVycycsXG4gIE1vbnRocyA9ICdtb250aHMnLFxuICBXZWVrcyA9ICd3ZWVrcycsXG4gIERheXMgPSAnZGF5cycsXG4gIEhvdXJzID0gJ2hvdXJzJyxcbiAgTWludXRlcyA9ICdtaW51dGVzJyxcbiAgU2Vjb25kcyA9ICdzZWNvbmRzJyxcbiAgSXNvWWVhcnMgPSAnaXNvLXllYXJzJyxcbiAgSXNvUXVhcnRlcnMgPSAnaXNvLXF1YXJ0ZXJzJyxcbiAgSXNvV2Vla3MgPSAnaXNvLXdlZWtzJyxcbn1cblxuLyoqXG4gKiBUaGUgb3B0aW9uIGZvciBzcGVjaWZ5aW5nIHdoaWNoIHZhbHVlcyB0byBpbmNsdWRlIGZvciBmaWx0ZXJpbmcuXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlck51bGxPcHRpb24ge1xuICBOdWxsVmFsdWVzID0gJ251bGx2YWx1ZXMnLFxuICBOb25OdWxsVmFsdWVzID0gJ25vbm51bGx2YWx1ZXMnLFxuICBBbGxWYWx1ZXMgPSAnYWxsdmFsdWVzJyxcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBmaWx0ZXIgZG9tYWluXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gIERhdGFiYXNlID0gJ2RhdGFiYXNlJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Rpb24gdHlwZSBmb3Igc2VsZWN0IG1hcmtzIGFwaS5cbiAqL1xuZXhwb3J0IGVudW0gU2VsZWN0aW9uVXBkYXRlVHlwZSB7XG4gIFJlcGxhY2UgPSAnc2VsZWN0LXJlcGxhY2UnLFxuICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gIFJlbW92ZSA9ICdzZWxlY3QtcmVtb3ZlJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Qgb3B0aW9uIGZvciB0aGUgc2VsZWN0IHR1cGxlcyBhcGkuXG4gKi9cbmV4cG9ydCBlbnVtIFNlbGVjdE9wdGlvbnMge1xuICBTaW1wbGUgPSAnc2VsZWN0LW9wdGlvbnMtc2ltcGxlJyxcbiAgVG9nZ2xlID0gJ3NlbGVjdC1vcHRpb25zLXRvZ2dsZScsXG4gIE1lbnUgPSAnc2VsZWN0LW9wdGlvbnMtbWVudScsIC8vIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgZXh0ZXJuYWwgY29udHJhY3RcbiAgUmFuZ2UgPSAnc2VsZWN0LW9wdGlvbnMtcmFuZ2UnLCAvLyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dGVybmFsIGNvbnRyYWN0XG4gIFNlYXJjaCA9ICdzZWxlY3Qtb3B0aW9ucy1zZWFyY2gnLCAvLyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dGVybmFsIGNvbnRyYWN0XG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgaW5jbHVkZWQgdmFsdWVzIHR5cGUgZm9yIHJhbmdlIHNlbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMge1xuICBJbmNsdWRlTnVsbCA9ICdpbmNsdWRlLW51bGwnLFxuICBJbmNsdWRlTm9uTnVsbCA9ICdpbmNsdWRlLW5vbi1udWxsJyxcbiAgSW5jbHVkZUFsbCA9ICdpbmNsdWRlLWFsbCcsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyBhIGhpZXJhcmNoaWNhbCBsZXZlbCBzZWxlY3Rpb24gc3RhdGUuXG4gKi9cbmV4cG9ydCBlbnVtIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUge1xuICBBbGxTZWxlY3RlZCA9ICdhbGwtc2VsZWN0ZWQnLFxuICBOb25lU2VsZWN0ZWQgPSAnbm9uZS1zZWxlY3RlZCcsXG4gIFNvbWVTZWxlY3RlZCA9ICdzb21lLXNlbGVjdGVkJyxcbiAgVW5rbm93blNlbGVjdGVkID0gJ3Vua25vd24tc2VsZWN0ZWQnLFxufVxuXG4vKipcbiAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICovXG5leHBvcnQgZW51bSBNYXJrVHlwZSB7XG4gIEJhciA9ICdiYXInLFxuICBMaW5lID0gJ2xpbmUnLFxuICBBcmVhID0gJ2FyZWEnLFxuICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgQ2lyY2xlID0gJ2NpcmNsZScsXG4gIFNoYXBlID0gJ3NoYXBlJyxcbiAgVGV4dCA9ICd0ZXh0JyxcbiAgTWFwID0gJ21hcCcsXG4gIFBpZSA9ICdwaWUnLFxuICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICBQb2x5Z29uID0gJ3BvbHlnb24nLFxuICBIZWF0bWFwID0gJ2hlYXRtYXAnLFxuICBWaXpFeHRlbnNpb24gPSAndml6LWV4dGVuc2lvbicsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBmaWx0ZXJcbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyVHlwZSB7XG4gIENhdGVnb3JpY2FsID0gJ2NhdGVnb3JpY2FsJyxcbiAgUmFuZ2UgPSAncmFuZ2UnLFxuICBSZWxhdGl2ZURhdGUgPSAncmVsYXRpdmVEYXRlJyxcbiAgSGllcmFyY2hpY2FsID0gJ2hpZXJhcmNoaWNhbCcsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgRGF0ZVJhbmdlVHlwZSBvZiBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyXG4gKi9cbmV4cG9ydCBlbnVtIERhdGVSYW5nZVR5cGUge1xuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBsYXN0IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTGFzdCA9ICdsYXN0JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbGFzdCBOIGRheXMsIHdlZWtzLCBtb250aHMsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTGFzdE4gPSAnbGFzdE4nLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBuZXh0IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTmV4dCA9ICduZXh0JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbmV4dCBOIGRheXMsIHdlZWtzLCBtb250aHMsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTmV4dE4gPSAnbmV4dE4nLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBjdXJyZW50IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgQ3VycmVudCA9ICdjdXJyZW50JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byBldmVyeXRoaW5nIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBUb0RhdGUgPSAndG9EYXRlJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGRldGVybWluZSBpZiB0aGUgbGF1bmNoaW5nIG9mIGFuIGV4dGVuc2lvbiBkaWFsb2cgc3VjY2VlZGVkIG9yIGZhaWxlZC5cbiAqL1xuZXhwb3J0IGVudW0gRXh0ZW5zaW9uRGlhbG9nUmVzdWx0IHtcbiAgRGlhbG9nQWxyZWFkeU9wZW4gPSAnZGlhbG9nLWFscmVhZHktb3BlbicsXG4gIEludmFsaWREb21haW4gPSAnaW52YWxpZC1kb21haW4nLFxuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gb3B0aW1pemUgdGhlIGdldFN1bW1hcnlEYXRhL2dldFVuZGVybHlpbmdUYWJsZURhdGEgcmVzdWx0c1xuICogTWFwcGVkIGZyb20gZXh0ZXJuYWwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb25cbiAqL1xuZXhwb3J0IGVudW0gQXBpU2hvd0RhdGFUYWJsZUZvcm1hdCB7XG4gIE5hdGl2ZVZhbHVlc09ubHkgPSAnbmF0aXZlLXZhbHVlcy1vbmx5JyxcbiAgRm9ybWF0dGVkVmFsdWVzT25seSA9ICdmb3JtYXR0ZWQtdmFsdWVzLW9ubHknLFxuICBOYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMgPSAnbmF0aXZlLWFuZC1mb3JtYXR0ZWQtdmFsdWVzJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGRlbm90ZSB0aGUgc2VjdGlvbnMgb2YgZm9ybWF0dGluZyB3aXRoaW4gdGFibGVhdVxuICovXG5leHBvcnQgY29uc3QgZW51bSBDbGFzc05hbWVLZXkge1xuICBXb3Jrc2hlZXRUaXRsZSA9ICd0YWJsZWF1LXdvcmtzaGVldC10aXRsZScsXG4gIFdvcmtzaGVldCA9ICd0YWJsZWF1LXdvcmtzaGVldCcsXG4gIFRvb2x0aXAgPSAndGFibGVhdS10b29sdGlwJyxcbiAgU3RvcnlUaXRsZSA9ICd0YWJsZWF1LXN0b3J5LXRpdGxlJyxcbiAgRGFzaGJvYXJkVGl0bGUgPSAndGFibGVhdS1kYXNoYm9hcmQtdGl0bGUnLFxuICBQYW5lID0gJ3RhYmxlYXUtcGFuZScsXG4gIFJvd0RpdmlkZXJzID0gJ3RhYmxlYXUtcm93LWRpdmlkZXJzJyxcbiAgQ29sdW1uRGl2aWRlcnMgPSAndGFibGVhdS1jb2x1bW4tZGl2aWRlcnMnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gc2V0IHBhZ2Ugc2l6ZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBQYWdlU2l6ZU9wdGlvbiB7XG4gIExldHRlciA9ICdsZXR0ZXInLFxuICBMZWdhbCA9ICdsZWdhbCcsXG4gIE5vdGUgPSAnbm90ZScsXG4gIEZvbGlvID0gJ2ZvbGlvJyxcbiAgVGFibG9pZCA9ICd0YWJsb2lkJyxcbiAgTGVkZ2VyID0gJ2xlZGdlcicsXG4gIFN0YXRlbWVudCA9ICdzdGF0ZW1lbnQnLFxuICBFeGVjdXRpdmUgPSAnZXhlY3V0aXZlJyxcbiAgQTMgPSAnYTMnLFxuICBBNCA9ICdhNCcsXG4gIEE1ID0gJ2E1JyxcbiAgQjQgPSAnYjQnLFxuICBCNSA9ICdiNScsXG4gIFF1YXJ0byA9ICdxdWFydG8nLFxuICBVbnNwZWNpZmllZCA9ICd1bnNwZWNpZmllZCcsXG59XG5cbi8qKlxuICogVXNlZCB0byBzZXQgdGhlIHBhZ2Ugb3JpZW50YXRpb24gbW9kZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBQYWdlT3JpZW50YXRpb24ge1xuICBQcmludGVyID0gJ3ByaW50ZXInLFxuICBQb3J0cmFpdCA9ICdwb3J0cmFpdCcsXG4gIExhbmRzY2FwZSA9ICdsYW5kc2NhcGUnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gc2V0IHNjYWxlIG1vZGUgZm9yIGV4cG9ydCBsYXlvdXQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gU2NhbGVNb2RlIHtcbiAgU2NhbGVBdXRvID0gJ2F1dG8nLFxuICBTY2FsZVBlcmNlbnRhZ2UgPSAncGVyY2VudCcsXG4gIFNjYWxlRml0UGFnZXMgPSAnZml0LXBhZ2VzJyxcbn1cblxuLyoqXG4gKiBVc2VkIGJ5IHNldEZpdEFuZFNjYWxlVmFsdWVzIHRvIHNjYWxlIHBlcmNlbnQgdmFsdWVzXG4gKi9cbmV4cG9ydCBlbnVtIFBhZ2VTY2FsaW5nT3B0aW9uIHtcbiAgU2NhbGVQY3RBdXRvID0gJ2F1dG8nLFxuICBTY2FsZVBjdDQwMCA9ICdwY3Q0MDAnLFxuICBTY2FsZVBjdDIwMCA9ICdwY3QyMDAnLFxuICBTY2FsZVBjdDEwMCA9ICdwY3QxMDAnLFxuICBTY2FsZVBjdDkwID0gJ3BjdDkwJyxcbiAgU2NhbGVQY3Q4MCA9ICdwY3Q4MCcsXG4gIFNjYWxlUGN0NzUgPSAncGN0NzUnLFxuICBTY2FsZVBjdDYwID0gJ3BjdDYwJyxcbiAgU2NhbGVQY3Q1MCA9ICdwY3Q1MCcsXG4gIFNjYWxlUGN0MjUgPSAncGN0MjUnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgc2V0Rml0QW5kU2NhbGVWYWx1ZXMgdG8gc2NhbGUgZml0IHBhZ2UgdmFsdWVzXG4gKi9cbmV4cG9ydCBlbnVtIEZpdFBhZ2VzIHtcbiAgRml0T25lSGlnaCA9ICdmaXQweDEnLFxuICBGaXRUd29IaWdoID0gJ2ZpdDB4MicsXG4gIEZpdE9uZVdpZGUgPSAnZml0MXgwJyxcbiAgRml0VHdvV2lkZSA9ICdmaXQyeDAnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jXG4gKi9cbmV4cG9ydCBlbnVtIEVuY29kaW5nVHlwZSB7XG4gIENvbG9yID0gJ2NvbG9yJyxcbiAgU2l6ZSA9ICdzaXplJyxcbiAgTGFiZWwgPSAnbGFiZWwnLFxuICBEZXRhaWwgPSAnZGV0YWlsJyxcbiAgVG9vbHRpcCA9ICd0b29sdGlwJyxcbiAgU2hhcGUgPSAnc2hhcGUnLFxuICBQYXRoID0gJ3BhdGgnLFxuICBBbmdsZSA9ICdhbmdsZScsXG4gIEdlb21ldHJ5ID0gJ2dlb21ldHJ5JyxcbiAgQ3VzdG9tID0gJ2N1c3RvbScsXG59XG5cbmV4cG9ydCBlbnVtIFB1bHNlVGltZURpbWVuc2lvbiB7XG4gIFRvZGF5ID0gJ1RvZGF5JyxcbiAgWWVzdGVyZGF5ID0gJ1llc3RlcmRheScsXG4gIFdlZWtUb0RhdGUgPSAnV2Vla1RvRGF0ZScsXG4gIExhc3RXZWVrID0gJ0xhc3RXZWVrJyxcbiAgTW9udGhUb0RhdGUgPSAnTW9udGhUb0RhdGUnLFxuICBMYXN0TW9udGggPSAnTGFzdE1vbnRoJyxcbiAgUXVhcnRlclRvRGF0ZSA9ICdRdWFydGVyVG9EYXRlJyxcbiAgTGFzdFF1YXJ0ZXIgPSAnTGFzdFF1YXJ0ZXInLFxuICBZZWFyVG9EYXRlID0gJ1llYXJUb0RhdGUnLFxuICBMYXN0WWVhciA9ICdMYXN0WWVhcicsXG59XG5cbmV4cG9ydCBlbnVtIFB1bHNlRXJyb3JNZXNzYWdlVmlzaWJpbGl0eSB7XG4gIFZpc2libGUgPSAndmlzaWJsZScsXG4gIEhpZGRlbiA9ICdoaWRkZW4nLFxuICBTdXBwcmVzc2VkID0gJ3N1cHByZXNzZWQnLFxufVxuXG5leHBvcnQgZW51bSBEYXRhRm9ybWF0VHlwZSB7XG4gIEF1dG9Gb3JtYXQgPSAnYXV0by1mb3JtYXQnLFxuICBTeXN0ZW1OdW1iZXIgPSAnc3lzdGVtLW51bWJlcicsXG4gIFN5c3RlbUN1cnJlbmN5ID0gJ3N5c3RlbS1jdXJyZW5jeScsXG4gIFN5c3RlbUxvbmdEYXRlID0gJ3N5c3RlbS1sb25nLWRhdGUnLFxuICBTeXN0ZW1TaG9ydERhdGUgPSAnc3lzdGVtLXNob3J0LWRhdGUnLFxuICBTeXN0ZW1UaW1lID0gJ3N5c3RlbS10aW1lJyxcbiAgQ3VzdG9tID0gJ2N1c3RvbScsXG4gIEN1c3RvbU51bWJlciA9ICdjdXN0b20tbnVtYmVyJyxcbiAgQ3VzdG9tQ3VycmVuY3kgPSAnY3VzdG9tLWN1cnJlbmN5JyxcbiAgQ3VzdG9tU2NpZW50aWZpYyA9ICdjdXN0b20tc2NpZW50aWZpYycsXG4gIEN1c3RvbVBlcmNlbnRhZ2UgPSAnY3VzdG9tLXBlcmNlbnRhZ2UnLFxufVxuXG5leHBvcnQgZW51bSBOdW1iZXJGb3JtYXRVbml0cyB7XG4gIE5vbmUgPSAndW5pdHMtbm9uZScsXG4gIFRob3VzYW5kcyA9ICd1bml0cy10aG91c2FuZHMnLFxuICBNaWxsaW9ucyA9ICd1bml0cy1taWxsaW9ucycsXG4gIEJpbGxpb25zRW5nbGlzaCA9ICd1bml0cy1iaWxsaW9ucy1lbmdsaXNoJyxcbiAgQmlsbGlvbnNTdGFuZGFyZCA9ICd1bml0cy1iaWxsaW9ucy1zdGFuZGFyZCcsXG59XG5cbmV4cG9ydCBlbnVtIE5lZ2F0aXZlTnVtYmVyRm9ybWF0IHtcbiAgQXV0b21hdGljID0gJ2F1dG9tYXRpYycsXG4gIFBhcmVudGhlc2VzID0gJ3BhcmVudGhlc2VzJyxcbiAgT3V0ZXJQcmVmaXggPSAnb3V0ZXItcHJlZml4JyxcbiAgT3V0ZXJTdWZmaXggPSAnb3V0ZXItc3VmZml4JyxcbiAgSW5uZXJQcmVmaXggPSAnaW5uZXItcHJlZml4JyxcbiAgSW5uZXJTdWZmaXggPSAnaW5uZXItc3VmZml4Jyxcbn1cbiIsImltcG9ydCB7IERhdGFGb3JtYXRUeXBlLCBOZWdhdGl2ZU51bWJlckZvcm1hdCwgTnVtYmVyRm9ybWF0VW5pdHMsIFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0ICogYXMgRW51bXMgZnJvbSAnLi9FbnVtcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWwge31cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJhYmxlTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIC8vIFVzZWQgZm9yIGV2ZW50IG1vZGVscyB0aGF0IHNob3VsZCBiZSBmaWx0ZXJlZCBvbiB0aGUgY2xpZW50IHNpZGUuXG4gIC8vIFRoaXMgcHJldmVudHMgZXh0ZW5zaW9ucyBmcm9tIHNlZWluZyBldmVudHMgcmVsZXZhbnQgb25seSB0byBhbm90aGVyIGV4dGVuc2lvblxuICAvLyAoZm9yIGV4YW1wbGUsIGEgc2V0dGluZ3MgY2hhbmdlZCBldmVudCkuICBOb3RlOiB0aGlzIGRvZXMgbm90IHByb3RlY3QgYWdhaW5zdFxuICAvLyBhbiBleHRlbnNpb24gbW9kaWZ5aW5nIG91ciBsaWJyYXJ5IGFuZCBzZWVpbmcgZXZlbnRzIGZvciBvdGhlciBleHRlbnNpb25zLCBzbyBkb1xuICAvLyBub3QgdHJlYXQgdGhpcyBhcyBhIHNlY3VyaXR5IG1lYXN1cmUuICBJZiB0aGVyZSBhcmUgZXZlbnRzIHRoYXQgbXVzdCBiZSBwcm90ZWN0ZWRcbiAgLy8gZnJvbSBsZWFraW5nIGJldHdlZW4gZXh0ZW5zaW9ucywgdGhhdCBtdXN0IGJlIGRvbmUgYXQgdGhlIGMrKyBsYXllci5cbiAgZmlsdGVyQnlMb2NhdG9yOiBib29sZWFuO1xuICBsb2NhdG9yOiBFeHRlbnNpb25Mb2NhdG9yO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlcmFibGVCeURpYWxvZ01vZGVsIGV4dGVuZHMgRmlsdGVyYWJsZU1vZGVsIHtcbiAgZmlsdGVyQnlEaWFsb2c6IGJvb2xlYW47XG4gIHRhcmdldERpYWxvZ1VybD86IHN0cmluZztcbn1cblxuLy8vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vLy8gV29ya2Jvb2sgT2JqZWN0XG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFNoZWV0UGF0aCBleHRlbmRzIE1vZGVsIHtcbiAgc2hlZXROYW1lOiBzdHJpbmc7XG4gIGlzRGFzaGJvYXJkOiBib29sZWFuO1xuICBzdG9yeWJvYXJkPzogc3RyaW5nO1xuICBmbGlwYm9hcmRab25lSUQ/OiBudW1iZXI7XG4gIHN0b3J5UG9pbnRJRD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWaXN1YWxJZCBleHRlbmRzIE1vZGVsIHtcbiAgd29ya3NoZWV0OiBzdHJpbmc7XG4gIGRhc2hib2FyZD86IHN0cmluZztcbiAgc3Rvcnlib2FyZD86IHN0cmluZztcbiAgZmxpcGJvYXJkWm9uZUlEPzogbnVtYmVyO1xuICBzdG9yeVBvaW50SUQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkWm9uZSBleHRlbmRzIE1vZGVsIHtcbiAgbmFtZTogc3RyaW5nO1xuICB6b25lSWQ6IG51bWJlcjtcbiAgem9uZVR5cGU6IEVudW1zLkRhc2hib2FyZE9iamVjdFR5cGU7XG4gIGhlaWdodDogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgc2hlZXRJbmZvPzogU2hlZXRJbmZvO1xuICBpc0Zsb2F0aW5nPzogYm9vbGVhbjsgLy8gYWRkZWQgaW4gdmVyc2lvbiAxLjYuMFxuICBpc1Zpc2libGU/OiBib29sZWFuOyAvLyBhZGRlZCBpbiB2ZXJzaW9uIDEuNi4wXG4gIGZpZWxkSWQ/OiBzdHJpbmc7IC8vIGZpZWxkIElEIGdpdmVuIG9ubHkgd2hlbiB6b25lVHlwZSBpcyBGaWx0ZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGVldEluZm8gZXh0ZW5kcyBNb2RlbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgc2hlZXRUeXBlOiBFbnVtcy5TaGVldFR5cGU7XG4gIHVybD86IHN0cmluZzsgLy8gY3VycmVudGx5IHVzZWQgb25seSBieSBFbWJlZGRpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRpbmdTaGVldEluZm8gZXh0ZW5kcyBTaGVldEluZm8ge1xuICBzaXplQ29uc3RyYWludDogU2l6ZUNvbnN0cmFpbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbmVkU2hlZXRJbmZvTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgc2hlZXRUeXBlOiBFbnVtcy5TaGVldFR5cGUuRGFzaGJvYXJkIHwgRW51bXMuU2hlZXRUeXBlLldvcmtzaGVldDsgLy8gQ29udGFpbmVkIHNoZWV0IGNhbm5vdCBiZSBhIHN0b3J5XG4gIGRhc2hib2FyZFpvbmVzOiBBcnJheTxEYXNoYm9hcmRab25lPjtcbiAgem9uZUlkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1ldGVySW5mbyBleHRlbmRzIE1vZGVsIHtcbiAgbmFtZTogc3RyaW5nO1xuICBmaWVsZE5hbWU6IHN0cmluZztcbiAgZGF0YVR5cGU6IEVudW1zLkRhdGFUeXBlO1xuICBjdXJyZW50VmFsdWU6IERhdGFWYWx1ZTtcbiAgYWxsb3dhYmxlVmFsdWVzVHlwZTogRW51bXMuRG9tYWluUmVzdHJpY3Rpb25UeXBlO1xuICBhbGxvd2FibGVWYWx1ZXM/OiBBcnJheTxEYXRhVmFsdWU+O1xuICBtaW5WYWx1ZT86IERhdGFWYWx1ZTtcbiAgbWF4VmFsdWU/OiBEYXRhVmFsdWU7XG4gIHN0ZXBTaXplPzogbnVtYmVyO1xuICBkYXRlU3RlcFBlcmlvZD86IEVudW1zLkRhdGVTdGVwUGVyaW9kO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSBleHRlbmRzIE1vZGVsIHtcbiAgZGFzaGJvYXJkT2JqZWN0SUQ6IG51bWJlcjtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBGb250TmFtZUFuZEluZm8gZXh0ZW5kcyBNb2RlbCB7XG4gIGZvbnROYW1lOiBzdHJpbmc7XG4gIGZvbnRCaW5hcnlJbmZvOiBVaW50OEFycmF5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpcnN0Vml6U2l6ZUtub3duRXZlbnQgZXh0ZW5kcyBNb2RlbCB7XG4gIHNoZWV0U2l6ZTogU2l6ZUNvbnN0cmFpbnQ7XG4gIGNocm9tZUhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpcnN0UHVsc2VNZXRyaWNTaXplS25vd25FdmVudCBleHRlbmRzIE1vZGVsIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyRXZlbnQgZXh0ZW5kcyBNb2RlbCB7XG4gIGZpZWxkTmFtZTogc3RyaW5nO1xuICB2aXN1YWxJZDogVmlzdWFsSWQ7XG4gIGZpZWxkSWQ/OiBzdHJpbmc7IC8vIEZpZWxkSWQgd2lsbCBiZSB1bmRlZmluZWQgaW4gb2xkZXIgdGFibGVhdSBzZXJ2ZXJzLlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1bW1hcnlEYXRhRXZlbnQgZXh0ZW5kcyBNb2RlbCB7XG4gIHZpc3VhbElkOiBWaXN1YWxJZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDdXN0b21NYXJrQ2xpY2tlZENvbnRleHRNZW51RXZlbnQgZXh0ZW5kcyBNb2RlbCB7XG4gIHZpc3VhbElkOiBWaXN1YWxJZDtcbiAgY29udGV4dE1lbnVJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpYWxvZ1VwZGF0ZUV2ZW50IGV4dGVuZHMgRmlsdGVyYWJsZUJ5RGlhbG9nTW9kZWwge1xuICBpc0Nsb3NlRXZlbnQ6IGJvb2xlYW47XG4gIGNsb3NlUGF5bG9hZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaWFsb2dNZXNzYWdlRXZlbnQgZXh0ZW5kcyBGaWx0ZXJhYmxlQnlEaWFsb2dNb2RlbCB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc291cmNlRGlhbG9nVXJsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRleHRNZW51RXZlbnQgZXh0ZW5kcyBGaWx0ZXJhYmxlTW9kZWwge1xuICBpZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzRXZlbnQgZXh0ZW5kcyBGaWx0ZXJhYmxlTW9kZWwge1xuICBuZXdTZXR0aW5nczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRMYXlvdXRFdmVudCBleHRlbmRzIEZpbHRlcmFibGVNb2RlbCB7XG4gIHpvbmVzOiBBcnJheTxEYXNoYm9hcmRab25lPjtcbiAgYWN0aXZlWm9uZUlkPzogbnVtYmVyO1xuICBhY3RpdmVEYXNoYm9hcmROYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xiYXJTdGF0ZUV2ZW50IGV4dGVuZHMgTW9kZWwge1xuICB0b29sYmFyU3RhdGU6IFRvb2xiYXJTdGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZUZpbHRlcnNDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBNb2RlbCB7XG4gIGZpZWxkTmFtZXM6IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VNZXRyaWNTaXplQ2hhbmdlZEV2ZW50IGV4dGVuZHMgTW9kZWwge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZUluc2lnaHREaXNjb3ZlcmVkRXZlbnQgZXh0ZW5kcyBNb2RlbCB7XG4gIGlkOiBzdHJpbmc7XG4gIGNoYXJhY3Rlcml6YXRpb246IHN0cmluZztcbiAgbWFya3VwOiBzdHJpbmc7XG4gIHF1ZXN0aW9uOiBzdHJpbmc7XG4gIHNjb3JlOiBudW1iZXI7XG4gIHR5cGU6IHN0cmluZztcbiAgdmVyc2lvbjogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlVXJsQ2hhbmdlZEV2ZW50IGV4dGVuZHMgTW9kZWwge1xuICBvbGRVcmw6IHN0cmluZztcbiAgbmV3VXJsOiBzdHJpbmc7XG4gIGNvbnRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZVRpbWVEaW1lbnNpb25DaGFuZ2VkRXZlbnQgZXh0ZW5kcyBNb2RlbCB7XG4gIHRpbWVEaW1lbnNpb246IEVudW1zLlB1bHNlVGltZURpbWVuc2lvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZUVycm9yRXZlbnQgZXh0ZW5kcyBNb2RlbCB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgaHR0cFN0YXR1czogbnVtYmVyO1xuICBtZXNzYWdlVmlzaWJpbGl0eTogRW51bXMuUHVsc2VFcnJvck1lc3NhZ2VWaXNpYmlsaXR5O1xufVxuXG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8vLyBEYXRhIFRhYmxlc1xuLy8vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhVmFsdWUge1xuICAvLyBUaGVzZSBhcmUgb3B0aW9uYWwgYmVjYXVzZSBvZiBTaG93RGF0YVRhYmxlRm9ybWF0IG9wdGlvbnNcbiAgLyogdHNsaW50OmRpc2FibGU6bm8tYW55ICovXG4gIHZhbHVlPzogYW55O1xuICAvKiB0c2xpbnQ6ZW5hYmxlOm5vLWFueSAqL1xuICBmb3JtYXR0ZWRWYWx1ZT86IHN0cmluZztcbiAgYWxpYXNlZFZhbHVlPzogc3RyaW5nO1xuICBoYXNBbGlhcz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVRhYmxlIHtcbiAgZGF0YVRhYmxlOiBBcnJheTxBcnJheTxEYXRhVmFsdWU+PjtcbiAgaGVhZGVyczogQXJyYXk8RGF0YUhlYWRlcj47XG4gIG1hcmtzPzogQXJyYXk8TWFya0luZm8+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFUYWJsZVJlYWRlciB7XG4gIGlkOiBzdHJpbmc7XG4gIHRvdGFsUm93Q291bnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXJrSW5mbyB7XG4gIHR5cGU6IEVudW1zLk1hcmtUeXBlO1xuICBjb2xvcjogc3RyaW5nO1xuICB0dXBsZUlkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFIZWFkZXIge1xuICBkYXRhVHlwZTogRW51bXMuRGF0YVR5cGU7XG4gIGZpZWxkTmFtZTogc3RyaW5nO1xuICBpc1JlZmVyZW5jZWQ6IGJvb2xlYW47XG4gIGluZGV4OiBudW1iZXI7XG4gIGZpZWxkQ2FwdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVuZGVybHlpbmdEYXRhVGFibGUge1xuICBkYXRhOiBEYXRhVGFibGU7XG4gIGlzU3VtbWFyeTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RlZE1hcmtzVGFibGUge1xuICAvLyBJZiBtYXJrcyBhcmUgc2VsZWN0ZWQgYWNyb3NzIHBhbmVzLCB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgdGFibGVzIG9mIGRhdGEgcmVwcmVzZW50aW5nIHRoZSBtYXJrc1xuICBkYXRhOiBBcnJheTxEYXRhVGFibGU+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhpZ2hsaWdodGVkTWFya3NUYWJsZSB7XG4gIC8vIElmIG1hcmtzIGFyZSBoaWdobGlnaHRlZCBhY3Jvc3MgcGFuZXMsIHRoZXJlIG1heSBiZSBtdWx0aXBsZSB0YWJsZXMgb2YgZGF0YSByZXByZXNlbnRpbmcgdGhlIG1hcmtzXG4gIGRhdGE6IEFycmF5PERhdGFUYWJsZT47XG59XG5cbi8vLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLy8vIEFubm90YXRpb24gTW9kZWxzXG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIEFubm90YXRpb24gZXh0ZW5kcyBNb2RlbCB7XG4gIGFubm90YXRlRW51bTogRW51bXMuQW5ub3RhdGVFbnVtO1xuICBhbm5vdGF0aW9uSWQ6IG51bWJlcjtcbiAgYW5ub3RhdGlvblBsYWluVGV4dDogc3RyaW5nO1xuICBhbm5vdGF0aW9uVGV4dDogc3RyaW5nO1xuICB0dXBsZUlkPzogbnVtYmVyO1xufVxuXG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8vLyBGcmVsYXJkIE5hbWVzcGFjZSBNb2RlbHNcbi8vLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvciBleHRlbmRzIE1vZGVsIHtcbiAgaW5zdGFuY2VJZDogc3RyaW5nO1xuICBkYXNoYm9hcmRQYXRoOiBTaGVldFBhdGg7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya3NoZWV0RXh0ZW5zaW9uTG9jYXRvciBleHRlbmRzIE1vZGVsIHtcbiAgaW5zdGFuY2VJZDogc3RyaW5nO1xuICB2aXN1YWxJZDogVmlzdWFsSWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52YWxpZEV4dGVuc2lvbkxvY2F0b3IgZXh0ZW5kcyBNb2RlbCB7XG4gIGluc3RhbmNlSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgRXh0ZW5zaW9uTG9jYXRvciA9IERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3IgfCBXb3Jrc2hlZXRFeHRlbnNpb25Mb2NhdG9yIHwgSW52YWxpZEV4dGVuc2lvbkxvY2F0b3I7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5zaW9uSW5zdGFuY2UgZXh0ZW5kcyBNb2RlbCB7XG4gIHVybDogc3RyaW5nO1xuICBsb2NhdG9yOiBFeHRlbnNpb25Mb2NhdG9yO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVuc2lvbkVudmlyb25tZW50IGV4dGVuZHMgTW9kZWwge1xuICBpc0V4cG9ydGluZzogYm9vbGVhbjtcbiAgZXhwb3J0ZWRNZWRpYVR5cGU/OiBFbnVtcy5FeHBvcnRlZE1lZGlhVHlwZTtcbiAgZXh0ZW5zaW9uQ29udGV4dDogRW51bXMuRXh0ZW5zaW9uQ29udGV4dDtcbiAgZXh0ZW5zaW9uTW9kZTogRW51bXMuRXh0ZW5zaW9uTW9kZTtcbiAgZXh0ZW5zaW9uTG9jYWxlOiBzdHJpbmc7XG4gIGV4dGVuc2lvbkxhbmd1YWdlOiBzdHJpbmc7XG4gIGV4dGVuc2lvbkNvdW50cnk6IHN0cmluZyB8IHVuZGVmaW5lZDsgLy8gVGhpcyB3YXMgaW50cm9kdWNlZCBpbiAyMDIyLjJcbiAgd29ya2Jvb2tGb3JtYXR0aW5nPzogV29ya2Jvb2tGb3JtYXR0aW5nIHwgdW5kZWZpbmVkO1xuICB3b3JrYm9va0xvY2FsZTogc3RyaW5nO1xuICB0YWJsZWF1VmVyc2lvbjogc3RyaW5nO1xuICBvcGVyYXRpbmdTeXN0ZW06IHN0cmluZztcbiAgYXBpVmVyc2lvbjogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIHNpdGVJZD86IHN0cmluZztcbiAgc2l0ZU5hbWVzcGFjZT86IHN0cmluZztcbiAgd29ya2Jvb2tJZD86IHN0cmluZztcbiAgdW5pcXVlVXNlcklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7IC8vIFRoaXMgd2FzIGludHJvZHVjZWQgaW4gMjAyMy4xXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcbiAgZmVhdHVyZUZsYWdzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvIGV4dGVuZHMgTW9kZWwge1xuICBzZXR0aW5nc1ZhbHVlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrYm9va0Zvcm1hdHRpbmcgZXh0ZW5kcyBNb2RlbCB7XG4gIGZvcm1hdHRpbmdTaGVldHM6IEFycmF5PEZvcm1hdHRpbmdTaGVldD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Jvb2tGb3JtYXR0aW5nRXZlbnQgZXh0ZW5kcyBGaWx0ZXJhYmxlTW9kZWwge1xuICBmb3JtYXR0aW5nU2hlZXRzOiBBcnJheTxGb3JtYXR0aW5nU2hlZXQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtzaGVldEZvcm1hdHRpbmdFdmVudCBleHRlbmRzIE1vZGVsIHtcbiAgZm9ybWF0dGluZ1NoZWV0czogQXJyYXk8Rm9ybWF0dGluZ1NoZWV0PjtcbiAgdmlzdWFsSWQ6IFZpc3VhbElkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRpbmdTaGVldCBleHRlbmRzIE1vZGVsIHtcbiAgY2xhc3NOYW1lS2V5OiBFbnVtcy5DbGFzc05hbWVLZXk7XG4gIGNzc1Byb3BlcnRpZXM6IFJlYWN0LkNTU1Byb3BlcnRpZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUZvcm1hdCBleHRlbmRzIE1vZGVsIHtcbiAgZGVmYXVsdE9wdGlvbnM6IERhdGFGb3JtYXR0aW5nT3B0aW9ucztcbiAgc3VidG90YWxzT3B0aW9ucz86IERhdGFGb3JtYXR0aW5nT3B0aW9ucztcbiAgdG90YWxzT3B0aW9ucz86IERhdGFGb3JtYXR0aW5nT3B0aW9ucztcbiAgYXhpc09wdGlvbnM/OiBEYXRhRm9ybWF0dGluZ09wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUZvcm1hdHRpbmdPcHRpb25zIGV4dGVuZHMgTW9kZWwge1xuICBmb3JtYXRUeXBlOiBEYXRhRm9ybWF0VHlwZTtcbiAgbG9jYWxlOiBzdHJpbmc7XG4gIGRlY2ltYWxzOiBudW1iZXI7XG4gIGRlY2ltYWxDaGFyYWN0ZXI6IHN0cmluZztcbiAgc2hvd1NlcGFyYXRvcnM6IGJvb2xlYW47XG4gIHNlcGFyYXRvckNoYXJhY3Rlcjogc3RyaW5nO1xuICBwcmVmaXg6IHN0cmluZztcbiAgc3VmZml4OiBzdHJpbmc7XG4gIHVuaXRzOiBOdW1iZXJGb3JtYXRVbml0cztcbiAgbmVnYXRpdmVGb3JtYXQ6IE5lZ2F0aXZlTnVtYmVyRm9ybWF0O1xuICBjdXN0b21Gb3JtYXRTdHJpbmc6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRlRm9ybWF0dGluZ09wdGlvbnMgZXh0ZW5kcyBNb2RlbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBmb3JtYXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRlbnNpb25EYXNoYm9hcmRJbmZvIGV4dGVuZHMgTW9kZWwge1xuICBleHRlbnNpb25ab25lSWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICB6b25lczogQXJyYXk8RGFzaGJvYXJkWm9uZT47XG4gIHNpemU6IFNpemVJbmZvO1xuICBhY3RpdmVEYXNoYm9hcmRPYmplY3RJZDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVuc2lvbldvcmtzaGVldEluZm8gZXh0ZW5kcyBNb2RlbCB7XG4gIHZpc3VhbElkOiBWaXN1YWxJZDtcbiAgc2l6ZTogU2l6ZUluZm87XG4gIGJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICBmb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbyBleHRlbmRzIE1vZGVsIHtcbiAgZXh0ZW5zaW9uSW5zdGFuY2U6IEV4dGVuc2lvbkluc3RhbmNlO1xuICBleHRlbnNpb25FbnZpcm9ubWVudDogRXh0ZW5zaW9uRW52aXJvbm1lbnQ7XG4gIGV4dGVuc2lvbkRhc2hib2FyZEluZm8/OiBFeHRlbnNpb25EYXNoYm9hcmRJbmZvO1xuICBleHRlbnNpb25Xb3Jrc2hlZXRJbmZvPzogRXh0ZW5zaW9uV29ya3NoZWV0SW5mbztcbiAgZXh0ZW5zaW9uU2V0dGluZ3NJbmZvOiBFeHRlbnNpb25TZXR0aW5nc0luZm87XG4gIGV4dGVuc2lvbkRpYWxvZ1BheWxvYWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaXplSW5mbyBleHRlbmRzIE1vZGVsIHtcbiAgaDogbnVtYmVyO1xuICB3OiBudW1iZXI7XG59XG5cbi8vLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLy8vIERhdGFTb3VyY2UgTW9kZWxzXG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IHR5cGUgRGF0YVNvdXJjZU1hcCA9IHsgW2tleTogc3RyaW5nXTogRGF0YVNvdXJjZSB9O1xuZXhwb3J0IHR5cGUgV29ya3NoZWV0RGF0YVNjaGVtYU1hcCA9IHsgW2tleTogc3RyaW5nXTogV29ya3NoZWV0RGF0YVNvdXJjZUluZm8gfTtcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhU2NoZW1hIGV4dGVuZHMgTW9kZWwge1xuICBkYXRhU291cmNlczogRGF0YVNvdXJjZU1hcDtcbiAgd29ya3NoZWV0RGF0YVNjaGVtYU1hcDogV29ya3NoZWV0RGF0YVNjaGVtYU1hcDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhU291cmNlIGV4dGVuZHMgTW9kZWwge1xuICBuYW1lOiBzdHJpbmc7XG4gIGlkOiBzdHJpbmc7XG4gIGV4dHJhY3RVcGRhdGVUaW1lPzogc3RyaW5nO1xuICBpc0V4dHJhY3Q6IGJvb2xlYW47XG4gIGZpZWxkczogQXJyYXk8RmllbGQ+O1xuICBpc1B1Ymxpc2hlZD86IGJvb2xlYW47XG4gIHB1Ymxpc2hlZFVybD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZEJhc2UgZXh0ZW5kcyBNb2RlbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZGF0YVR5cGU6IEVudW1zLkRhdGFUeXBlIHwgdW5kZWZpbmVkO1xuICBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdDtcbiAgYWdncmVnYXRpb246IEVudW1zLkZpZWxkQWdncmVnYXRpb25UeXBlO1xuICByb2xlOiBFbnVtcy5GaWVsZFJvbGVUeXBlO1xuICBzZW1hbnRpY1JvbGU/OiBzdHJpbmc7XG4gIGNvbHVtblR5cGU6IEVudW1zLkNvbHVtblR5cGU7XG4gIGlzQ2FsY3VsYXRlZEZpZWxkOiBib29sZWFuO1xuICBpc0NvbWJpbmVkRmllbGQ6IGJvb2xlYW47XG4gIGlzR2VuZXJhdGVkOiBib29sZWFuO1xuICBpc0dlb3NwYXRpYWw6IGJvb2xlYW47XG4gIGlzSGlkZGVuOiBib29sZWFuO1xuICBpc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2U6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRJbnN0YW5jZSBleHRlbmRzIEZpZWxkQmFzZSB7XG4gIGZpZWxkSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZCBleHRlbmRzIEZpZWxkQmFzZSB7XG4gIGlkOiBzdHJpbmc7XG59XG5cbi8vIFJlcHJlc2VudHMgYWxsIHRhYmxlcyB1c2VkIGluIHRoZSBjdXJyZW50IGRhdGEgcHJlcCBjYW52YXMgZm9yIGEgZGF0YXNvdXJjZS5cbi8vIFRoaXMgbWF5IGNvbnRhaW4gdGFibGVzIGZyb20gc2VwYXJhdGUgY29ubmVjdGlvbnMuXG5leHBvcnQgaW50ZXJmYWNlIEpvaW5EZXNjcmlwdGlvbiBleHRlbmRzIE1vZGVsIHtcbiAgdGFibGVzOiBBcnJheTxUYWJsZUluZm8+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlSW5mb3MgZXh0ZW5kcyBNb2RlbCB7XG4gIHRhYmxlczogQXJyYXk8VGFibGVJbmZvPjtcbn1cblxuLy8gSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSB0YWJsZVxuZXhwb3J0IGludGVyZmFjZSBUYWJsZUluZm8gZXh0ZW5kcyBNb2RlbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgaWQ6IHN0cmluZztcbiAgY3VzdG9tU1FMOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbm5lY3Rpb25DbGFzc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29ubmVjdGlvbklkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSBleHRlbmRzIE1vZGVsIHtcbiAgbmFtZTogc3RyaW5nO1xuICBpZDogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHNlcnZlclVSSTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBXb3Jrc2hlZXRGaWVsZCA9IEZpZWxkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtzaGVldERhdGFTb3VyY2VJbmZvIGV4dGVuZHMgTW9kZWwge1xuICBwcmltYXJ5RGF0YVNvdXJjZTogc3RyaW5nO1xuICByZWZlcmVuY2VkRGF0YVNvdXJjZUxpc3Q6IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9naWNhbFRhYmxlSW5mbyBleHRlbmRzIE1vZGVsIHtcbiAgaWQ6IHN0cmluZztcbiAgY2FwdGlvbjogc3RyaW5nO1xufVxuXG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8vLyBFcnJvcnNcbi8vLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgaW50ZXJmYWNlIEludGVybmFsVGFibGVhdUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBlcnJvckNvZGU6IEVudW1zLkVycm9yQ29kZXM7XG59XG5cbi8vLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLy8vIEZpbHRlciBNb2RlbHNcbi8vLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlciBleHRlbmRzIE1vZGVsIHtcbiAgZmlsdGVyVHlwZTogRW51bXMuRmlsdGVyVHlwZTtcbiAgZmllbGRDYXB0aW9uOiBzdHJpbmc7XG4gIGZpZWxkTmFtZTogc3RyaW5nO1xuICB2aXN1YWxJZDogVmlzdWFsSWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcmljYWxGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIge1xuICB2YWx1ZXM6IEFycmF5PERhdGFWYWx1ZT47XG4gIGlzRXhjbHVkZTogYm9vbGVhbjtcbiAgaXNBbGxTZWxlY3RlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGllcmFyY2hpY2FsRmlsdGVyIGV4dGVuZHMgRmlsdGVyIHtcbiAgZGltZW5zaW9uTmFtZTogc3RyaW5nO1xuICBoaWVyYXJjaHlDYXB0aW9uOiBzdHJpbmc7XG4gIHZhbHVlczogQXJyYXk8SGllcmFyY2hpY2FsRGF0YVZhbHVlPjtcbiAgbGV2ZWxzOiBudW1iZXI7XG4gIGxldmVsSW5mbzogQXJyYXk8SGllcmFyY2hpY2FsTGV2ZWxJbmZvPjtcbiAgaXNBbGxTZWxlY3RlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIaWVyYXJjaGljYWxEYXRhVmFsdWUge1xuICB2YWx1ZTogRGF0YVZhbHVlO1xuICBoaWVyYXJjaGljYWxQYXRoOiBzdHJpbmc7XG4gIGxldmVsOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGllcmFyY2hpY2FsTGV2ZWxJbmZvIHtcbiAgbmFtZTogc3RyaW5nO1xuICBsZXZlbFNlbGVjdGlvblN0YXRlOiBFbnVtcy5IaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlRmlsdGVyIGV4dGVuZHMgRmlsdGVyIHtcbiAgbWluOiBEYXRhVmFsdWU7XG4gIG1heDogRGF0YVZhbHVlO1xuICBpbmNsdWRlTnVsbFZhbHVlczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWxhdGl2ZURhdGVGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIge1xuICBhbmNob3JEYXRlOiBEYXRhVmFsdWU7XG4gIHBlcmlvZFR5cGU6IEVudW1zLkRhdGVTdGVwUGVyaW9kO1xuICByYW5nZVR5cGU6IEVudW1zLkRhdGVSYW5nZVR5cGU7XG4gIHJhbmdlTjogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpY2FsRG9tYWluIHtcbiAgdmFsdWVzOiBBcnJheTxEYXRhVmFsdWU+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlRG9tYWluIHtcbiAgbWluOiBEYXRhVmFsdWU7XG4gIG1heDogRGF0YVZhbHVlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RDb252ZXJzaW9uTW9kZWwge1xuICB2YWx1ZTogbnVtYmVyO1xufVxuXG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8vLyBFbWJlZGRpbmcgTW9kZWxzXG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRpbmdCb290c3RyYXBJbmZvIHtcbiAgd29ya2Jvb2tOYW1lOiBzdHJpbmc7XG4gIGN1cnJXb3Jrc2hlZXROYW1lOiBzdHJpbmc7XG4gIG9sZFNoZWV0TmFtZT86IHN0cmluZzsgLy8gb25seSB1c2VkIGJ5IFRhYlN3aXRjaGVkLiBBZGRlZCBpbiAxLjk2LjBcbiAgcHVibGlzaGVkU2hlZXRzOiBBcnJheTxFbWJlZGRpbmdTaGVldEluZm8+O1xuICBkYXNoYm9hcmRab25lczogQXJyYXk8RGFzaGJvYXJkWm9uZT47XG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcbiAgY2FuRG93bmxvYWRXb3JrYm9vazogYm9vbGVhbjtcbiAgc3Rvcnk/OiBTdG9yeU1vZGVsOyAvLyBBZGRlZCBpbiAxLjEwOC4wXG4gIHZpenFsRGF0YVNlcnZpY2VTZXNzaW9uSW5mbz86IFZpelFMRGF0YVNlcnZpY2VTZXNzaW9uSW5mbzsgLy8gQWRkZWQgaW4gMS4xOTUuMFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZpelFMRGF0YVNlcnZpY2VTZXNzaW9uSW5mbyB7XG4gIHZpenFsU2VydmVyU2Vzc2lvbklkOiBzdHJpbmc7XG4gIGdsb2JhbFNlc3Npb25IZWFkZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRpbmdQdWxzZUJvb3RzdHJhcEluZm8ge1xuICBpZnJhbWVUaXRsZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpemVDb25zdHJhaW50IHtcbiAgbWluV2lkdGg6IG51bWJlcjtcbiAgbWluSGVpZ2h0OiBudW1iZXI7XG4gIG1heFdpZHRoOiBudW1iZXI7XG4gIG1heEhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtib29rUHVibGlzaGVkQXNNb2RlbCB7XG4gIG5ld1VybDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xiYXJTdGF0ZSB7XG4gIGNhblJlZG86IGJvb2xlYW47XG4gIGNhblVuZG86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXJsQWN0aW9uTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIHVybDogc3RyaW5nO1xuICB0YXJnZXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGFyZWRGaWx0ZXJXb3Jrc2hlZXRNb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAgd29ya3NoZWV0TmFtZTogc3RyaW5nO1xuICBpc0FjdGl2ZTogYm9vbGVhbjtcbiAgaXNFbmFibGVkOiBib29sZWFuO1xuICBpc1NlbGVjdGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlZEZpbHRlck1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICB3b3Jrc2hlZXRzOiBBcnJheTxTaGFyZWRGaWx0ZXJXb3Jrc2hlZXRNb2RlbD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICB1c2VySWQ6IG51bWJlcjtcbiAgdXNlck5hbWU6IHN0cmluZztcbiAgdXNlckZyaWVuZGx5TmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbVZpZXdNb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgdXJsSWQ6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIHN0YXJ0Vmlld0lkOiBzdHJpbmc7XG4gIHNoYXJlZDogYm9vbGVhbjtcbiAgb3duZXI6IFVzZXJNb2RlbDtcbiAgbHVpZDogc3RyaW5nO1xuICBpc0RlZmF1bHQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tVmlld0luZm9Nb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAgY3VycmVudFZpZXc/OiBDdXN0b21WaWV3TW9kZWw7XG4gIGN1c3RvbVZpZXdzTGlzdDogQXJyYXk8Q3VzdG9tVmlld01vZGVsPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdG9yeU1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICBhY3RpdmVTdG9yeVBvaW50SW5kZXg6IG51bWJlcjtcbiAgc3RvcnlQb2ludHM6IEFycmF5PFN0b3J5UG9pbnRNb2RlbD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcnlQb2ludE1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICBjYXB0aW9uOiBzdHJpbmc7XG4gIGluZGV4OiBudW1iZXI7XG4gIHVwZGF0ZWQ6IGJvb2xlYW47XG4gIHN0b3J5UG9pbnRJZDogbnVtYmVyO1xuICBjb250YWluZWRTaGVldEluZm8/OiBDb250YWluZWRTaGVldEluZm9Nb2RlbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRpbmdBYnN0cmFjdFF1ZXJ5IHtcbiAgYWJzdHJhY3RRdWVyeTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElzQW5hbHl0aWNzQXNzaXN0YW50QXZhaWxhYmxlIGV4dGVuZHMgTW9kZWwge1xuICBpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZTogYm9vbGVhbjtcbn1cblxuLy8vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vLy8gRXhwb3J0IE1vZGVsc1xuLy8vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCB0eXBlIEV4cG9ydENyb3NzdGFiU2hlZXRNYXAgPSB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG5leHBvcnQgdHlwZSBTY2FsaW5nU2VsZWN0aW9uID0gRW51bXMuRml0UGFnZXMgfCBFbnVtcy5QYWdlU2NhbGluZ09wdGlvbjtcblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRGaWxlIGV4dGVuZHMgTW9kZWwge1xuICByZXN1bHRLZXk6IHN0cmluZztcbiAgaGFzVXNlclNwZWNpZmljQ29udGVudDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRMYXlvdXRPcHRpb25zIGV4dGVuZHMgTW9kZWwge1xuICBwYWdlU2l6ZU9wdGlvbjogRW51bXMuUGFnZVNpemVPcHRpb247XG4gIHBhZ2VPcmllbnRhdGlvbk9wdGlvbjogRW51bXMuUGFnZU9yaWVudGF0aW9uO1xuICBwYWdlU2NhbGVNb2RlOiBFbnVtcy5TY2FsZU1vZGU7XG4gIHBhZ2VTY2FsZVBlcmNlbnQ6IG51bWJlcjtcbiAgcGFnZUZpdEhvcml6b250YWw6IG51bWJlcjtcbiAgcGFnZUZpdFZlcnRpY2FsOiBudW1iZXI7XG4gIGltYWdlSGVpZ2h0OiBudW1iZXI7XG4gIGltYWdlV2lkdGg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGVldE1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICBzaGVldDogc3RyaW5nO1xuICBpc0Rhc2hib2FyZDogYm9vbGVhbjtcbiAgaXNTdG9yeTogYm9vbGVhbjtcbiAgbmFtZXNPZlN1YnNoZWV0czogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVyU2hlZXRNb2RlbCBleHRlbmRzIFNoZWV0TW9kZWwge1xuICBpc1B1Ymxpc2hlZDogYm9vbGVhbjtcbiAgYmFzZVZpZXdUaHVtYkxpbms6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQREZTaGVldCBleHRlbmRzIFNlcnZlclNoZWV0TW9kZWwge1xuICBpc1NlbGVjdGVkOiBib29sZWFuO1xuICBleHBvcnRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydFBERk9wdGlvbnMgZXh0ZW5kcyBNb2RlbCB7XG4gIGN1cnJlbnRTaGVldDogc3RyaW5nO1xuICBleHBvcnRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zO1xuICBzaGVldE9wdGlvbnM6IFBERlNoZWV0W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlzdWFsU3BlY2lmaWNhdGlvbiB7XG4gIHJvd0ZpZWxkczogRmllbGRJbnN0YW5jZVtdO1xuICBjb2x1bW5GaWVsZHM6IEZpZWxkSW5zdGFuY2VbXTtcbiAgYWN0aXZlTWFya3NTcGVjaWZpY2F0aW9uSW5kZXg6IG51bWJlcjtcbiAgbWFya3NTcGVjaWZpY2F0aW9uczogTWFya3NTcGVjaWZpY2F0aW9uW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFya3NTcGVjaWZpY2F0aW9uIHtcbiAgcHJpbWl0aXZlVHlwZTogRW51bXMuTWFya1R5cGU7XG4gIGVuY29kaW5nczogRW5jb2RpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbmNvZGluZyB7XG4gIGlkOiBzdHJpbmc7XG4gIGZpZWxkRW5jb2RpbmdJZDogc3RyaW5nO1xuICB0eXBlOiBFbnVtcy5FbmNvZGluZ1R5cGU7XG4gIGZpZWxkOiBGaWVsZEluc3RhbmNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvb2x0aXBUZXh0UmVxdWVzdCBleHRlbmRzIE1vZGVsIHtcbiAgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkO1xuICB0dXBsZUlkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb24gZXh0ZW5kcyBNb2RlbCB7XG4gIHZpc3VhbElkUHJlc01vZGVsOiBWaXN1YWxJZDtcbiAgdHVwbGVJZHM6IEFycmF5PG51bWJlcj47XG4gIHNlbGVjdE9wdGlvbnM6IEVudW1zLlNlbGVjdE9wdGlvbnM7XG4gIHRvb2x0aXBDb250ZXh0PzogVG9vbHRpcENvbnRleHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG92ZXJUdXBsZUludGVyYWN0aW9uIGV4dGVuZHMgTW9kZWwge1xuICB2aXN1YWxJZFByZXNNb2RlbDogVmlzdWFsSWQ7XG4gIHR1cGxlSWQ6IG51bWJlcjtcbiAgdG9vbHRpcENvbnRleHQ/OiBUb29sdGlwQ29udGV4dCB8IG51bGw7XG4gIGFsbG93SG92ZXJBY3Rpb25zPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb29sdGlwQ29udGV4dCBleHRlbmRzIE1vZGVsIHtcbiAgdG9vbHRpcEFuY2hvclBvaW50OiBQb2ludDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb2ludCBleHRlbmRzIE1vZGVsIHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBQdWxzZUZpZWxkVmFsdWVBcnJheSBpcyBhbiBhcnJheSB0aGF0IGNhbiBjb250YWluIHN0cmluZ3MsIGJvb2xlYW5zLCBvciBudWxscywgYnV0IHdpbGwgbmV2ZXIgY29udGFpbiBib3RoIHN0cmluZ3MgYW5kIGJvb2xlYW5zIGF0IHRoZSBzYW1lIHRpbWUuXG4gKi9cbmV4cG9ydCB0eXBlIFB1bHNlRmllbGRWYWx1ZUFycmF5ID0gQXJyYXk8Ym9vbGVhbiB8IG51bGw+IHwgQXJyYXk8c3RyaW5nIHwgbnVsbD47XG4iLCJleHBvcnQgZW51bSBOb3RpZmljYXRpb25JZCB7XG4gIEN1c3RvbU1hcmtDb250ZXh0TWVudUNsaWNrZWQgPSAnY3VzdG9tLW1hcmstY29udGV4dC1tZW51LWNsaWNrZWQnLFxuICBDb250ZXh0TWVudUNsaWNrID0gJ2NvbnRleHQtbWVudS1jbGljaycsXG4gIEN1c3RvbVZpZXdSZW1vdmVkID0gJ2N1c3RvbS12aWV3LXJlbW92ZWQnLFxuICBDdXN0b21WaWV3U2F2ZWQgPSAnY3VzdG9tLXZpZXctc2F2ZWQnLFxuICBDdXN0b21WaWV3U2V0RGVmYXVsdCA9ICdjdXN0b20tdmlldy1zZXQtZGVmYXVsdCcsXG4gIEN1c3RvbVZpZXdzTG9hZGVkID0gJ2N1c3RvbS12aWV3cy1sb2FkZWQnLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VkID0gJ2Rhc2hib2FyZC1sYXlvdXQtY2hhbmdlZCcsXG4gIEVkaXRCdXR0b25DbGlja2VkID0gJ2VkaXQtYnV0dG9uLWNsaWNrZWQnLFxuICBFZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCA9ICdlZGl0LWluLWRlc2t0b3AtYnV0dG9uLWNsaWNrZWQnLFxuICBFeHRlbnNpb25EaWFsb2dVcGRhdGUgPSAnZXh0ZW5zaW9uLWRpYWxvZy11cGRhdGUnLFxuICBFeHRlbnNpb25EaWFsb2dNZXNzYWdlID0gJ2V4dGVuc2lvbi1kaWFsb2ctbWVzc2FnZScsXG4gIEZpbHRlckNoYW5nZWQgPSAnZmlsdGVyLWNoYW5nZWQnLFxuICBGaXJzdFZpelNpemVLbm93biA9ICdmaXJzdC12aXotc2l6ZS1rbm93bicsXG4gIEZpcnN0UHVsc2VNZXRyaWNTaXplS25vd24gPSAnZmlyc3QtcHVsc2UtbWV0cmljLXNpemUta25vd24nLFxuICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlci1jaGFuZ2VkJyxcbiAgUHVsc2VFcnJvciA9ICdwdWxzZS1lcnJvcicsXG4gIFB1bHNlRmlsdGVyc0NoYW5nZWQgPSAncHVsc2UtZmlsdGVycy1jaGFuZ2VkJyxcbiAgUHVsc2VNZXRyaWNTaXplQ2hhbmdlZCA9ICdwdWxzZS1tZXRyaWMtc2l6ZS1jaGFuZ2VkJyxcbiAgUHVsc2VJbnNpZ2h0RGlzY292ZXJlZCA9ICdwdWxzZS1pbnNpZ2h0LWRpc2NvdmVyZWQnLFxuICBQdWxzZUludGVyYWN0aXZlID0gJ3B1bHNlLWludGVyYWN0aXZlJyxcbiAgUHVsc2VUaW1lRGltZW5zaW9uQ2hhbmdlZCA9ICdwdWxzZS10aW1lLWRpbWVuc2lvbi1jaGFuZ2VkJyxcbiAgUHVsc2VVcmxDaGFuZ2VkID0gJ3B1bHNlLXVybC1jaGFuZ2VkJyxcbiAgU2VsZWN0ZWRNYXJrc0NoYW5nZWQgPSAnc2VsZWN0ZWQtbWFya3MtY2hhbmdlZCcsXG4gIFNldHRpbmdzQ2hhbmdlZCA9ICdzZXR0aW5ncy1jaGFuZ2VkJyxcbiAgU3VtbWFyeURhdGFDaGFuZ2VkID0gJ3N1bW1hcnktZGF0YS1jaGFuZ2VkJyxcbiAgVGVzdENvbnZlcnNpb25Ob3RpZmljYXRpb24gPSAndGVzdC1jb252ZXJzaW9uLW5vdGlmaWNhdGlvbicsXG4gIFRvb2xiYXJTdGF0ZUNoYW5nZWQgPSAndG9vbGJhci1zdGF0ZS1jaGFuZ2VkJyxcbiAgVml6SW50ZXJhY3RpdmUgPSAndml6LWludGVyYWN0aXZlJyxcbiAgQXNrRGF0YUludGVyYWN0aXZlID0gJ2Fzay1kYXRhLWludGVyYWN0aXZlJyxcbiAgV29ya2Jvb2tSZWFkeVRvQ2xvc2UgPSAnd29ya2Jvb2stcmVhZHktdG8tY2xvc2UnLFxuICBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkID0gJ3dvcmtib29rLWZvcm1hdHRpbmctY2hhbmdlZCcsXG4gIFdvcmtib29rUHVibGlzaGVkID0gJ3dvcmtib29rLXB1Ymxpc2hlZCcsXG4gIFdvcmtib29rUHVibGlzaGVkQXMgPSAnd29ya2Jvb2stcHVibGlzaGVkLWFzJyxcbiAgV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWQgPSAnd29ya3NoZWV0LWZvcm1hdHRpbmctY2hhbmdlZCcsXG4gIFVybEFjdGlvbiA9ICd1cmwtYWN0aW9uJyxcbiAgVGFiU3dpdGNoZWQgPSAndGFiLXN3aXRjaGVkJyxcbiAgU3RvcnlQb2ludFN3aXRjaGVkID0gJ3N0b3J5LXBvaW50LXN3aXRjaGVkJyxcbiAgUmVhZHlUb1JlY2VpdmVBdXRoVG9rZW4gPSAncmVhZHktdG8tcmVjZWl2ZS1hdXRoLXRva2VuJyxcbn1cbiIsIi8vIFBMRUFTRSBLRUVQIElOIEFMUEhBQkVUSUNBTCBPUkRFUi4gVGhpcyBoZWxwcyB3aXRoIHZpc3VhbGx5IGZpbmRpbmcgZW50cmllcywga25vd2luZyB3aGVyZSB0byBwdXRcbi8vIG5ldyBvbmVzLCBhbmQgbWVyZ2UgY29uZmxpY3RzLlxuZXhwb3J0IGVudW0gUGFyYW1ldGVySWQge1xuICBBY3RpdmVUYWJsZXNJbmZvID0gJ2FjdGl2ZS10YWJsZXMtaW5mbycsXG4gIEFuY2hvckRhdGUgPSAnYW5jaG9yLWRhdGUnLFxuICBBbm5vdGF0ZUVudW0gPSAnYW5ub3RhdGUtZW51bScsXG4gIEFubm90YXRpb25MaXN0ID0gJ2Fubm90YXRpb24tbGlzdCcsXG4gIEFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyA9ICdhcHBseS13b3Jrc2hlZXQtZm9ybWF0dGluZycsXG5cbiAgQ2F0ZWdvcmljYWxEb21haW4gPSAnY2F0ZWdvcmljYWwtZG9tYWluJyxcbiAgQ2xpY2tUaHJvdWdoRW5hYmxlZCA9ICdjbGljay10aHJvdWdoLWVuYWJsZWQnLFxuICBDb2x1bW5zID0gJ2NvbHVtbnMnLFxuICBDb2x1bW5zVG9JbmNsdWRlID0gJ2NvbHVtbnMtdG8taW5jbHVkZScsXG4gIENvbHVtbnNUb0luY2x1ZGVCeUlkID0gJ2NvbHVtbnMtdG8taW5jbHVkZS1ieS1pZCcsXG4gIENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcmllcyA9ICdjb25uZWN0aW9uLWRlc2NyaXB0aW9uLXN1bW1hcmllcycsXG4gIEN1cnJlbnRTaGVldFR5cGUgPSAnY3VycmVudC1zaGVldC10eXBlJyxcbiAgQ3VzdG9tVmlldyA9ICdjdXN0b20tdmlldycsXG4gIEN1c3RvbVZpZXdJc0RlZmF1bHQgPSAnY3VzdG9tLXZpZXctaXMtZGVmYXVsdCcsXG4gIEN1c3RvbVZpZXdJc1B1YmxpYyA9ICdjdXN0b20tdmlldy1pcy1wdWJsaWMnLFxuICBDdXN0b21WaWV3THVpZCA9ICdjdXN0b20tdmlldy1sdWlkJyxcbiAgQ3VzdG9tVmlld05hbWUgPSAnY3VzdG9tLXZpZXctbmFtZScsXG4gIEN1c3RvbVZpZXdzID0gJ2N1c3RvbS12aWV3cycsXG5cbiAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gIERhc2hib2FyZEZpbHRlcnMgPSAnZGFzaGJvYXJkLWZpbHRlcnMnLFxuICBEYXNoYm9hcmROYW1lID0gJ2Rhc2hib2FyZCcsXG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSA9ICdkYXNoYm9hcmQtb2JqZWN0LXBvc2l0aW9uLWFuZC1zaXplLXVwZGF0ZScsXG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUxpc3QgPSAnZGFzaGJvYXJkLW9iamVjdC1wb3NpdGlvbi1hbmQtc2l6ZS11cGRhdGUtbGlzdCcsXG4gIERhdGFSb3dJbmRleCA9ICdkYXRhLXJvdy1pbmRleCcsXG4gIERhdGFTY2hlbWEgPSAnZGF0YS1zY2hlbWEnLFxuICBEYXRhU291cmNlID0gJ2RhdGEtc291cmNlJyxcbiAgRGF0YVNvdXJjZURhdGFUYWJsZSA9ICdkYXRhLXNvdXJjZS1kYXRhLXRhYmxlJyxcbiAgRGF0YVNvdXJjZUlkID0gJ2RhdGEtc291cmNlLWlkJyxcbiAgRGF0YVNvdXJjZU5hbWUgPSAnZGF0YS1zb3VyY2UtbmFtZScsXG4gIERhdGFUYWJsZSA9ICdkYXRhLXRhYmxlJyxcbiAgRGF0YVRhYmxlUmVhZGVyID0gJ2RhdGEtdGFibGUtcmVhZGVyJyxcbiAgRGF0ZVJhbmdlVHlwZSA9ICdkYXRlLXJhbmdlLXR5cGUnLFxuICBEZWxldGVDb3VudCA9ICdkZWxldGUtY291bnQnLFxuICBEZWx0YVRpbWVNcyA9ICdkZWx0YS10aW1lLW1zJyxcbiAgRGltVmFsU2VsZWN0aW9uTW9kZWxzID0gJ2RpbWVuc2lvblZhbHVlU2VsZWN0aW9uTW9kZWxzJyxcbiAgRG9tYWluVHlwZSA9ICdkb21haW4tdHlwZScsXG5cbiAgRW1iZWRkaW5nQWJzdHJhY3RRdWVyeSA9ICdlbWJlZGRpbmctYWJzdHJhY3QtcXVlcnknLFxuICBFbWJlZGRpbmdCb290c3RyYXBJbmZvID0gJ2VtYmVkZGluZy1ib290c3RyYXAtaW5mbycsXG4gIEVuY29kaW5nVHlwZSA9ICdlbmNvZGluZy10eXBlJyxcbiAgRXhwb3J0Q3Jvc3N0YWJTaGVldE1hcCA9ICdleHBvcnQtY3Jvc3N0YWItc2hlZXQtbWFwJyxcbiAgRXhwb3J0RmlsZSA9ICdleHBvcnQtZmlsZScsXG4gIEV4cG9ydE9yaWdpblVybCA9ICdleHBvcnQtb3JpZ2luLXVybCcsXG4gIEV4cG9ydFBkZk9wdGlvbnMgPSAnZXhwb3J0LXBkZi1vcHRpb25zJyxcbiAgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbyA9ICdleHRlbnNpb24tYm9vdHN0cmFwLWluZm8nLFxuICBFeHRlbnNpb25Db250ZXh0TWVudUlkcyA9ICdleHRlbnNpb24tY29udGV4dC1tZW51LWlkcycsXG4gIEV4dGVuc2lvbkRpYWxvZ0ggPSAnZXh0ZW5zaW9uLWRpYWxvZy1oZWlnaHQnLFxuICBFeHRlbnNpb25EaWFsb2dNZXNzYWdlID0gJ2V4dGVuc2lvbi1kaWFsb2ctbWVzc2FnZScsXG4gIEV4dGVuc2lvbkRpYWxvZ1BheWxvYWQgPSAnZXh0ZW5zaW9uLWRpYWxvZy1wYXlsb2FkJyxcbiAgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0ID0gJ2V4dGVuc2lvbi1kaWFsb2ctcmVzdWx0JyxcbiAgRXh0ZW5zaW9uRGlhbG9nU3R5bGUgPSAnZXh0ZW5zaW9uLWRpYWxvZy1zdHlsZScsXG4gIEV4dGVuc2lvbkRpYWxvZ1VybCA9ICdleHRlbnNpb24tZGlhbG9nLXVybCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1VybFNvdXJjZSA9ICdleHRlbnNpb24tZGlhbG9nLXVybC1zb3VyY2UnLFxuICBFeHRlbnNpb25EaWFsb2dXID0gJ2V4dGVuc2lvbi1kaWFsb2ctd2lkdGgnLFxuICBFeHRlbnNpb25Mb2NhdG9yID0gJ2V4dGVuc2lvbi1sb2NhdG9yJyxcbiAgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvID0gJ2V4dGVuc2lvbi1zZXR0aW5ncy1pbmZvJyxcbiAgRXh0ZW5zaW9uWm9uZUlkID0gJ2V4dGVuc2lvbi16b25lLWlkJyxcbiAgRXh0ZW5zaW9uTWVkaWFCbG9iID0gJ2V4dGVuc2lvbi1tZWRpYS1ibG9iJyxcbiAgSGFzRXh0ZW5zaW9uUmVuZGVyaW5nVGltZWRPdXQgPSAnaGFzLWV4dGVuc2lvbi1yZW5kZXJpbmctdGltZWQtb3V0JyxcbiAgRXh0ZXJuYWxNZW51RGVzY3JpcHRpb24gPSAnZXh0ZXJuYWwtbWVudS1kZXNjcmlwdGlvbicsXG4gIEV4dGVybmFsTWVudUhlYWRlciA9ICdleHRlcm5hbC1tZW51LWhlYWRlcicsXG4gIEV4dGVybmFsTWVudUl0ZW1EaXNwbGF5TmFtZSA9ICdleHRlcm5hbC1tZW51LWl0ZW0tZGlzcGxheS1uYW1lJyxcbiAgRXh0ZXJuYWxNZW51SXRlbUlkID0gJ2V4dGVybmFsLW1lbnUtaXRlbS1pZCcsXG5cbiAgRmllbGQgPSAnZmllbGQnLFxuICBGaWVsZENvdW50ID0gJ2ZpZWxkLWNvdW50JyxcbiAgRmllbGRJZCA9ICdmaWVsZC1pZCcsXG4gIEZpZWxkTmFtZSA9ICdmaWVsZC1uYW1lJyxcbiAgRmlsdGVyTGV2ZWxzID0gJ2ZpbHRlci1sZXZlbHMnLFxuICBGaWx0ZXJSYW5nZU1heCA9ICdmaWx0ZXItcmFuZ2UtbWF4JyxcbiAgRmlsdGVyUmFuZ2VNaW4gPSAnZmlsdGVyLXJhbmdlLW1pbicsXG4gIEZpbHRlclJhbmdlTnVsbE9wdGlvbiA9ICdmaWx0ZXItcmFuZ2UtbnVsbC1vcHRpb24nLFxuICBGaWx0ZXJVcGRhdGVUeXBlID0gJ2ZpbHRlci11cGRhdGUtdHlwZScsXG4gIEZpbHRlclZhbHVlcyA9ICdmaWx0ZXItdmFsdWVzJyxcbiAgRm9udE5hbWVMaXN0SXRlbXMgPSAnZm9udC1uYW1lLWxpc3QtaXRlbXMnLFxuICBGb3JtYXR0ZWRUZXh0ID0gJ2Zvcm1hdHRlZC10ZXh0JyxcbiAgRnVuY3Rpb25OYW1lID0gJ2Z1bmN0aW9uLW5hbWUnLFxuICBGcm9tSW5kZXggPSAnZnJvbS1pbmRleCcsXG5cbiAgSGllclZhbFNlbGVjdGlvbk1vZGVscyA9ICdoaWVyYXJjaGljYWxWYWx1ZVNlbGVjdGlvbk1vZGVscycsXG4gIEhpZ2hsaWdodGVkRGF0YSA9ICdoaWdobGlnaHRlZC1kYXRhJyxcbiAgSG92ZXJUdXBsZUludGVyYWN0aW9uID0gJ2hvdmVyLXR1cGxlLWludGVyYWN0aW9uJyxcblxuICBJZ25vcmVBbGlhc2VzID0gJ2lnbm9yZS1hbGlhc2VzJyxcbiAgSWdub3JlU2VsZWN0aW9uID0gJ2lnbm9yZS1zZWxlY3Rpb24nLFxuICBJbmNsdWRlQWxsQ29sdW1ucyA9ICdpbmNsdWRlLWFsbC1jb2x1bW5zJyxcbiAgSW52YWxpZEFnZ0ZpZWxkTmFtZSA9ICdpbnZhbGlkLWFnZy1maWVsZC1uYW1lJyxcbiAgSW52YWxpZERhdGVzID0gJ2ludmFsaWQtZGF0ZXMnLFxuICBJbnZhbGlkRmllbGRDYXB0aW9uID0gJ2ludmFsaWQtZmllbGQtY2FwdGlvbicsXG4gIEludmFsaWRGaWVsZHMgPSAnaW52YWxpZC1maWVsZHMnLFxuICBJbnZhbGlkVmFsdWVzID0gJ2ludmFsaWQtdmFsdWVzJyxcbiAgSXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUgPSAnaXMtYW5hbHl0aWNzLWFzc2lzdGFudC1hdmFpbGFibGUnLFxuICBJc0V4Y2x1ZGVNb2RlID0gJ2lzLWV4Y2x1ZGUnLFxuICBJc0V4dGVuc2lvbkRpYWxvZyA9ICdpcy1leHRlbnNpb24tZGlhbG9nJyxcbiAgSXNGcm9tQ2FsY0RpYWxvZyA9ICdpcy1mcm9tLWNhbGMtZGlhbG9nJyxcblxuICBKb2luRGVzY3JpcHRpb24gPSAnam9pbi1kZXNjcmlwdGlvbicsXG5cbiAgTG9naWNhbFRhYmxlSWQgPSAnbG9naWNhbC10YWJsZS1pZCcsXG4gIExvZ2ljYWxUYWJsZUluZm9MaXN0ID0gJ2xvZ2ljYWwtdGFibGUtaW5mby1saXN0JyxcblxuICBNYXJrc0NhcmRJbmRleCA9ICdtYXJrcy1jYXJkLWluZGV4JyxcbiAgTWF4SGVpZ2h0ID0gJ21heC1oZWlnaHQnLFxuICBNYXhSb3dzID0gJ21heC1yb3dzJyxcbiAgTWF4V2lkdGggPSAnbWF4LXdpZHRoJyxcbiAgTWluSGVpZ2h0ID0gJ21pbi1oZWlnaHQnLFxuICBNaW5XaWR0aCA9ICdtaW4td2lkdGgnLFxuXG4gIFBhZ2VSb3dDb3VudCA9ICdwYWdlLXJvdy1jb3VudCcsXG4gIFBhcmFtZXRlckNhcHRpb24gPSAncGFyZW1ldGVyLWNhcHRpb24nLFxuICBQYXJhbWV0ZXJFcnJvciA9ICdwYXJhbWV0ZXItZXJyb3InLFxuICBQYXJhbWV0ZXJGaWVsZE5hbWUgPSAncGFyYW1ldGVyLWZpZWxkLW5hbWUnLFxuICBQYXJhbWV0ZXJJbmZvID0gJ3BhcmFtZXRlci1pbmZvJyxcbiAgUGFyYW1ldGVySW5mb3MgPSAncGFyYW1ldGVyLWluZm9zJyxcbiAgUGFyYW1ldGVyVmFsdWUgPSAncGFyYW1ldGVyLXZhbHVlJyxcbiAgUGVyaW9kVHlwZSA9ICdwZXJpb2QtdHlwZScsXG4gIFB1bHNlRmllbGROYW1lID0gJ2ZpZWxkTmFtZScsXG4gIFB1bHNlRmllbGROYW1lcyA9ICdmaWVsZE5hbWVzJyxcbiAgUHVsc2VGaWx0ZXJEb21haW5UeXBlID0gJ2RvbWFpblR5cGUnLFxuICBQdWxzZUZpbHRlckRvbWFpblNlYXJjaFRlcm0gPSAnc2VhcmNoVGVybScsXG4gIFB1bHNlUGFnZVNpemUgPSAncGFnZVNpemUnLFxuICBQdWxzZU5leHRQYWdlVG9rZW4gPSAnbmV4dFBhZ2VUb2tlbicsXG4gIFB1bHNlRmlsdGVycyA9ICdmaWx0ZXJzJyxcbiAgUHVsc2VUaW1lRGltZW5zaW9uID0gJ3RpbWVEaW1lbnNpb24nLFxuXG4gIFF1YW50aXRhdGl2ZURvbWFpbiA9ICdxdWFudGl0YXRpdmUtZG1haW4nLFxuICBRdWFudFJhbmdlU2VsZWN0aW9uTW9kZWxzID0gJ3F1YW50YXRpdmVSYW5nZVNlbGVjdGlvbk1vZGVscycsXG5cbiAgUmFuZ2VOID0gJ3JhbmdlLW4nLFxuICBSZXBsYXlTcGVlZCA9ICdyZXBsYXktc3BlZWQnLFxuXG4gIFNlbGVjdGVkRGF0YSA9ICdzZWxlY3RlZC1kYXRhJyxcbiAgU2VsZWN0ZWRTaGVldE5hbWVzID0gJ3NlbGVjdGVkLXNoZWV0LW5hbWVzJyxcbiAgU2VsZWN0aW9uID0gJ3NlbGVjdGlvbicsXG4gIFNlbGVjdGlvbkxpc3QgPSAnc2VsZWN0aW9uLWxpc3QnLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlID0gJ3NlbGVjdGlvblVwZGF0ZVR5cGUnLFxuICBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiA9ICdzZWxlY3QtdHVwbGVzLWludGVyYWN0aW9uJyxcbiAgU2VuZE5vdGlmaWNhdGlvbnMgPSAnc2VuZC1ub3RpZmljYXRpb25zJyxcbiAgU2V0dGluZ3NWYWx1ZXMgPSAnc2V0dGluZ3MtdmFsdWVzJyxcbiAgU2hhcmVkRmlsdGVyU2hlZXRzID0gJ3NoYXJlZC1maWx0ZXItc2hlZXRzJyxcbiAgU2hhcmVkRmlsdGVyc0luZm8gPSAnc2hhcmVkLWZpbHRlcnMtaW5mbycsXG4gIFNoZWV0SWRlbnRpZmllciA9ICdzaGVldC1pZGVudGlmaWVyJyxcbiAgU2hlZXROYW1lID0gJ3NoZWV0LW5hbWUnLFxuICBTaGVldFBhdGggPSAnc2hlZXQtcGF0aCcsXG4gIFNob3VsZFJlZnJlc2hEUyA9ICdzaG91bGQtcmVmcmVzaC1kcycsXG4gIFNob3dEYXRhVGFibGVGb3JtYXQgPSAnc2hvdy1kYXRhLXRhYmxlLWZvcm1hdCcsXG4gIFN0YXJ0SW5kZXggPSAnc3RhcnQtaW5kZXgnLFxuICBTdGF0ZSA9ICdzdGF0ZScsXG4gIFN0b3J5UG9pbnRJbmRleCA9ICdzdG9yeS1wb2ludC1pbmRleCcsXG4gIFN0b3J5UG9pbnRJbmZvID0gJ3N0b3J5LXBvaW50LWluZm8nLFxuICBTd2l0Y2hUb1NoZWV0TmFtZSA9ICdzd2l0Y2gtdG8tc2hlZXQtbmFtZScsXG5cbiAgVGFyZ2V0UG9pbnQgPSAndGFyZ2V0LXBvaW50JyxcbiAgVGVzdENvbnZlcnNpb25QYXJhbWV0ZXIgPSAndGVzdC1jb252ZXJzaW9uLXBhcmFtZXRlcicsXG4gIFRleHQgPSAnZm9ybWF0dGVkLXRleHQnLFxuICBUb0luZGV4ID0gJ3RvLWluZGV4JyxcbiAgVG9vbHRpcENvbnRleHQgPSAndG9vbHRpcC1jb250ZXh0JyxcbiAgVG9vbHRpcFRleHRSZXF1ZXN0ID0gJ3Rvb2x0aXAtdGV4dC1yZXF1ZXN0JyxcbiAgVG9vbHRpcFRleHQgPSAndG9vbHRpcC10ZXh0JyxcblxuICBVbmRlcmx5aW5nRGF0YVRhYmxlID0gJ3VuZGVybHlpbmctZGF0YS10YWJsZScsXG4gIFVuZGVybHlpbmdTdW1tYXJ5RGF0YVRhYmxlID0gJ3VuZGVybHlpbmctc3VtbWFyeS1kYXRhLXRhYmxlJyxcbiAgVXJsID0gJ3VybCcsXG4gIFVzZVRhYkRlbGltaXRlcnMgPSAndXNlLXRhYi1kZWxpbWl0ZXJzJyxcblxuICBWaWV3RGF0YVRhYmxlQ2FjaGVJZCA9ICd2aWV3LWRhdGEtdGFibGUtY2FjaGUtaWQnLFxuICBWaWV3RGF0YVRhYmxlSWQgPSAndmlldy1kYXRhLXRhYmxlLWlkJyxcbiAgVmlzdWFsSWQgPSAndmlzdWFsLWlkJyxcbiAgVmlzdWFsU3BlY2lmaWNhdGlvbiA9ICd2aXN1YWwtc3BlY2lmaWNhdGlvbicsXG4gIFZpekFQSUlucHV0SnNvbiA9ICd2aXphcGktaW5wdXQtanNvbicsXG4gIFZpekFQSVN0YXRlV2l0aERhdGFNb2RlbCA9ICd2aXphcGktc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgVml6QVBJU3RhdGVXYXJuaW5nTXNnID0gJ3ZpemFwaS1zdGF0ZS13YXJuaW5nLW1zZycsXG4gIFZpekFQSVNWRyA9ICd2aXphcGktc3ZnJyxcblxuICBXb3Jrc2hlZXROYW1lID0gJ3dvcmtzaGVldC1uYW1lJyxcbiAgV29ya3NoZWV0RmlsdGVycyA9ICd3b3Jrc2hlZXQtZmlsdGVycycsXG5cbiAgWm9uZUlkc1Zpc2liaWxpdHlNYXAgPSAnem9uZS1pZHMtdmlzaWJpbGl0eS1tYXAnLFxufVxuIiwiLy8gRGVjbGFyZSB0aGlzIGtleSB0eXBlIGFuZCBleHBvcnQgdGhlIE5vdGlmaWNhdGlvbklkIHRvIG1ha2UgdGhpcyBiZWhhdmUgbGlrZSBhIHN0cmluZyBlbnVtLlxuLy9cbi8vIFBMRUFTRSBLRUVQIElOIEFMUEhBQkVUSUNBTCBPUkRFUi4gVGhpcyBoZWxwcyB3aXRoIHZpc3VhbGx5IGZpbmRpbmcgZW50cmllcywga25vd2luZyB3aGVyZSB0byBwdXRcbi8vIG5ldyBvbmVzLCBhbmQgbWVyZ2UgY29uZmxpY3RzLlxuZXhwb3J0IGVudW0gVmVyYklkIHtcbiAgQWN0aXZhdGVOZXh0U3RvcnlQb2ludCA9ICdhY3RpdmF0ZS1uZXh0LXN0b3J5LXBvaW50JyxcbiAgQWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnQgPSAnYWN0aXZhdGUtcHJldmlvdXMtc3RvcnktcG9pbnQnLFxuICBBY3RpdmF0ZVNoZWV0ID0gJ2FjdGl2YXRlU2hlZXQnLFxuICBBY3RpdmF0ZVN0b3J5UG9pbnQgPSAnYWN0aXZhdGUtc3RvcnktcG9pbnQnLFxuICBBZGRNYXJrc0NhcmRGaWVsZHMgPSAnYWRkLW1hcmtzLWNhcmQtZmllbGRzJyxcbiAgQXBwZW5kRXh0ZXJuYWxNZW51SXRlbSA9ICdhcHBlbmQtZXh0ZXJuYWwtbWVudS1pdGVtJyxcbiAgQXBwbHlDYXRlZ29yaWNhbEZpbHRlciA9ICdjYXRlZ29yaWNhbC1maWx0ZXInLFxuICBBcHBseVB1bHNlRmlsdGVycyA9ICdhcHBseS1wdWxzZS1maWx0ZXJzJyxcbiAgQXBwbHlQdWxzZVRpbWVEaW1lbnNpb24gPSAnYXBwbHktcHVsc2UtdGltZS1kaW1lbnNpb24nLFxuICBBcHBseVJhbmdlRmlsdGVyID0gJ3JhbmdlLWZpbHRlcicsXG4gIEFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyID0gJ2FwcGx5LXJlbGF0aXZlLWRhdGUtRmlsdGVyJyxcbiAgQXV0aGVudGljYXRlID0gJ2F1dGhlbnRpY2F0ZScsXG5cbiAgQmxvY2tFeHRlbnNpb24gPSAnYmxvY2stZXh0ZW5zaW9uJyxcblxuICBDaGFuZ2VQYXJhbWV0ZXJWYWx1ZSA9ICdjaGFuZ2UtcGFyYW1ldGVyLXZhbHVlJyxcbiAgQ2hhbmdlU2hhcmVkRmlsdGVyID0gJ2NoYW5nZS1zaGFyZWQtZmlsdGVyJyxcbiAgQ2xlYXJBbGxQdWxzZUZpbHRlcnMgPSAnY2xlYXItYWxsLXB1bHNlLWZpbHRlcnMnLFxuICBDbGVhckZpbHRlciA9ICdjbGVhci1maWx0ZXInLFxuICBDbGVhclB1bHNlRmlsdGVycyA9ICdjbGVhci1wdWxzZS1maWx0ZXJzJyxcbiAgQ2xlYXJTZWxlY3RlZE1hcmtzID0gJ2NsZWFyLXNlbGVjdGVkLW1hcmtzJyxcbiAgQ2xvc2VEaWFsb2cgPSAnY2xvc2UtZGlhbG9nJyxcbiAgQ3JlYXRlQW5ub3RhdGlvbiA9ICdjcmVhdGUtYW5ub3RhdGlvbicsXG5cbiAgRGFzaGJvYXJkQ2F0ZWdvcmljYWxGaWx0ZXIgPSAnZGFzaGJvYXJkLWNhdGVnb3JpY2FsLWZpbHRlcicsXG4gIERpc3BsYXlEaWFsb2cgPSAnZGlzcGxheS1kaWFsb2cnLFxuICBEb3dubG9hZFdvcmtib29rID0gJ2Rvd25sb2FkLXdvcmtib29rJyxcblxuICBFZGl0QWxpYXNlc0RpYWxvZyA9ICdlZGl0LWFsaWFzZXMtZGlhbG9nJyxcbiAgRXhlY3V0ZUV4dGVybmFsTWVudUl0ZW0gPSAnZXhlY3V0ZS1leHRlcm5hbC1tZW51LWl0ZW0nLFxuICBFeHBvcnRDcm9zc3RhYiA9ICdleHBvcnQtY3Jvc3N0YWInLFxuICBFeHBvcnRDcm9zc3RhYkNzdkRvd25sb2FkID0gJ2V4cG9ydC1jcm9zc3RhYi1jc3YtZG93bmxvYWQnLFxuICBFeHBvcnRDcm9zc3RhYkV4Y2VsRG93bmxvYWQgPSAnZXhwb3J0LWNyb3NzdGFiLWV4Y2VsLWRvd25sb2FkJyxcbiAgRXhwb3J0RGF0YSA9ICdleHBvcnQtZGF0YScsXG4gIEV4cG9ydERhdGFEb3dubG9hZCA9ICdleHBvcnQtZGF0YS1kb3dubG9hZCcsXG4gIEV4cG9ydEltYWdlID0gJ2V4cG9ydC1pbWFnZScsXG4gIEV4cG9ydFBkZiA9ICdleHBvcnQtcGRmJyxcbiAgRXhwb3J0UGRmRG93bmxvYWQgPSAnZXhwb3J0LXBkZi1kb3dubG9hZCcsXG4gIEV4cG9ydFBvd2VycG9pbnQgPSAnZXhwb3J0LXBvd2VycG9pbnQnLFxuICBFeHBvcnRQb3dlcnBvaW50RG93bmxvYWQgPSAnZXhwb3J0LXBvd2VycG9pbnQtZG93bmxvYWQnLFxuXG4gIEZpbmRQYXJhbWV0ZXIgPSAnZmluZC1wYXJhbWV0ZXInLFxuXG4gIEdldEFjdGl2ZVRhYmxlcyA9ICdnZXQtYWN0aXZlLXRhYmxlcycsXG4gIEdldEFsbERhdGFTb3VyY2VzID0gJ2dldC1hbGwtZGF0YS1zb3VyY2VzJyxcbiAgR2V0QW5ub3RhdGlvbnMgPSAnZ2V0LWFubm90YXRpb25zJyxcbiAgR2V0Q2F0ZWdvcmljYWxEb21haW4gPSAnZ2V0LWNhdGVnb3JpY2FsLWRvbWFpbicsXG4gIEdldENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcmllcyA9ICdnZXQtY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBHZXRDdXJyZW50U3JjID0gJ2dldC1jdXJyZW50LXNyYycsXG4gIEdldEN1c3RvbVZpZXdzID0gJ2dldC1jdXN0b20tdmlld3MnLFxuICBHZXREYXNoYm9hcmRGaWx0ZXJzID0gJ2dldC1kYXNoYm9hcmQtZmlsdGVycycsXG4gIEdldERhdGFTb3VyY2UgPSAnZ2V0LWRhdGFzb3VyY2UnLFxuICBHZXREYXRhU291cmNlRGF0YSA9ICdnZXQtZGF0YXNvdXJjZS1kYXRhJyxcbiAgR2V0RGF0YVNvdXJjZXMgPSAnZ2V0LWRhdGEtc291cmNlcycsXG4gIEdldERhdGFTdW1tYXJ5RGF0YSA9ICdnZXQtc3VtbWFyeS1kYXRhJyxcbiAgR2V0RGF0YVN1bW1hcnlEYXRhUmVhZGVyID0gJ2dldC1zdW1tYXJ5LWRhdGEtcmVhZGVyJyxcbiAgR2V0RGF0YVRhYmxlUmVhZGVyUGFnZSA9ICdnZXQtZGF0YS10YWJsZS1yZWFkZXItcGFnZScsXG4gIEdldEVtYmVkZGluZ0Fic3RyYWN0UXVlcnlXaXRoRGF0YU1vZGVsID0gJ2dldC1lbWJlZGRpbmctYWJzdHJhY3QtcXVlcnktd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RW1iZWRkaW5nQ2xpZW50SW5mbyA9ICdnZXQtZW1iZWRkaW5nLWNsaWVudC1pbmZvJyxcbiAgR2V0Vml6U3RhdGVXaXRoRGF0YU1vZGVsID0gJ2dldC12aXotc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcCA9ICdnZXQtZXhwb3J0LWNyb3NzdGFiLXNoZWV0LW1hcCcsXG4gIEdldEV4cG9ydFBkZk9wdGlvbnMgPSAnZ2V0LWV4cG9ydC1wZGYtb3B0aW9ucycsXG4gIEdldEZpZWxkID0gJ2dldC1maWVsZCcsXG4gIEdldEZpZWxkQW5kRGF0YVNvdXJjZSA9ICdnZXQtZmllbGQtYW5kLWRhdGFzb3VyY2UnLFxuICBHZXRWaXN1YWxTcGVjaWZpY2F0aW9uID0gJ2dldC12aXN1YWwtc3BlY2lmaWNhdGlvbicsXG4gIEdldEZpbHRlcnMgPSAnZ2V0LWZpbHRlcnMnLFxuICBHZXRGb250cyA9ICdnZXQtZm9udHMnLFxuICBHZXRIaWdobGlnaHRlZE1hcmtzID0gJ2dldC1oaWdobGlnaHRlZC1tYXJrcycsXG4gIEdldEpvaW5EZXNjcmlwdGlvbiA9ICdnZXQtam9pbi1kZXNjcmlwdGlvbicsXG4gIEdldExvZ2ljYWxUYWJsZURhdGEgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YScsXG4gIEdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXIgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YS1yZWFkZXInLFxuICBHZXRMb2dpY2FsVGFibGVzID0gJ2dldC1sb2dpY2FsLXRhYmxlcycsXG4gIEdldFBhcmFtZXRlcnNGb3JTaGVldCA9ICdnZXQtcGFyYW1ldGVycy1mb3Itc2hlZXQnLFxuICBHZXRQdWxzZUNhdGVnb3JpY2FsRG9tYWluID0gJ2dldC1wdWxzZS1jYXRlZ29yaWNhbC1kb21haW4nLFxuICBHZXRQdWxzZUZpbHRlcnMgPSAnZ2V0LXB1bHNlLWZpbHRlcnMnLFxuICBHZXRQdWxzZVRpbWVEaW1lbnNpb24gPSAnZ2V0LXB1bHNlLXRpbWUtZGltZW5zaW9uJyxcbiAgR2V0UmFuZ2VEb21haW4gPSAnZ2V0LXJhbmdlLWRvbWFpbicsXG4gIEdldFNlbGVjdGVkTWFya3MgPSAnZ2V0LXNlbGVjdGVkLW1hcmtzJyxcbiAgR2V0U2hhcmVkRmlsdGVyID0gJ2dldC1zaGFyZWQtZmlsdGVyJyxcbiAgR2V0VG9vbHRpcFRleHQgPSAnZ2V0LXRvb2x0aXAtdGV4dCcsXG4gIEdldFVuZGVybHlpbmdEYXRhID0gJ2dldC11bmRlcmx5aW5nLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVEYXRhID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlLWRhdGEtcmVhZGVyJyxcbiAgR2V0VW5kZXJseWluZ1RhYmxlcyA9ICdnZXQtdW5kZXJseWluZy10YWJsZXMnLFxuXG4gIEhpZXJhcmNoaWNhbEZpbHRlciA9ICdoaWVyYWNoaWNhbC1maWx0ZXInLFxuXG4gIEluaXRpYWxpemVFeHRlbnNpb24gPSAnaW5pdGlhbGl6ZS1leHRlbnNpb24nLFxuICBJc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZSA9ICdpcy1hbmFseXRpY3MtYXNzaXN0YW50LWF2YWlsYWJsZScsXG5cbiAgTGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50ID0gJ2xhdW5jaC1hbmFseXRpY3MtYXNzaXN0YW50JyxcblxuICBNb3ZlQW5kUmVzaXplWm9uZXMgPSAnbW92ZS1hbmQtcmVzaXplLXpvbmVzJyxcbiAgTW92ZU1hcmtzQ2FyZEZpZWxkID0gJ21vdmUtbWFya3MtY2FyZC1maWVsZCcsXG5cbiAgUmFpc2VMZWF2ZU1hcmtOYXZOb3RpZmljYXRpb24gPSAncmFpc2UtbGVhdmUtbWFyay1uYXYtbm90aWZpY2F0aW9uJyxcbiAgUmFpc2VIb3ZlclR1cGxlTm90aWZpY2F0aW9uID0gJ3JhaXNlLWhvdmVyLXR1cGxlLW5vdGlmaWNhdGlvbicsXG4gIFJhaXNlU2VsZWN0VHVwbGVzTm90aWZpY2F0aW9uID0gJ3JhaXNlLXNlbGVjdC10dXBsZXMtbm90aWZpY2F0aW9uJyxcbiAgUmVkbyA9ICdyZWRvJyxcbiAgUmVmcmVzaERhdGFTb3VyY2UgPSAncmVmcmVzaC1kYXRhLXNvdXJjZScsXG4gIFJlbGVhc2VEYXRhVGFibGVSZWFkZXIgPSAncmVsZWFzZS1kYXRhLXRhYmxlLXJlYWRlcicsXG4gIFJlbW92ZUFubm90YXRpb24gPSAncmVtb3ZlLWFubm90YXRpb24nLFxuICBSZW1vdmVDdXN0b21WaWV3ID0gJ3JlbW92ZS1jdXN0b20tdmlldycsXG4gIFJlbW92ZUV4dGVybmFsTWVudUl0ZW0gPSAncmVtb3ZlLWV4dGVybmFsLW1lbnUtaXRlbScsXG4gIFJlbmFtZUV4dGVybmFsTWVudSA9ICdyZW5hbWUtZXh0ZXJuYWwtbWVudScsXG4gIFJlcGxheUFuaW1hdGlvbiA9ICdyZXBsYXktYW5pbWF0aW9uJyxcbiAgUmVwb3J0RXh0ZW5zaW9uUmVuZGVyQ29tcGxldGUgPSAncmVwb3J0LWV4dGVuc2lvbi1yZW5kZXItY29tcGxldGUnLFxuICBSZXZlcnRTdG9yeVBvaW50ID0gJ3JldmVydC1zdG9yeS1wb2ludCcsXG4gIFJldmVydFdvcmtib29rID0gJ3JldmVydC13b3JrYm9vaycsXG5cbiAgU2F2ZUV4dGVuc2lvblNldHRpbmdzID0gJ3NhdmUtZXh0ZW5zaW9uLXNldHRpbmdzJyxcbiAgU2F2ZVdvcmtib29rQXNDdXN0b21WaWV3ID0gJ3NhdmUtd29ya2Jvb2stYXMtY3VzdG9tLXZpZXcnLFxuICBTZWxlY3RCeVZhbHVlID0gJ3NlbGVjdC1ieS12YWx1ZScsXG4gIFNldEFjdGl2ZUN1c3RvbVZpZXdBc0RlZmF1bHQgPSAnc2V0LWFjdGl2ZS1jdXN0b20tdmlldy1hcy1kZWZhdWx0JyxcbiAgU2V0QXV0b1VwZGF0ZSA9ICdzZXQtYXV0by11cGRhdGUnLFxuICBTZXRDbGlja1Rocm91Z2ggPSAnc2V0LWNsaWNrLXRocm91Z2gnLFxuICBTZW5kRGlhbG9nTWVzc2FnZSA9ICdzZW5kLWRpYWxvZy1tZXNzYWdlJyxcbiAgU2VuZE1lc3NhZ2VUb1BhcmVudCA9ICdzZW5kLW1lc3NhZ2UtdG8tcGFyZW50JyxcbiAgU2V0Vml6U3RhdGVXaXRoRGF0YU1vZGVsID0gJ3NldC12aXotc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgU2V0U2hlZXRTaXplID0gJ3NldC1zaGVldC1zaXplJyxcbiAgU2V0Wm9uZVZpc2liaWxpdHkgPSAnc2V0LXpvbmUtdmlzaWJpbGl0eScsXG4gIFNoYXJlID0gJ3NoYXJlJyxcbiAgU2hvd0N1c3RvbVZpZXcgPSAnc2hvdy1jdXN0b20tdmlldycsXG4gIFNwbGljZU1hcmtzQ2FyZEZpZWxkcyA9ICdzcGxpY2UtbWFya3MtY2FyZC1maWVsZHMnLFxuXG4gIFRlc3RDb252ZXJzaW9uVmVyYiA9ICd0ZXN0LWNvbnZlcnNpb24tdmVyYicsXG5cbiAgVW5kbyA9ICd1bmRvJyxcbiAgVXBkYXRlQ3VzdG9tVmlldyA9ICd1cGRhdGUtY3VzdG9tLXZpZXcnLFxuXG4gIFZpekFQSSA9ICd2aXotYXBpJyxcbn1cbiIsImV4cG9ydCBlbnVtIEFza0RhdGFPcHRpb25OYW1lcyB7XG4gIHRva2VuID0gJ3Rva2VuJyxcbiAgb3JpZ2luID0gJ29yaWdpbicsXG4gIHNob3dFbWJlZCA9ICdzaG93RW1iZWQnLFxuICBzaG93UGluID0gJ3Nob3dQaW4nLFxuICBzaG93U2F2ZSA9ICdzaG93U2F2ZScsXG4gIHNob3dTaGFyZSA9ICdzaG93U2hhcmUnLFxuICBkZWJ1ZyA9ICc6anNkZWJ1ZycsXG4gIEFwaUlEID0gJzphcGlJRCcsXG4gIEFwaUV4dGVybmFsVmVyc2lvbiA9ICc6YXBpRXh0ZXJuYWxWZXJzaW9uJyxcbiAgQXBpSW50ZXJuYWxWZXJzaW9uID0gJzphcGlJbnRlcm5hbFZlcnNpb24nLFxuICBBc2tEYXRhV2ViQ29tcG9uZW50ID0gJzphc2tEYXRhV2ViQ29tcG9uZW50Jyxcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhbGl6YXRpb25PcHRpb25zIHtcbiAgaXNBbHBoYT86IGJvb2xlYW47XG4gIHBsYXRmb3JtSXNPZmZpY2lhbFJlbGVhc2U/OiBib29sZWFuO1xuICBpc0V4dGVuc2lvbkRpYWxvZz86IGJvb2xlYW47XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJy4uL2NvbnRyYWN0L01vZGVscyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25JZCB9IGZyb20gJy4uL2NvbnRyYWN0L05vdGlmaWNhdGlvbnMnO1xuaW1wb3J0IHsgVmVyYklkIH0gZnJvbSAnLi4vY29udHJhY3QvVmVyYnMnO1xuaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4vVmVyc2lvbk51bWJlcic7XG5cbmV4cG9ydCB0eXBlIE5vdGlmaWNhdGlvbkhhbmRsZXIgPSAobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0ZVBhcmFtZXRlcnMge1xuICBba2V5OiBzdHJpbmddOiBNb2RlbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRlUmVzcG9uc2Uge1xuICByZXN1bHQ6IE1vZGVsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbiB7XG4gIG5vdGlmaWNhdGlvbklkOiBOb3RpZmljYXRpb25JZDtcbiAgZGF0YTogTW9kZWw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIHtcbiAgZXhlY3V0ZSh2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogUHJvbWlzZTxFeGVjdXRlUmVzcG9uc2U+O1xuICByZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQ7XG4gIHVucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkO1xufVxuXG4vLyBUaGlzIGZhY3RvcnkgZnVuY3Rpb24gd2lsbCBnZXQgY2FsbGVkIGZyb20gdGhlIGV4dGVybmFsIHNpZGUgb2YgdGhpbmdzIHRvIGluc3RhbnRpYXRlIGEgcHJvcGVybHlcbi8vIHZlcnNpb25lZCBBUEkgZGlzcGF0Y2hlciB3aGljaCB0aGlzIHBhcnRpY3VsYXIgdmVyc2lvbiBvZiBleHRlcm5hbCBrbm93cyBob3cgdG8gdXNlXG5leHBvcnQgdHlwZSBJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5ID0gKGludGVybmFsQ29udHJhY3RWZXJzaW9uOiBWZXJzaW9uTnVtYmVyKSA9PiBJbnRlcm5hbEFwaURpc3BhdGNoZXI7XG4iLCJleHBvcnQgZW51bSBQdWxzZU9wdGlvbk5hbWVzIHtcbiAgZW1iZWQgPSAnZW1iZWQnLFxuICB0b2tlbiA9ICd0b2tlbicsXG4gIGRpc2FibGVFeHBsb3JlRmlsdGVyID0gJ2Rpc2FibGVFeHBsb3JlRmlsdGVyJyxcbiAgbGF5b3V0ID0gJ2VtYmVkX2xheW91dCcsXG4gIHRoZW1lID0gJ2VtYmVkX3RoZW1lJyxcbiAgQXBpRXh0ZXJuYWxWZXJzaW9uID0gJzphcGlFeHRlcm5hbFZlcnNpb24nLFxuICBBcGlJbnRlcm5hbFZlcnNpb24gPSAnOmFwaUludGVybmFsVmVyc2lvbicsXG4gIEVtYmVkQ291bnQgPSAnOmVtYmNvdW50JyxcbiAgUHVsc2VXZWJDb21wb25lbnQgPSAnOnB1bHNlV2ViQ29tcG9uZW50Jyxcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvbk51bWJlciB7XG4gIG1ham9yOiBudW1iZXI7XG4gIG1pbm9yOiBudW1iZXI7XG4gIGZpeDogbnVtYmVyO1xufVxuIiwiLyoqXG4gKiBUaGVzZSBzdHJpbmdzIHdlcmUgKm1hbnVhbGx5IGNvcGllZCogZnJvbSB0aGUgc2VydmVyLFxuICogd29ya2dyb3VwL3NyYy9zaWxvcy90YWJsZWF1LXNlcnZlci9saWJyYXJpZXMvdGFiLWNvbnRyb2xsZXItdml6cWwvc3JjL2NvbS90YWJsZWF1c29mdHdhcmUvXG4gKiBjb250cm9sbGVyL3ZpenFsL2NvbnN0YW50cy9QYXJhbWV0ZXJLZXlzLmphdmEjTDlcbiAqIHNob3VsZCBiZSBleHBvcnRlZCBpbnN0ZWFkXG4gKiBwYXJhbWV0ZXJzIHRoYXQgdml6cWwgd2lsbCBhY2NlcHQgaW4gYW4gZW1iZWRkaW5nIFVSTFxuICoqL1xuZW51bSBWcWxQYXJhbWV0ZXJOYW1lcyB7XG4gIE9ORSA9ICcxJyxcbiAgQUxFUlRTID0gJzphbGVydHMnLFxuICBBTElBUyA9ICdhbGlhcycsXG4gIEFMTE9XX0RFRkVSUkVEX0JPT1RTVFJBUCA9ICc6YWxsb3dEZWZlcnJlZEJvb3RzdHJhcCcsXG4gIEFMTE9XX0FVVE9HRU5fV09SS1NIRUVUX1BIT05FX0xBWU9VVFMgPSAnYWxsb3dBdXRvZ2VuV29ya3NoZWV0UGhvbmVMYXlvdXRzJyxcbiAgQVBJX0lEID0gJzphcGlJRCcsXG4gIEFQUCA9ICc6YXBwJyxcbiAgQVRUQUNITUVOVCA9ICdhdHRhY2htZW50JyxcbiAgSVNfSVBBRF9BUFAgPSAnYXBwJyxcbiAgQU5JTUFURV9UUkFOU0lUSU9OID0gJzphbmltYXRlX3RyYW5zaXRpb24nLFxuICBBU0NFTkRJTkcgPSAnYXNjZW5kaW5nJyxcbiAgQVVUSEVOVElDQVRJT04gPSAnYXV0aGVudGljYXRpb24nLFxuICBBVFRSSUJVVEVTID0gJ2F0dHJpYnV0ZXMnLFxuICBBVVRIT1JJTkdfU0hFRVQgPSAnOmF1dGhTaGVldCcsXG4gIEFYSVMgPSAnYXhpcycsXG4gIEJPT1RTVFJBUF9XSEVOX05PVElGSUVEID0gJzpib290c3RyYXBXaGVuTm90aWZpZWQnLFxuICBCUk9XU0VSX0JBQ0tfQlVUVE9OX1VORE8gPSAnOmJyb3dzZXJCYWNrQnV0dG9uVW5kbycsXG4gIEJST1dTRVJfUkVOREVSSU5HX09OID0gJ2lzQnJvd3NlclJlbmRlcmluZycsXG4gIEJST1dTRVJfUkVOREVSSU5HX1RIUkVTSE9MRCA9ICdicm93c2VyUmVuZGVyaW5nVGhyZXNob2xkJyxcbiAgQ0hBUlNFVCA9ICdjaGFyc2V0JyxcbiAgQ0xJRU5UX0RJTUVOU0lPTiA9ICdjbGllbnREaW1lbnNpb24nLFxuICBDTElFTlRfSVAgPSAnY2xpZW50X2lwJyxcbiAgQ0xJRU5UX05VTSA9ICdjbGllbnROdW0nLFxuICBDT0xPTl9FTUJFRERFRCA9ICc6ZW1iZWRkZWQnLFxuICBDT0xPTl9NT0JJTEUgPSAnOm1vYmlsZScsXG4gIENPTE9OX0RFRVBfTElOS0lOR19ESVNBQkxFRCA9ICc6ZGVlcExpbmtpbmdEaXNhYmxlZCcsXG4gIENPTE9OX1dBVEVSTUFSSyA9ICc6d2F0ZXJtYXJrJyxcbiAgQ09NTUVOVFMgPSAnOmNvbW1lbnRzJyxcbiAgQ09NTUVOVElOR19FTkFCTEVEID0gJzpjb21tZW50aW5nRW5hYmxlZCcsXG4gIENPTU1FTlRJTkdfTUVOVElPTlNfRU5BQkxFRCA9ICc6Y29tbWVudGluZ01lbnRpb25zJyxcbiAgQ09OTkVDVElPTiA9ICdjb25uZWN0aW9uJyxcbiAgQ1JFQVRFRF9CWV9GRUFUVVJFID0gJ2NyZWF0ZWRCeUZlYXR1cmUnLFxuICBDUllQVEVEX1BBU1NXT1JEID0gJ2NyeXB0ZWQnLFxuICBDU1NERUJVRyA9ICc6Y3NzZGVidWcnLFxuICBDU1YgPSAnY3N2JyxcbiAgQ1VTVE9NX1ZJRVdTID0gJzpjdXN0b21WaWV3cycsXG4gIENWID0gJzpjdicsXG4gIENWX0lEID0gJ2N2SWQnLFxuICBEQVNIQk9BUkRfUE9SVF9TSVpFID0gJ2Rhc2hib2FyZFBvcnRTaXplJyxcbiAgREFUQV9ERVRBSUxTID0gJzpkYXRhRGV0YWlscycsXG4gIERBVEFTT1VSQ0UgPSAnZGF0YXNvdXJjZScsXG4gIERFQlVHID0gJzpkZWJ1ZycsXG4gIERFTEFZID0gJzpkZWxheScsXG4gIERFUFRIID0gJ2RlcHRoJyxcbiAgREVWSUNFX1RZUEUgPSAnOmRldmljZScsXG4gIERFVklDRV9QSVhFTF9SQVRJTyA9ICdkZXZpY2VQaXhlbFJhdGlvJyxcbiAgREVWSUNFX1BSRVZJRVdfTU9ERSA9ICc6ZGV2aWNlcHJldmlld21vZGUnLFxuICBESU1FTlNJT05TID0gJzpkaW1lbnNpb25zJyxcbiAgRElTQUJMRV9TSEFSRURfU0VTU0lPTlMgPSAnOmRpc2FibGVfc2hhcmVkX3Nlc3Npb25zJyxcbiAgRElTQUJMRV9VUkxfQUNUSU9OU19QT1BVUFMgPSAnOmRpc2FibGVVcmxBY3Rpb25zUG9wdXBzJyxcbiAgRElSRUNUSU9OID0gJ2RpcmVjdGlvbicsXG4gIERJU1BMQVlfT1ZFUkxBWSA9ICc6ZGlzcGxheV9vdmVybGF5JyxcbiAgRElTUExBWV9TSEFSRSA9ICc6ZGlzcGxheV9zaGFyZScsXG4gIERJU1BMQVlfU1BJTk5FUiA9ICc6ZGlzcGxheV9zcGlubmVyJyxcbiAgRElTUExBWV9TVEFUSUNfSU1BR0UgPSAnOmRpc3BsYXlfc3RhdGljX2ltYWdlJyxcbiAgRElTUExBWV9UQUJTID0gJ2Rpc3BsYXlfdGFicycsXG4gIERJU1BMQVlfVklFV19DT1VOVCA9ICc6ZGlzcGxheV9jb3VudCcsXG4gIElHTk9SRV9TVElDS1lfU0VTU0lPTiA9ICc6aWdub3JlX3N0aWNreV9zZXNzaW9uJyxcbiAgSU5DUkVNRU5UX1ZJRVdfQ09VTlQgPSAnOmluY3JlbWVudF92aWV3X2NvdW50JyxcbiAgRE9DTU9ERSA9ICdkb2Ntb2RlJyxcbiAgRE9NQUlOID0gJ2RvbWFpbicsXG4gIERPX1dPUksgPSAnZG9fd29yaycsXG4gIERYID0gJ2R4JyxcbiAgRFkgPSAnZHknLFxuICBFRElUX0RBVEFfQUxFUlQgPSAnOmVkaXREYXRhQWxlcnQnLFxuICBFTUJFRF9DT1VOVCA9ICc6ZW1iY291bnQnLCAvLyB0aGlzIHdhcyBub3QgZXhwb3J0ZWQgZnJvbSBQYXJhbWV0ZXJLZXlzLmphdmFcbiAgRU1CRUQgPSAnOmVtYmVkJyxcbiAgRU1CRURERUQgPSAnZW1iZWRkZWQnLFxuICBFTkNSWVBURUQgPSAnZW5jcnlwdGVkJyxcbiAgQVBJX0VYVEVSTkFMX1ZFUlNJT04gPSAnOmFwaUV4dGVybmFsVmVyc2lvbicsXG4gIEFQSV9JTlRFUk5BTF9WRVJTSU9OID0gJzphcGlJbnRlcm5hbFZlcnNpb24nLFxuICBFWENMVURFID0gJ2V4Y2x1ZGUnLFxuICBFWFBPUlRfRk9STUFUID0gJzpleHBvcnRfZm9ybWF0JyxcbiAgRklFTEROQU1FID0gJ2ZpZWxkbmFtZScsXG4gIEZJRUxEX05BTUUgPSAnZmllbGRfbmFtZScsXG4gIEZJRUxEX1NFUCA9ICdmaWVsZF9zZXAnLFxuICBGSUxFID0gJ2ZpbGUnLFxuICBGSUxURVJfVElMRV9TSVpFID0gJ2ZpbHRlclRpbGVTaXplJyxcbiAgRk4gPSAnZm4nLFxuICBGT0NVUyA9ICdmb2N1cycsXG4gIEZPUkNFX0NBQ0hFID0gJ2ZvcmNlX2NhY2hlJyxcbiAgRk9STUFUID0gJ2Zvcm1hdCcsXG4gIEZPUk1BVF9EQVRBX1ZBTFVFX0xPQ0FMTFkgPSAnZm9ybWF0RGF0YVZhbHVlTG9jYWxseScsXG4gIEZST01fV0cgPSAnOmZyb21fd2cnLFxuICBHUkFQSFFMX0RBVEFCQVNFX0lEID0gJzpncmFwaFFMRGF0YWJhc2VJZCcsXG4gIEdSQVBIUUxfVEFCTEVfSUQgPSAnOmdyYXBoUUxUYWJsZUlkJyxcbiAgR1VJRCA9ICc6Z3VpZCcsXG4gIEggPSAnaCcsXG4gIEhJRERFTiA9ICdoaWRkZW4nLFxuICBISURFX0NMT1NFX0JVVFRPTiA9ICc6aGlkZUNsb3NlQnV0dG9uJyxcbiAgSElERV9FRElUX0JVVFRPTiA9ICc6aGlkZUVkaXRCdXR0b24nLFxuICBISURFX0VESVRfSU5fREVTS1RPUF9CVVRUT04gPSAnOmhpZGVFZGl0SW5EZXNrdG9wQnV0dG9uJyxcbiAgSElHSF9EUEkgPSAnOmhpZ2hkcGknLFxuICBJTUFHRV9TSVpFX0xJTUlUID0gJ2ltYWdlU2l6ZUxpbWl0JyxcbiAgVFJBTlNQQVJFTlRfTElORV9NQVJLU19MSU1JVCA9ICd0cmFuc3BhcmVudExpbmVNYXJrTGltaXQnLFxuICBDTElFTlRfUkVOREVSX1BJWEVMX0xJTUlUID0gJ2NsaWVudFJlbmRlclBpeGVsTGltaXQnLFxuICBJTiA9ICdpbicsXG4gIElOU1RBTkNFX0lEID0gJzppaWQnLFxuICBJU19HVUVTVF9SRURJUkVDVF9GUk9NX1ZJWlBPUlRBTCA9ICc6aXNHdWVzdFJlZGlyZWN0RnJvbVZpenBvcnRhbCcsXG4gIElTX01BUktfQU5JTUFUSU9OX0VOQUJMRUQgPSAnaXNNYXJrQW5pbWF0aW9uRW5hYmxlZCcsXG4gIElTX1ZJWlBPUlRBTCA9ICc6aXNWaXpQb3J0YWwnLFxuICBJTlBVVF8gPSAnaW5wdXRfc3RyaW5nJyxcbiAgSlNERUJVRyA9ICc6anNkZWJ1ZycsXG4gIEpTT04gPSAnanNvbicsXG4gIEpTT05fT05MWSA9ICc6anNvbk9ubHknLFxuICBLRUVQRklMRSA9ICdrZWVwZmlsZScsXG4gIEtFWSA9ICdrZXknLFxuICBMQU5HVUFHRSA9ICdsYW5ndWFnZScsXG4gIExBTkdVQUdFX1JFUVVFU1RFRCA9ICc6bGFuZ3VhZ2UnLFxuICBMSU5LVEFSR0VUID0gJzpsaW5rdGFyZ2V0JyxcbiAgTE9BRF9PUkRFUl9JRCA9ICc6bG9hZE9yZGVySUQnLCAvLyB1c2VkIGZvciBQdWJsaWNcbiAgTE9BRF9ORVdFU1RfUkVWSVNJT04gPSAnOmxvYWROZXdlc3RSZXZpc2lvbicsXG4gIExPQ0FMX1BBVEhTID0gJzpsb2NhbFBhdGhzJyxcbiAgTE9DQUxFID0gJ2xvY2FsZScsXG4gIExPQ0FUSU9OX0lEID0gJ2xvY2F0aW9uaWQnLFxuICBMT0NBVElPTl9UWVBFID0gJ2xvY2F0aW9udHlwZScsXG4gIFdPUktCT09LX0xPQ0FMRSA9ICd3b3JrYm9va0xvY2FsZScsXG4gIE1BWFJPV1MgPSAnbWF4cm93cycsXG4gIE1BWF9BR0UgPSAnbWF4QWdlJyxcbiAgTUFYX1JPV1MgPSAnbWF4Um93cycsXG4gIE1FVEhPRCA9ICdtZXRob2QnLFxuICBNT0JJTEUgPSAnbW9iaWxlJyxcbiAgTU9ESUZJRVIgPSAnbW9kaWZpZXInLFxuICBOQU1FID0gJ25hbWUnLFxuICBOQVZfVFlQRSA9ICduYXZUeXBlJyxcbiAgTkFWX1NSQyA9ICduYXZTcmMnLFxuICBOT0FUVEFDSE1FTlQgPSAnbm8tYXR0YWNobWVudCcsXG4gIE5PX09WRVJXUklURSA9ICdub19vdmVyd3JpdGUnLFxuICBPUEVOX0FVVEhPUklOR19JTl9UT1BfV0lORE9XID0gJzpvcGVuQXV0aG9yaW5nSW5Ub3BXaW5kb3cnLFxuICBPUEVOSURfSEQgPSAnOm9wZW5pZF9oZCcsXG4gIE9QRU5JRF9MT0dJTl9ISU5UID0gJzpvcGVuaWRfbG9naW5faGludCcsXG4gIE9BVVRIUkVRVUVTVCA9ICdvYXV0aHJlcXVlc3QnLFxuICBPQVVUSF9DUkVERU5USUFMX0lEUyA9ICdvYXV0aF9jcmVkZW50aWFsX2lkcycsXG4gIE9GRkxJTkVfTU9ERSA9ICc6b2ZmbGluZW1vZGUnLFxuICBPUklHSU4gPSAnOm9yaWdpbicsXG4gIE9WRVJMQVkgPSAnOm92ZXJsYXknLFxuICBQID0gJ3AnLFxuICBQQVRIID0gJ3BhdGgnLFxuICBQQU5FX1JFU09MVkVSX1ggPSAncGFuZVJlc29sdmVyWCcsXG4gIFBBTkVfUkVTT0xWRVJfWSA9ICdwYW5lUmVzb2x2ZXJZJyxcbiAgUEFSQU0gPSAncGFyYW0nLFxuICBQQVJFTlRfSUQgPSAncGFyZW50X2lkJyxcbiAgUEFTU1dPUkQgPSAncGFzc3dvcmQnLFxuICBQQVRURVJOID0gJ3BhdHRlcm4nLFxuICBQSVhFTF9SQVRJTyA9ICc6cGl4ZWxyYXRpbycsXG4gIFBSRUZJWCA9ICc6cHJlZml4JyxcbiAgUFJFVklFVyA9ICc6cHJldmlldycsXG4gIFBSSU1BUllfQ09OVEVOVF9VUkwgPSAncHJpbWFyeV9jb250ZW50X3VybCcsXG4gIFBST0pFQ1QgPSAncHJvamVjdCcsXG4gIFBST1RPQ09MID0gJ3Byb3RvY29sJyxcbiAgUFNFVURPID0gJzpwc2V1ZG8nLFxuICBRVUVSWSA9ICdxdWVyeScsXG4gIFIgPSAncicsXG4gIFJBTkdFX1RZUEUgPSAncmFuZ2VfdHlwZScsXG4gIFJFQ09SRF9TRVAgPSAncmVjb3JkX3NlcCcsXG4gIFJFQ09SRF9DTElFTlRfUEVSRk9STUFOQ0UgPSAnOnJlY29yZF9jbGllbnRfcGVyZm9ybWFuY2UnLFxuICBSRUNPUkRfUEVSRk9STUFOQ0UgPSAnOnJlY29yZF9wZXJmb3JtYW5jZScsXG4gIFJFQ09WRVJfT0xEX1NFU1NJT05fSUQgPSAnOnJlY292ZXJfb2xkX3Nlc3Npb25faWQnLFxuICBSRUNPVkVSX1NFU1NJT05fU1RBVEVfVElDS0VUUyA9ICc6cmVjb3Zlcl9zZXNzaW9uX3N0YXRlX3RpY2tldHMnLFxuICBSRUZSRVNIID0gJzpyZWZyZXNoJyxcbiAgUkVGUkVTSFVOTU9ESUZJRUQgPSAnOnJlZnJlc2h1bm1vZGlmaWVkJyxcbiAgUkVHSU9OID0gJ3JlZ2lvbicsXG4gIFJFTE9BRF9PTl9DVVNUT01fVklFV19TQVZFID0gJzpyZWxvYWRPbkN1c3RvbVZpZXdTYXZlJyxcbiAgUkVOREVSID0gJzpyZW5kZXInLFxuICBSRU5ERVJfTUFQU19DTElFTlRfU0lERSA9ICdyZW5kZXJNYXBzQ2xpZW50U2lkZScsXG4gIFJFVFJZID0gJzpyZXRyeScsXG4gIFJFVVNFID0gJ3JldXNlJyxcbiAgUkVVU0VfRk9SRVZFUiA9ICdyZXVzZV9mb3JldmVyJyxcbiAgUkVWRVJUID0gJzpyZXZlcnQnLFxuICBTQVZFX0RCX1BBU1NXT1JEUyA9ICdzYXZlX2RiX3Bhc3N3b3JkcycsXG4gIFNFTEVDVF9YID0gJ3NlbGVjdF94JyxcbiAgU0VMRUNUX1kgPSAnc2VsZWN0X3knLFxuICBTRVNTSU9OX0ZFQVRVUkVfUFJFRklYID0gJzpmZl8nLFxuICBTRVNTSU9OX0ZMQUdTID0gJzpzZXNzaW9uX2ZlYXR1cmVfZmxhZ3MnLFxuICBTSEFSRV9CVVRUT04gPSAnc2hhcmVfYnV0dG9uJyxcbiAgU0hFRVRfSUQgPSAnc2hlZXRfaWQnLFxuICBTSEFSRUQgPSAnc2hhcmVkJyxcbiAgU0hPV0FMTCA9ICdzaG93YWxsJyxcbiAgU0hPV19BUFBfQkFOTkVSID0gJzpzaG93QXBwQmFubmVyJyxcbiAgU0hPV19BU0tfREFUQSA9ICc6c2hvd0Fza0RhdGEnLFxuICBTSE9XX1BBUkFNUyA9ICdzaG93UGFyYW1zJyxcbiAgU0hPV19TSEFSRV9PUFRJT05TID0gJzpzaG93U2hhcmVPcHRpb25zJyxcbiAgU0laRSA9ICc6c2l6ZScsXG4gIFNPVVJDRSA9ICdzb3VyY2UnLFxuICBTVEFURSA9ICdzdGF0ZScsXG4gIFNUSUNLWV9TRVNTSU9OX0tFWSA9ICdzdGlja3lTZXNzaW9uS2V5JyxcbiAgU1VCU0NSSVBUSU9OUyA9ICc6c3Vic2NyaXB0aW9ucycsXG4gIFNVTU1BUlkgPSAnc3VtbWFyeScsXG4gIFNVUFBSRVNTX0RFRkFVTFRfRURJVF9CRUhBVklPUiA9ICc6c3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yJyxcbiAgU1lOQ19TRVNTSU9OID0gJzpzeW5jX3Nlc3Npb24nLFxuICBTWU5DX1NFU1NJT05fU1RBVEUgPSAnc3luY19zZXNzaW9uX3N0YXRlJyxcbiAgVEFCUyA9ICc6dGFicycsXG4gIFRBUkdFVCA9ICd0YXJnZXQnLFxuICBUQVJHRVRfU0lURSA9ICd0YXJnZXRfc2l0ZScsXG4gIFRPT0xCQVIgPSAnOnRvb2xiYXInLFxuICBUT09MVElQID0gJzp0b29sdGlwJyxcbiAgVFMgPSAndHMnLFxuICBVTkRFUkxZSU5HX1RBQkxFX0lEID0gJ3VuZGVybHlpbmdfdGFibGVfaWQnLFxuICBVTkRFUkxZSU5HX1RBQkxFX0NBUFRJT04gPSAndW5kZXJseWluZ190YWJsZV9jYXB0aW9uJyxcbiAgVVBEQVRFX1RZUEUgPSAndXBkYXRlX3R5cGUnLFxuICBVU0VfR1VFU1QgPSAnOnVzZUd1ZXN0JyxcbiAgVVNFX0lOTElORV9JTUFHRVMgPSAndXNlX2lubGluZV9pbWFnZXMnLFxuICBVU0VSQUdFTlQgPSAndXNlcmFnZW50JyxcbiAgVVNFUk5BTUUgPSAndXNlcm5hbWUnLFxuICBWQUxVRSA9ICd2YWx1ZScsXG4gIFZFUkJPU0VfTU9ERSA9ICd2ZXJib3NlTW9kZScsXG4gIFZJRVdfSUQgPSAndmlld3NfaWQnLFxuICBWSVpfU05BUFNIT1RfSUQgPSAndml6X3NuYXBzaG90X2lkJyxcbiAgVlcgPSAnOnZ3JyxcbiAgVyA9ICd3JyxcbiAgV09SS1NIRUVUX1BPUlRfU0laRSA9ICd3b3Jrc2hlZXRQb3J0U2l6ZScsXG4gIFdBVEVSTUFSSyA9ICd3YXRlcm1hcmsnLFxuICBXQVRFUk1BUktfTUFSR0lOID0gJzp3YXRlcm1hcmtfbWFyZ2luJyxcbiAgV0IgPSAnOndiJyxcbiAgV0hJQ0ggPSAnd2hpY2gnLFxuICBYID0gJ3gnLFxuICBZID0gJ3knLFxuICBaSUQgPSAnemlkJyxcbiAgWk9ORV9JRCA9ICd6b25lX2lkJyxcbiAgS0VZQ0hBSU5fVkVSU0lPTiA9ICdrZXljaGFpbl92ZXJzaW9uJyxcbiAgREFUQVNPVVJDRV9JRCA9ICdkYXRhc291cmNlX2lkJyxcbiAgREFUQVNPVVJDRV9OQU1FID0gJ2RhdGFzb3VyY2VfbmFtZScsXG4gIExFTlNfSUQgPSAnbGVuc19pZCcsXG4gIFdJRFRIID0gJ3dpZHRoJyxcbiAgSEVJR0hUID0gJ2hlaWdodCcsXG5cbiAgLy8gRGVmYXVsdCBMYXlvdXQgcGFyYW1zXG4gIExBWU9VVF9WSUVXUyA9ICd2aWV3cycsXG4gIExBWU9VVF9NRU5VUyA9ICdtZW51cycsXG4gIExBWU9VVF9HRU9NRVRSWSA9ICdnZW9tZXRyeScsXG4gIExBWU9VVF9QQUdFUyA9ICdwYWdlcycsXG4gIExBWU9VVF9DQUNIRVVSTCA9ICdjYWNoZXVybCcsXG4gIExBWU9VVF9TSEVFVCA9ICdzaGVldCcsXG4gIExBWU9VVF9ERVBUSCA9ICdkZXB0aCcsXG59XG5cbi8qKlxuICogcGFyYW1ldGVycyB0aGF0IGFyZSBvbmx5IHJlbGV2YW50IHdoZW4gd29ya2luZyB3aXRoIFRhYmxlYXUgUHVibGljXG4gKiBtYXliZSBub3QgcmVhbGx5IG5lY2Vzc3J5IHRvIHNwbGl0IHRoZW0gb3V0XG4gKi9cbmVudW0gUHVibGljUGFyYW1ldGVyTmFtZXMge1xuICBTSE9XX1ZJWl9IT01FID0gJzpzaG93Vml6SG9tZScsXG4gIC8vIGRpc3BsYXkgdmlldyBjb3VudFxufVxuXG4vKipcbiAqIE1hcCB0aGUgcGFyYW1ldGVyIG5hbWVzIGFzIHVzZWQgaW4gdGhlIHVybCB0byB3aGF0IHdlIGNhbGwgdGhlbSBwdWJsaWNseSBpbiB0aGUgZW1iZWRkaW5nIGxpYnJhcnkuXG4gKiBUaGUgb25seSBwYXJhbWV0ZXJzIGxpc3RlZCBoZXJlIHNob3VsZCBiZSB0aGUgb25lcyB0aGF0IGdldCBzZW50IHRvIHZpenFsXG4gKiAgLSB0aGlzIHNob3VsZCBtYXRjaCB0aGUgaW50ZXJmYWNlIGF0IGV4dGVybmFsLWNvbnRyYWN0OlZpekludGVyZmFjZXM6Vml6U2V0dGluZ3NcbiAqL1xuZXhwb3J0IGVudW0gVml6T3B0aW9uTmFtZXMge1xuICAvLyBwdWJsaWNOYW1lID0gaW50ZXJuYWxTdHJpbmdWYWx1ZVxuICBTaXplID0gVnFsUGFyYW1ldGVyTmFtZXMuU0laRSxcbiAgRW1iZWQgPSBWcWxQYXJhbWV0ZXJOYW1lcy5FTUJFRCxcbiAgRW1iZWRDb3VudCA9IFZxbFBhcmFtZXRlck5hbWVzLkVNQkVEX0NPVU5ULFxuICBBcGlJbnRlcm5hbFZlcnNpb24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5BUElfSU5URVJOQUxfVkVSU0lPTixcbiAgQXBpRXh0ZXJuYWxWZXJzaW9uID0gVnFsUGFyYW1ldGVyTmFtZXMuQVBJX0VYVEVSTkFMX1ZFUlNJT04sXG4gIFNob3dWaXpIb21lID0gUHVibGljUGFyYW1ldGVyTmFtZXMuU0hPV19WSVpfSE9NRSxcbiAgSnNkZWJ1ZyA9IFZxbFBhcmFtZXRlck5hbWVzLkpTREVCVUcsXG4gIEJvb3RzdHJhcFdoZW5Ob3RpZmllZCA9IFZxbFBhcmFtZXRlck5hbWVzLkJPT1RTVFJBUF9XSEVOX05PVElGSUVELFxuICBOYXZUeXBlID0gVnFsUGFyYW1ldGVyTmFtZXMuTkFWX1RZUEUsXG4gIE5hdlNyYyA9IFZxbFBhcmFtZXRlck5hbWVzLk5BVl9TUkMsXG4gIGRlYnVnID0gVnFsUGFyYW1ldGVyTmFtZXMuSlNERUJVRyxcbiAgQXBpSUQgPSBWcWxQYXJhbWV0ZXJOYW1lcy5BUElfSUQsXG5cbiAgZGlzYWJsZVVybEFjdGlvbnNQb3B1cHMgPSBWcWxQYXJhbWV0ZXJOYW1lcy5ESVNBQkxFX1VSTF9BQ1RJT05TX1BPUFVQUyxcbiAgaGlkZVRhYnMgPSBWcWxQYXJhbWV0ZXJOYW1lcy5UQUJTLFxuICB0b29sYmFyID0gVnFsUGFyYW1ldGVyTmFtZXMuVE9PTEJBUixcbiAgZGV2aWNlID0gVnFsUGFyYW1ldGVyTmFtZXMuREVWSUNFX1RZUEUsXG4gIGluc3RhbmNlSWRUb0Nsb25lID0gVnFsUGFyYW1ldGVyTmFtZXMuSU5TVEFOQ0VfSUQsXG4gIHRvdWNoT3B0aW1pemUgPSBWcWxQYXJhbWV0ZXJOYW1lcy5NT0JJTEUsXG4gIGhpZGVFZGl0QnV0dG9uID0gVnFsUGFyYW1ldGVyTmFtZXMuSElERV9FRElUX0JVVFRPTixcbiAgaGlkZUVkaXRJbkRlc2t0b3BCdXR0b24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5ISURFX0VESVRfSU5fREVTS1RPUF9CVVRUT04sXG4gIHN1cHByZXNzRGVmYXVsdEVkaXRCZWhhdmlvciA9IFZxbFBhcmFtZXRlck5hbWVzLlNVUFBSRVNTX0RFRkFVTFRfRURJVF9CRUhBVklPUixcbiAgaGlkZUNsb3NlQnV0dG9uID0gVnFsUGFyYW1ldGVyTmFtZXMuSElERV9DTE9TRV9CVVRUT04sXG59XG4iLCJpbXBvcnQgKiBhcyBndWlkIGZyb20gJ2d1aWQnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIE1vZGVsLCBOb3RpZmljYXRpb25JZCwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZS9Jbml0aWFsaXphdGlvbk9wdGlvbnMnO1xuaW1wb3J0IHsgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZSB9IGZyb20gJy4vQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZSc7XG5pbXBvcnQge1xuICBpc0NvbW1hbmRNZXNzYWdlLFxuICBpc0NvbW1hbmRSZXNwb25zZU1lc3NhZ2UsXG4gIGlzSGFuZHNoYWtlTWVzc2FnZSxcbiAgaXNJbml0TWVzc2FnZSxcbiAgaXNNZXNzYWdlLFxuICBpc05vdGlmaWNhdGlvbk1lc3NhZ2UsXG59IGZyb20gJy4vTWVzc2FnZVR5cGVDaGVja3MnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZE1lc3NhZ2VIYW5kbGVyLFxuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcixcbiAgSGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIsXG4gIEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcixcbiAgTm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIsXG59IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VMaXN0ZW5lcic7XG5pbXBvcnQge1xuICBDb21tYW5kTWVzc2FnZSxcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgSGFuZHNoYWtlTWVzc2FnZSxcbiAgSW5pdGlhbGl6ZU1lc3NhZ2UsXG4gIE1lc3NhZ2UsXG4gIE1lc3NhZ2VUeXBlLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxufSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuaW1wb3J0IHsgTWVzc2VuZ2VyIH0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2VuZ2VyJztcbmltcG9ydCB7IFByZXBhcmVkTWVzc2FnZSB9IGZyb20gJy4vaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5cbi8qKlxuICogVGhlIENyb3NzRnJhbWVNZXNzZW5nZXIgaXMgdGhlIHByaW1hcnkgZXhwb3J0IGZyb20gdGhlIGFwaS1tZXNzYWdpbmcgbW9kdWxlLiBBbiBpbnN0YW5jZSBvZlxuICogdGhpcyBjbGFzcyBjYW4gYmUgaW5zdGFudGlhdGVkIG9uIGJvdGggc2lkZXMgb2YgYSBmcmFtZSBib3VuZGFyeSB0byBmYWNpbGl0YXRlIGNvbW11bmljYXRpb25cbiAqIGluIGJvdGggZGlyZWN0aW9ucyBiZXR3ZWVuIHRoZSBmcmFtZXMuIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBib3RoIHRoZSBkaXNwYXRjaGVyIGFuZCB0aGUgbGlzdGVuZXJcbiAqIHBvcnRpb25zLCBidXQgZG9lc24ndCByZXF1aXJlIGNhbGxlcnMgdG8gY2FyZSBhYm91dCBib3RoLlxuICovXG5leHBvcnQgY2xhc3MgQ3Jvc3NGcmFtZU1lc3NlbmdlciBpbXBsZW1lbnRzIE1lc3NlbmdlciB7XG4gIHByaXZhdGUgdW5yZWdpc3RlckZ1bmN0aW9uPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBpbml0aWFsaXplTWVzc2FnZUhhbmRsZXI/OiBJbml0aWFsaXplTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXI/OiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBjb21tYW5kTWVzc2FnZUhhbmRsZXI/OiBDb21tYW5kTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXI/OiBOb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBoYW5kc2hha2VNZXNzYWdlSGFuZGxlcj86IEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENyb3NzRnJhbWVNZXNzZW5nZXIuIElmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB0aGUgQ3Jvc3NGcmFtZU1lc3NlbmdlciBhcyBhIE1lc3NhZ2VMaXN0ZW5lcixcbiAgICogYmUgc3VyZSB0byBjYWxsIFN0YXJ0TGlzdGVuaW5nIGFuZCByZWdpc3RlciBtZXNzYWdlIGhhbmRsZXJzLlxuICAgKiBAcGFyYW0gdGhpc1dpbmRvdyBUaGUgd2luZG93IG9iamVjdCB3aGljaCB0aGUgQ3Jvc3NGcmFtZU1lc3NlbmdlciBsaXZlcy4gQW4gb25NZXNzYWdlIGxpc3RlbmVyIHdpbGwgYmUgYWRkZWQgaGVyZS5cbiAgICogQHBhcmFtIFtvdGhlcldpbmRvd10gT3B0aW9uYWwgb3RoZXJXaW5kb3cgd2hpY2ggbWVzc2FnZXMgd2lsbCBiZSBwb3N0ZWQgdG8uXG4gICAqICAgICAgICAgICAgICAgICAgICAgIElmIGRlZmluZWQsIGluY29taW5nIG1lc3NhZ2VzIG11c3Qgb3JpZ2luYXRlIGZyb20gb3RoZXJXaW5kb3cgdG8gYmUgcGFzc2VkIG9uXG4gICAqIEBwYXJhbSBbb3RoZXJXaW5kb3dPcmlnaW5dIFRoZSB0YXJnZXQgb3JpZ2luIHdoaWNoIG90aGVyV2luZG93IG11c3QgaGF2ZSBpbiBvcmRlciB0byByZWNlaXZlIGRpc3BhdGNoZWQgbWVzc2FnZXMuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgd2lsbCBiZSBzZW50IGFzIHRoZSB0YXJnZXRPcmlnaW4gb2YgYSBwb3N0TWVzc2FnZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9wb3N0TWVzc2FnZSlcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRoaXNXaW5kb3c6IFdpbmRvdyxcbiAgICBwcml2YXRlIG90aGVyV2luZG93PzogV2luZG93LFxuICAgIHByaXZhdGUgb3RoZXJXaW5kb3dPcmlnaW4/OiBzdHJpbmcsXG4gICkge1xuICAgIC8vIE1ha2Ugc3VyZSB0byBjYWxsIFN0YXJ0TGlzdGVuaW5nXG4gIH1cblxuICAvLy8vLyBNZXNzYWdlTGlzdGVuZXIgSW1wbGVtZW50YXRpb25cblxuICBwdWJsaWMgc3RhcnRMaXN0ZW5pbmcoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBhcmUgbGlzdGVuaW5nLCBpZiBub3QsIGhvb2sgdXAgYSBtZXNzYWdlIGxpc3RlbmVyXG4gICAgaWYgKCF0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbikge1xuICAgICAgY29uc3QgYm91bmRIYW5kbGVyID0gdGhpcy5vbk1lc3NhZ2VSZWNlaXZlZC5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy50aGlzV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBib3VuZEhhbmRsZXIsIHRydWUpO1xuICAgICAgdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24gPSAoKSA9PiB0aGlzLnRoaXNXaW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGJvdW5kSGFuZGxlciwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0b3BMaXN0ZW5pbmcoKTogdm9pZCB7XG4gICAgLy8gU3RvcCBsaXN0ZW5pbmcgaWYgd2UgaGF2ZSBzdGFydGVkIGxpc3RlbmluZ1xuICAgIGlmICh0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbikge1xuICAgICAgdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24oKTtcbiAgICAgIHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRJbml0aWFsaXplTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb21tYW5kTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IENvbW1hbmRNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZE1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXROb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogTm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRIYW5kc2hha2VNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogSGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIC8vLy8vIE1lc3NhZ2VEaXNwYXRjaGVyIEltcGxlbWVudGF0aW9uXG5cbiAgLyoqXG4gICAqIEBwYXJhbSBhcGlWZXJzaW9uIGFwaS1pbnRlcm5hbC1jb250cmFjdC1qcyB2ZXJzaW9uIChleHBvcnRlZCBpbiBKc0FwaUludGVybmFsQ29ubnRyYWN0KVxuICAgKiBAcGFyYW0gY3Jvc3NGcmFtZVZlcnNpb24gY3Jvc3NmcmFtZSBtZXNzYWdpbmcgdmVyc2lvbiAoZXhwb3J0ZWQgaW4gSnNBcGlJbnRlcm5hbENvbm50cmFjdClcbiAgICogQHBhcmFtIG9wdGlvbnMgYWRkaXRpb25hbCBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCBhdCBpbml0aWFsaXphdGlvbiAoaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlcnNpb24gb2ZcbiAgICogICAgICAgICAgICAgICAgZXh0ZXJuYWwgYmVpbmcgdXNlZCBmb3IgZXhhbXBsZSlcbiAgICovXG4gIHB1YmxpYyBwcmVwYXJlSW5pdGlhbGl6YXRpb25NZXNzYWdlKFxuICAgIGFwaVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgY3Jvc3NGcmFtZVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgb3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucyxcbiAgKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBJbml0aWFsaXplTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Jbml0aWFsaXplLFxuICAgICAgY3Jvc3NGcmFtZVZlcnNpb246IGNyb3NzRnJhbWVWZXJzaW9uLFxuICAgICAgYXBpVmVyc2lvbjogYXBpVmVyc2lvbixcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVDb21tYW5kTWVzc2FnZSh2ZXJiSWQ6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IENvbW1hbmRNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkNvbW1hbmQsXG4gICAgICB2ZXJiSWQ6IHZlcmJJZCxcbiAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVDb21tYW5kUmVzcG9uc2VNZXNzYWdlKGNvbW1hbmRHdWlkOiBzdHJpbmcsIGRhdGE6IE1vZGVsIHwgdW5kZWZpbmVkLCBlcnJvcjogTW9kZWwgfCB1bmRlZmluZWQpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuQ29tbWFuZFJlc3BvbnNlLFxuICAgICAgY29tbWFuZEd1aWQ6IGNvbW1hbmRHdWlkLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9O1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAvLyBzdHJpbmdpZnkgZXJyb3Igb2JqZWN0IHRvIHJlbW92ZSB1bnNlcmlhbGl6YWJsZSBmaWVsZHMgbGlrZSBmdW5jdGlvbnMgYW5kIHByZXZlbnQgc2VyaWFsaXphdGlvbiBlcnJvcnNcbiAgICAgIG1lc3NhZ2UuZXJyb3IgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZU5vdGlmaWNhdGlvbk1lc3NhZ2Uobm90aWZpY2F0aW9uSWQ6IE5vdGlmaWNhdGlvbklkLCBkYXRhOiBNb2RlbCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogTm90aWZpY2F0aW9uTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24sXG4gICAgICBub3RpZmljYXRpb25JZDogbm90aWZpY2F0aW9uSWQsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlQWNrTWVzc2FnZSgpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IEhhbmRzaGFrZU1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuQWNrLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uOiBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBhIHBlbmRpbmcgbWVzc2FnZSBmb3Igc2VuZGluZyBhbmQgcmV0dXJucyB0aGUgcHJlcGFyZWQgbWVzc2FnZVxuICAgKlxuICAgKiBAcGFyYW0gbXNnIFRoZSBtZXNzYWdlIHRvIGJlIHNlbnQgdG8gdGhpcy5vdGhlcldpbmRvd1xuICAgKiBAcmV0dXJucyBUaGUgcHJlcGFyZWQgbWVzc2FnZVxuICAgKi9cbiAgcHJpdmF0ZSBwcmVwYXJlTWVzc2FnZShtc2c6IE1lc3NhZ2UpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGlmICghdGhpcy5vdGhlcldpbmRvdyB8fCAhdGhpcy5vdGhlcldpbmRvd09yaWdpbikge1xuICAgICAgdGhyb3cgJ090aGVyIHdpbmRvdyBub3QgaW5pdGlhbGl6ZWQsIGNhbm5vdCBkaXNwYXRjaCBtZXNzYWdlcyc7XG4gICAgfVxuXG4gICAgY29uc3QgcHJlcGFyZWRNZXNzYWdlID0gbmV3IENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UobXNnLCB0aGlzLm90aGVyV2luZG93LCB0aGlzLm90aGVyV2luZG93T3JpZ2luKTtcbiAgICByZXR1cm4gcHJlcGFyZWRNZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZC4gRG9lcyBzb21lIHZhbGlkYXRpb24gb2YgdGhlIG1lc3NhZ2UsIGFuZCB0aGVuXG4gICAqIGNhbGxzIGFuIGFwcHJvcHJpYXRlIG1lc3NhZ2UgaGFuZGxlciBpZiBvbmUgaXMgZGVmaW5lZFxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGluY29taW5nIE1lc3NhZ2VFdmVudFxuICAgKi9cbiAgcHJpdmF0ZSBvbk1lc3NhZ2VSZWNlaXZlZChldmVudDogTWVzc2FnZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhbiBvdGhlcldpbmRvdyBkZWZpbmVkLCBtYWtlIHN1cmUgdGhlIG1lc3NhZ2UgaXMgY29taW5nIGZyb20gdGhlcmVcbiAgICBpZiAodGhpcy5vdGhlcldpbmRvdyAmJiBldmVudC5zb3VyY2UgIT09IHRoaXMub3RoZXJXaW5kb3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEbyBzb21lIHZhbGlkYXRpb24gb24gZXZlbnQuZGF0YSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIHJlY2VpdmVkIGEgcmVhbCBtZXNzYWdlXG4gICAgaWYgKCFldmVudC5kYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGE7XG4gICAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayB0aGUgZGVjbGFyZWQgbWVzc2FnZSB0eXBlLCB2YWxpZGF0ZSB0aGUgbWVzc2FnZSwgYW5kIGNhbGwgYW4gYXBwcm9wcmlhdGUgaGFuZGVyIGlmIG9uZSBleGlzdHNcbiAgICBzd2l0Y2ggKG1lc3NhZ2UubXNnVHlwZSkge1xuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Jbml0aWFsaXplOiB7XG4gICAgICAgIGlmICghaXNJbml0TWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5pbml0aWFsaXplTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRpYWxpemVNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuQ29tbWFuZFJlc3BvbnNlOiB7XG4gICAgICAgIGlmICghaXNDb21tYW5kUmVzcG9uc2VNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuQ29tbWFuZDoge1xuICAgICAgICBpZiAoIWlzQ29tbWFuZE1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuY29tbWFuZE1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21tYW5kTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbjoge1xuICAgICAgICBpZiAoIWlzTm90aWZpY2F0aW9uTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkhhbmRzaGFrZToge1xuICAgICAgICBpZiAoIWlzSGFuZHNoYWtlTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5oYW5kc2hha2VNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgLy8gSnVzdCBpZ25vcmUgdGhpcyBzaW5jZSB3ZSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdGhlIG1lc3NhZ2UgdHlwZVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRPdGhlcldpbmRvdyhvdGhlcldpbmRvdzogV2luZG93KTogdm9pZCB7XG4gICAgdGhpcy5vdGhlcldpbmRvdyA9IG90aGVyV2luZG93O1xuICB9XG5cbiAgcHVibGljIHNldE90aGVyV2luZG93T3JpZ2luKG9yaWdpbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vdGhlcldpbmRvd09yaWdpbiA9IG9yaWdpbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VUeXBlcyc7XG5pbXBvcnQgeyBQcmVwYXJlZE1lc3NhZ2UgfSBmcm9tICcuL2ludGVyZmFjZS9QcmVwYXJlZE1lc3NhZ2UnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBQcmVwYXJlZE1lc3NhZ2UgaW50ZXJmYWNlIHVzZWQgdG8gcG9zdCBtZXNzYWdlcyBiZXR3ZWVuXG4gKiB0d28gZnJhbWVzIHVzaW5nIHdpbmRvdy5wb3N0TWVzc2FnZVxuICovXG5leHBvcnQgY2xhc3MgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZSBpbXBsZW1lbnRzIFByZXBhcmVkTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UuXG4gICAqIEBwYXJhbSBfbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBiZSBzZW50XG4gICAqIEBwYXJhbSBfdGFyZ2V0IFRoZSB0YXJnZXQgd2luZG93IHdoZXJlIHRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudFxuICAgKiBAcGFyYW0gX29yaWdpbiBUaGUgdGFyZ2V0T3JpZ2luIHdoZXJlIHRoaXMgbWVzc2FnZSBjYW4gYmUgcmVjZWl2ZWRcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9tZXNzYWdlOiBNZXNzYWdlLFxuICAgIHByaXZhdGUgX3RhcmdldDogV2luZG93LFxuICAgIHByaXZhdGUgX29yaWdpbjogc3RyaW5nLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBtZXNzYWdlR3VpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlLm1zZ0d1aWQ7XG4gIH1cblxuICBwdWJsaWMgc2VuZCgpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIHRoaXMuX3RhcmdldC5wb3N0TWVzc2FnZSh0aGlzLl9tZXNzYWdlLCB0aGlzLl9vcmlnaW4pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBndWlkIGZyb20gJ2d1aWQnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uSWQgfSBmcm9tICcuLi9jb250cmFjdC9Ob3RpZmljYXRpb25zJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9pbnRlcmZhY2UvVmVyc2lvbk51bWJlcic7XG5pbXBvcnQge1xuICBDb21tYW5kTWVzc2FnZSxcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgSGFuZHNoYWtlTWVzc2FnZSxcbiAgSW5pdGlhbGl6ZU1lc3NhZ2UsXG4gIE1lc3NhZ2UsXG4gIE1lc3NhZ2VUeXBlLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxufSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuXG5jb25zdCBleHBlY3RlZEVtcHR5Tm90aWZpY2F0aW9ucyA9IG5ldyBTZXQoW1xuICBOb3RpZmljYXRpb25JZC5FZGl0QnV0dG9uQ2xpY2tlZCxcbiAgTm90aWZpY2F0aW9uSWQuRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQsXG4gIE5vdGlmaWNhdGlvbklkLldvcmtib29rUHVibGlzaGVkLFxuICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va1JlYWR5VG9DbG9zZSxcbiAgTm90aWZpY2F0aW9uSWQuUmVhZHlUb1JlY2VpdmVBdXRoVG9rZW4sXG5dKTtcblxuLyogdHNsaW50OmRpc2FibGUgbm8tYW55ICovXG5leHBvcnQgZnVuY3Rpb24gaXNNZXNzYWdlKGRhdGE6IE1lc3NhZ2UgfCBhbnkpOiBkYXRhIGlzIE1lc3NhZ2Uge1xuICBpZiAoIWRhdGEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gZGF0YSBhcyBNZXNzYWdlO1xuICBpZiAoIW1lc3NhZ2UgfHwgIW1lc3NhZ2UubXNnR3VpZCB8fCAhbWVzc2FnZS5tc2dUeXBlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFndWlkLmlzR3VpZChtZXNzYWdlLm1zZ0d1aWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBtZXNzYWdlLm1zZ1R5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZVR5cGVzOiBBcnJheTxzdHJpbmc+ID0gW1xuICAgIE1lc3NhZ2VUeXBlLkNvbW1hbmQsXG4gICAgTWVzc2FnZVR5cGUuQ29tbWFuZFJlc3BvbnNlLFxuICAgIE1lc3NhZ2VUeXBlLkluaXRpYWxpemUsXG4gICAgTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uLFxuICAgIE1lc3NhZ2VUeXBlLkhhbmRzaGFrZSxcbiAgXTtcblxuICBpZiAobWVzc2FnZVR5cGVzLmluZGV4T2YobWVzc2FnZS5tc2dUeXBlKSA8IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmVyc2lvbih2ZXJzaW9uTnVtYmVyOiBWZXJzaW9uTnVtYmVyIHwgYW55KTogdmVyc2lvbk51bWJlciBpcyBWZXJzaW9uTnVtYmVyIHtcbiAgaWYgKCF2ZXJzaW9uTnVtYmVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgdiA9IHZlcnNpb25OdW1iZXIgYXMgVmVyc2lvbk51bWJlcjtcblxuICBpZiAodHlwZW9mIHYgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2LmZpeCAhPT0gJ251bWJlcicgfHwgdHlwZW9mIHYubWlub3IgIT09ICdudW1iZXInIHx8IHR5cGVvZiB2Lm1ham9yICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbml0TWVzc2FnZShtZXNzYWdlOiBJbml0aWFsaXplTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgSW5pdGlhbGl6ZU1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGluaXRNZXNzYWdlID0gbWVzc2FnZSBhcyBJbml0aWFsaXplTWVzc2FnZTtcbiAgaWYgKGluaXRNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkluaXRpYWxpemUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWluaXRNZXNzYWdlLmFwaVZlcnNpb24gfHwgIWlzVmVyc2lvbihpbml0TWVzc2FnZS5hcGlWZXJzaW9uKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaW5pdE1lc3NhZ2UuY3Jvc3NGcmFtZVZlcnNpb24gfHwgIWlzVmVyc2lvbihpbml0TWVzc2FnZS5jcm9zc0ZyYW1lVmVyc2lvbikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tbWFuZFJlc3BvbnNlTWVzc2FnZShtZXNzYWdlOiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBDb21tYW5kUmVzcG9uc2VNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjck1lc3NhZ2UgPSBtZXNzYWdlIGFzIENvbW1hbmRSZXNwb25zZU1lc3NhZ2U7XG4gIGlmIChjck1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuQ29tbWFuZFJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFndWlkLmlzR3VpZChjck1lc3NhZ2UuY29tbWFuZEd1aWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFjck1lc3NhZ2UuZGF0YSAmJiAhY3JNZXNzYWdlLmVycm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbW1hbmRNZXNzYWdlKG1lc3NhZ2U6IENvbW1hbmRNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBDb21tYW5kTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY29tbWFuZE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENvbW1hbmRNZXNzYWdlO1xuICBpZiAoY29tbWFuZE1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuQ29tbWFuZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghY29tbWFuZE1lc3NhZ2UucGFyYW1ldGVycyB8fCB0eXBlb2YgY29tbWFuZE1lc3NhZ2UucGFyYW1ldGVycyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWNvbW1hbmRNZXNzYWdlLnZlcmJJZCB8fCB0eXBlb2YgY29tbWFuZE1lc3NhZ2UudmVyYklkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOb3RpZmljYXRpb25NZXNzYWdlKG1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIE5vdGlmaWNhdGlvbk1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2UgPSBtZXNzYWdlIGFzIE5vdGlmaWNhdGlvbk1lc3NhZ2U7XG4gIGlmIChub3RpZmljYXRpb25NZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghbm90aWZpY2F0aW9uTWVzc2FnZS5kYXRhICYmICFleHBlY3RlZEVtcHR5Tm90aWZpY2F0aW9ucy5oYXMobm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIW5vdGlmaWNhdGlvbk1lc3NhZ2Uubm90aWZpY2F0aW9uSWQgfHwgdHlwZW9mIG5vdGlmaWNhdGlvbk1lc3NhZ2Uubm90aWZpY2F0aW9uSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hhbmRzaGFrZU1lc3NhZ2UobWVzc2FnZTogSGFuZHNoYWtlTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgSGFuZHNoYWtlTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaGFuZHNoYWtlTWVzc2FnZSA9IG1lc3NhZ2UgYXMgSGFuZHNoYWtlTWVzc2FnZTtcbiAgaWYgKGhhbmRzaGFrZU1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuSGFuZHNoYWtlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgTW9kZWwsIE5vdGlmaWNhdGlvbklkLCBWZXJiSWQsIFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi8uLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25PcHRpb25zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucyc7XG5pbXBvcnQgeyBQcmVwYXJlZE1lc3NhZ2UgfSBmcm9tICcuL1ByZXBhcmVkTWVzc2FnZSc7XG5cbi8qKlxuICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhbiBvYmplY3Qgd2hpY2ggY2FuIHByZXBhcmUgZGlmZmVyZW50IG1lc3NhZ2VzIHRvIHNlbmQgdG8gYSB0YXJnZXQuXG4gKlxuICogQGludGVyZmFjZSBNZXNzYWdlRGlzcGF0Y2hlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VEaXNwYXRjaGVyIHtcbiAgcHJlcGFyZUluaXRpYWxpemF0aW9uTWVzc2FnZShcbiAgICBhcGlWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIGNyb3NzRnJhbWVWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIG9wdGlvbnM/OiBJbml0aWFsaXphdGlvbk9wdGlvbnMsXG4gICk6IFByZXBhcmVkTWVzc2FnZTtcbiAgcHJlcGFyZUNvbW1hbmRNZXNzYWdlKHZlcmJJZDogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByZXBhcmVkTWVzc2FnZTtcbiAgcHJlcGFyZUNvbW1hbmRSZXNwb25zZU1lc3NhZ2UoY29tbWFuZEd1aWQ6IHN0cmluZywgZGF0YTogTW9kZWwgfCB1bmRlZmluZWQsIGVycm9yOiBNb2RlbCB8IHVuZGVmaW5lZCk6IFByZXBhcmVkTWVzc2FnZTtcbiAgcHJlcGFyZU5vdGlmaWNhdGlvbk1lc3NhZ2Uobm90aWZpY2F0aW9uSWQ6IE5vdGlmaWNhdGlvbklkLCBkYXRhOiBNb2RlbCk6IFByZXBhcmVkTWVzc2FnZTtcbn1cbiIsImltcG9ydCB7IENvbW1hbmRNZXNzYWdlLCBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLCBIYW5kc2hha2VNZXNzYWdlLCBJbml0aWFsaXplTWVzc2FnZSwgTm90aWZpY2F0aW9uTWVzc2FnZSB9IGZyb20gJy4vTWVzc2FnZVR5cGVzJztcbmltcG9ydCB7IFByZXBhcmVkTWVzc2FnZSB9IGZyb20gJy4vUHJlcGFyZWRNZXNzYWdlJztcblxuLyoqXG4gKiBNZXNzYWdlIGhhbmRsZXIgdHlwZXNcbiAqL1xuZXhwb3J0IHR5cGUgSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyID0gKG1zZzogSW5pdGlhbGl6ZU1lc3NhZ2UsIHNvdXJjZTogTWVzc2FnZUV2ZW50U291cmNlIHwgbnVsbCkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyID0gKG1zZzogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSwgc291cmNlOiBNZXNzYWdlRXZlbnRTb3VyY2UgfCBudWxsKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgQ29tbWFuZE1lc3NhZ2VIYW5kbGVyID0gKG1zZzogQ29tbWFuZE1lc3NhZ2UsIHNvdXJjZTogTWVzc2FnZUV2ZW50U291cmNlIHwgbnVsbCkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyID0gKG1zZzogTm90aWZpY2F0aW9uTWVzc2FnZSwgc291cmNlOiBNZXNzYWdlRXZlbnRTb3VyY2UgfCBudWxsKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgSGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIgPSAobXNnOiBIYW5kc2hha2VNZXNzYWdlLCBzb3VyY2U6IE1lc3NhZ2VFdmVudFNvdXJjZSB8IG51bGwpID0+IHZvaWQ7XG5cbi8qKlxuICogSW50ZXJmYWNlIHRvIHdoaWNoIGRlZmluZXMgYSBtZXNzYWdlIGxpc3RlbmVyLiBUaGUgU2V0Kk1lc3NhZ2VIYW5kbGVyIGZ1bmN0aW9ucyBzaG91bGQgYmVcbiAqIGNhbGxlZCB0byBoYW5kbGUgc3BlY2lmaWMgbWVzc2FnZSB0eXBlcy4gTm90aGluZyB3aWxsIGhhcHBlbiB1bnRpbCBTdGFydExpc3RlbmluZyBpcyBjYWxsZWRcbiAqXG4gKiBAaW50ZXJmYWNlIE1lc3NhZ2VMaXN0ZW5lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VMaXN0ZW5lciB7XG4gIHN0YXJ0TGlzdGVuaW5nKCk6IHZvaWQ7XG4gIHN0b3BMaXN0ZW5pbmcoKTogdm9pZDtcblxuICBzZXRJbml0aWFsaXplTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcik6IHZvaWQ7XG4gIHNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcik6IHZvaWQ7XG4gIHNldENvbW1hbmRNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogQ29tbWFuZE1lc3NhZ2VIYW5kbGVyKTogdm9pZDtcbiAgc2V0Tm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKTogdm9pZDtcbiAgc2V0SGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKTogdm9pZDtcblxuICBzZXRPdGhlcldpbmRvdyhvdGhlcldpbmRvdzogV2luZG93KTogdm9pZDtcbiAgc2V0T3RoZXJXaW5kb3dPcmlnaW4ob3JpZ2luOiBzdHJpbmcpOiB2b2lkO1xuXG4gIHByZXBhcmVBY2tNZXNzYWdlKCk6IFByZXBhcmVkTWVzc2FnZTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBNb2RlbCwgTm90aWZpY2F0aW9uSWQsIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcblxuLyoqXG4gKiBFbnVtIGRlZmluaW5nIHRoZSA0IGRpZmZlcmVudCB0eXBlcyBvZiBtZXNzYWdlcyB3ZSBoYXZlIGRlZmluZWRcbiAqL1xuZXhwb3J0IGVudW0gTWVzc2FnZVR5cGUge1xuICBJbml0aWFsaXplID0gJ2luaXRpYWxpemUnLFxuICBOb3RpZmljYXRpb24gPSAnbm90aWZpY2F0aW9uJyxcbiAgQ29tbWFuZCA9ICdjb21tYW5kJyxcbiAgQ29tbWFuZFJlc3BvbnNlID0gJ2NvbW1hbmQtcmVzcG9uc2UnLFxuICBIYW5kc2hha2UgPSAndi1oYW5kc2hha2UnLFxuICBBY2sgPSAndi1hY2snLFxufVxuXG4vKipcbiAqIFRoZSBNZXNzYWdlIGludGVyZmFjZSBpcyB0aGUgYmFzZSBpbnRlcmZhY2UgZm9yIGFsbCB0aGUgb3RoZXJcbiAqIG1lc3NhZ2UgdHlwZSBpbnRlcmZhY2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZVxuICAgKi9cbiAgbXNnR3VpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGlzIG1lc3NhZ2VcbiAgICovXG4gIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlO1xufVxuXG4vKipcbiAqIFRoZSBpbml0aWFsaXplIG1lc3NhZ2UgaXMgdGhlIGZpcnN0IG1lc3NhZ2Ugd2hpY2ggd2lsbCBiZSBzZW50XG4gKiBmcm9tIHRoZSBqYXZhc2NyaXB0IHRvIHNldCB1cCBjb21tdW5pY2F0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluaXRpYWxpemVNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgYXBpIHdoaWNoIHRoZSBzZW5kZXIgd2FudHMgdG8gdXNlXG4gICAqL1xuICBhcGlWZXJzaW9uOiBWZXJzaW9uTnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGlzIG1lc3NhZ2luZyBjb250cmFjdCB0byBiZSB1c2VkLiBGb3Igbm93LCB0aGVyZVxuICAgKiBzaG91bGQgb25seSBiZSBhIHNpbmdsZSB2ZXJzaW9uIGJ1dCBzZW5kaW5nIHRoaXMgYWxvbmcgc2hvdWxkIGhlbHBcbiAgICogaWYgd2UgbmVlZCB0byBhZGQgYSBuZXcgdmVyc2lvbiBpbiBhIGZ1dHVyZSByZWxlYXNlXG4gICAqL1xuICBjcm9zc0ZyYW1lVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCBhdCB0aGUgdGltZSBvZiBpbml0aWFsaXphdGlvblxuICAgKi9cbiAgb3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucztcbn1cblxuLyoqXG4gKiBUaGlzIG1lc3NhZ2UgaXMgc2VudCB3aGVuIGEgbm90aWZpY2F0aW9uIG9jY3VycyBmcm9tIHRoZSBwcmVzbGF5ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb3RpZmljYXRpb25NZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgaWQgZm9yIHRoaXMgdHlwZSBvZiBub3RpZmljYXRpb25cbiAgICovXG4gIG5vdGlmaWNhdGlvbklkOiBOb3RpZmljYXRpb25JZDtcblxuICAvKipcbiAgICogVGhlIGRhdGEgd2hpY2ggY2FtZSBhbG9uZyB3aXRoIHRoZSBub3RpZmljYXRpb25cbiAgICovXG4gIGRhdGE6IE1vZGVsO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgY2FsbGluZyBhbiBpbnRlcm5hbCBjb250cmFjdCBjb21tYW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgY29tbWFuZCB3aGljaCBzaG91bGQgYmUgZXhlY3V0ZWRcbiAgICovXG4gIHZlcmJJZDogVmVyYklkO1xuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbW1hbmRcbiAgICovXG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzO1xufVxuXG4vKipcbiAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IGluIHJlc3BvbnNlIHRvIGEgQ29tbWFuZE1lc3NhZ2Ugd2l0aCB0aGVcbiAqIHJlc3VsdCBvZiB0aGF0IGNvbW1hbmRzIGludm9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kUmVzcG9uc2VNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBHdWlkIG9mIHRoZSBDb21tYW5kTWVzc2FnZSB3aGljaCB0aGlzIGlzIGluIHJlc3BvbnNlIHRvXG4gICAqL1xuICBjb21tYW5kR3VpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmV0dXJuZWQgZnJvbSB0aGUgY29tbWFuZCwgdGhpcyB3aWxsIGJlIGRlZmluZWRcbiAgICogYW5kIGNvbnRhaW4gdGhlIGVycm9yXG4gICAqL1xuICBlcnJvcj86IE1vZGVsO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgY29tbWFuZCBleGVjdXRlZCBzdWNjZXNzZnVsbHksIHRoaXMgd2lsbCBjb250YWluIHRoZSBjb21tYW5kIHJlc3VsdFxuICAgKi9cbiAgZGF0YT86IE1vZGVsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRzaGFrZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEludGVybmFsIEFQSSBjb250cmFjdCB2ZXJzaW9uXG4gICAqL1xuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXI7XG59XG4iLCJpbXBvcnQgeyBNZXNzYWdlRGlzcGF0Y2hlciB9IGZyb20gJy4vTWVzc2FnZURpc3BhdGNoZXInO1xuaW1wb3J0IHsgTWVzc2FnZUxpc3RlbmVyIH0gZnJvbSAnLi9NZXNzYWdlTGlzdGVuZXInO1xuXG4vKipcbiAqIFNpbXBsZSB3cmFwcGVyIGludGVyZmFjZSB0byBlbmNvbXBhc3MgYm90aCB0aGUgTWVzc2FnZURpc3BhdGNoZXIgYW5kIE1lc3NhZ2VMaXN0ZW5lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NlbmdlciBleHRlbmRzIE1lc3NhZ2VEaXNwYXRjaGVyLCBNZXNzYWdlTGlzdGVuZXIge31cbiIsIi8qKlxuICogUmVwcmVzZW50cyBhIG1lc3NhZ2Ugd2hpY2ggaGFzIGJlZW4gcHJlcGFyZWQgYW5kIGlzIHJlYWR5IHRvIHNlbmQuIFRoaXMgaW50ZXJmYWNlXG4gKiBpcyB1c2VmdWwgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHNvbWUgaW5mbyBmcm9tIHRoZSBtZXNzYWdlIGJlZm9yZSBzZW5kaW5nIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByZXBhcmVkTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgZ3VpZCBvZiB0aGUgbWVzc2FnZSB3aGljaCB3aWxsIGJlIHNlbnRcbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2VHdWlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNlbmRzIHRoZSBhY3R1YWwgbWVzc2FnZSB0byB0aGUgcmVjZWl2ZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoaXMgbWVzc2FnZSBvYmplY3RcbiAgICovXG4gIHNlbmQoKTogUHJlcGFyZWRNZXNzYWdlO1xufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4ZWN1dGVSZXNwb25zZSwgTm90aWZpY2F0aW9uLCBWZXJiSWQgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKlxuICogVGhpcyB2ZXJzaW9uIGNvbnZlcnRlciBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nIGJ1dCBpcyB1c2VmdWwgZm9yIHRlc3Rpbmcgb3Igd2hlbiB3ZSBoYXZlXG4gKiBhIG1hdGNoaW5nIHBsYXRmb3JtIGFuZCBpbnRlcm5hbCB2ZXJzaW9uIG51bWJlclxuICovXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBwdWJsaWMgdXBncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJiOiB2ZXJiIGFzIFZlcmJJZCxcbiAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgYXMgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4ZWN1dGVSZXNwb25zZSwgTm90aWZpY2F0aW9uLCBWZXJiSWQgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuXG4vLyBXZSBuZWVkIHRvIGRpc2FibGUgYW55IGJlY2F1c2UgdGhlc2UgbWV0aG9kcyBuZWVkIHRvIGJlIGdlbmVyaWNcbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBvbGQgdmVycyBhbmQgcGFyYW1ldGVycyBmcm9tIHRoZSBleHRlcm5hbCBiZWZvcmUgd2Ugc2VuZCBpdCB0byBwbGF0Zm9ybSAqL1xuICB1cGdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfTtcblxuICAvKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlZCBhIHJlc3BvbnNlIGJhY2sgZnJvbSBwbGF0Zm9ybSBhbmQgd2UgbmVlZCB0byBkb3duZ3JhZGUgaXQgdG8gZXh0ZXJuYWwncyB2ZXJzaW9uICovXG4gIGRvd25ncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2U7XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbiAgZG93bmdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uO1xufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4ZWN1dGVSZXNwb25zZSwgTm90aWZpY2F0aW9uLCBWZXJiSWQsIFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9ucyBmcm9tICcuL1ZlcnNpb25UcmFuc2xhdGlvbnMnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBjb252ZXJ0ZXIgaXMgZGVzaWduZWQgdG8gYWxsb3cgdGhlIHBsYXRmb3JtIGFuZCBleHRlcm5hbCBtb2R1bGVzXG4gKiB0byBzZWVtbGVzc2x5IGNvbW11bmljYXRlIG92ZXIgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgaW50ZXJuYWwgQVBJLiBUaGUgb25seVxuICogbW9kZSBpdCBzdXBwb3J0cyBpcyBleHRlcm5hbCdzIHZlcnNpb24gPD0gcGxhdGZvcm0ncyB2ZXJzaW9uLiBXaGVuIGV4ZWN1dGluZ1xuICogY29tbWFuZHMsIGl0IGlzIHVzZWQgdG8gdXBncmFkZSB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdG8gd2hhdCBwbGF0Zm9ybSBrbm93cyBvbiB0aGUgd2F5IGluXG4gKiBhbmQgZG93bmdyYWRlIHRoZSByZXByZXNlbnRhdGlvbnMgb24gdGhlIHdheSBvdXQuIFNpbWlsYXJseSBmb3Igbm90aWZpY2F0aW9ucywgaXQgY2FuXG4gKiBkb3duZ3JhZGUgdGhvc2Ugb24gdGhlIHdheSBmcm9tIHBsYXRmb3JtIHRvIGV4dGVybmFsLlxuICovXG5leHBvcnQgY2xhc3MgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyXG4gICAqXG4gICAqIEBwYXJhbSBfZXh0ZXJuYWxWZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCBhcGktZXh0ZXJuYWwtanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9wbGF0Zm9ybVZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHRoZSBhcGktcGxhdGZvcm0tanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdGhlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIHdoZW4gdXBncmFkaW5nIGNtZCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgY21kXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gb24gYSBub3RpZmljYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbURhdGEoXG4gICAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICB1cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4sXG4gICAgZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICAgIGRvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZU5vdGlmaWNhdGlvbj4sXG4gICk6IFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKFxuICAgICAgZXh0ZXJuYWxWZXJzaW9uLm1ham9yLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uLm1ham9yLFxuICAgICAgdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMsXG4gICAgICBkb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zLFxuICAgICAgZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyXG4gICAqXG4gICAqIEBwYXJhbSBfZXh0ZXJuYWxNYWpvclZlcnNpb24gVGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IGFwaS1leHRlcm5hbC1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3BsYXRmb3JtTWFqb3JWZXJzaW9uIFRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB0aGUgYXBpLXBsYXRmb3JtLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHRoZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSB3aGVuIHVwZ3JhZGluZyBjbWQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBhZnRlciBhIGNtZFxuICAgKiBAcGFyYW0gX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIG9uIGEgbm90aWZpY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZXh0ZXJuYWxNYWpvclZlcnNpb246IG51bWJlcixcbiAgICBwcml2YXRlIF9wbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICAgIHByaXZhdGUgX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgICBwcml2YXRlIF9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4sXG4gICAgcHJpdmF0ZSBfZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPixcbiAgKSB7XG4gICAgaWYgKHRoaXMuX2V4dGVybmFsTWFqb3JWZXJzaW9uID4gdGhpcy5fcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgYmV0d2VlbiBleHRlcm5hbCB2ZXJzaW9uICR7dGhpcy5fZXh0ZXJuYWxNYWpvclZlcnNpb259IGFuZCAke3RoaXMuX3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfSB7XG4gICAgLy8gUGVyZm9ybSB0aGUgdXBncmFkZSBvZiB0aGUgdmVyYiBhbmQgcGFyYW1ldGVycyB0byB0aGUgbGV2ZWwgdGhhdCBwbGF0Zm9ybSBpcyB1c2luZ1xuICAgIGxldCB1cGdyYWRlZCA9IHsgdmVyYjogdmVyYiwgcGFyYW1ldGVyczogcGFyYW1ldGVycyB9O1xuICAgIGZvciAoY29uc3QgdXBncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zKSB7XG4gICAgICB1cGdyYWRlZCA9IHVwZ3JhZGVUcmFuc2xhdGlvbih1cGdyYWRlZC52ZXJiLCB1cGdyYWRlZC5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgLy8gRG93bmdyYWRlIHRoZSByZXNwb25zZSB0byB3aGF0IHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgZXhwZWN0aW5nXG4gICAgbGV0IGRvd25ncmFkZWQgPSBleGVjdXRlUmVzcG9uc2U7XG4gICAgZm9yIChjb25zdCBkb3duZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zKSB7XG4gICAgICBkb3duZ3JhZGVkID0gZG93bmdyYWRlVHJhbnNsYXRpb24oZG93bmdyYWRlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvd25ncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICAvLyBEb3duZ3JhZGUgdGhlIG5vdGlmaWNhdGlvbiB0byB3aGF0IHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgZXhwZWN0aW5nXG4gICAgbGV0IGRvd25ncmFkZWQgPSBub3RpZmljYXRpb247XG4gICAgZm9yIChjb25zdCBkb3duZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMpIHtcbiAgICAgIGRvd25ncmFkZWQgPSBkb3duZ3JhZGVUcmFuc2xhdGlvbihkb3duZ3JhZGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG93bmdyYWRlZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0lkZW50aXR5VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9TdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zIGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5pbXBvcnQge1xuICBEb3duZ3JhZGVFeHRlbnNpb25FbnZpcm9ubWVudENvbnRleHQsXG4gIERvd25ncmFkZUZsaXBib2FyZFpvbmVJRCxcbiAgRG93bmdyYWRlUGVyaW9kVHlwZSxcbiAgRG93bmdyYWRlV29ya3NoZWV0Rm9tYXR0aW5nMTc1LFxuICBEb3duZ3JhZGVXb3Jrc2hlZXRGb21hdHRpbmdOb3RpZmljYXRpb24xNzUsXG4gIERvd25ncmFkZVdvcmtzaGVldE5hbWVzLFxufSBmcm9tICcuL1ZlcnNpb25UcmFuc2xhdGlvbnMnO1xuXG4vKipcbiAqIEByZXR1cm5zIHRydWUgaWYgbGhzIDwgcmhzIChpZ25vcmluZyBmaXggbnVtYmVyKVxuICogQHBhcmFtIGxoc1xuICogQHBhcmFtIHJoc1xuICovXG5leHBvcnQgZnVuY3Rpb24gVmVyc2lvbkxlc3NUaGFuKGxoczogVmVyc2lvbk51bWJlciwgcmhzOiBWZXJzaW9uTnVtYmVyKTogYm9vbGVhbiB7XG4gIGlmIChsaHMubWFqb3IgPiByaHMubWFqb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGxocy5tYWpvciA8IHJocy5tYWpvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBsaHMubWlub3IgPCByaHMubWlub3I7XG59XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZiBsaHMgPT0gcmhzIChpZ25vcmluZyBmaXggbnVtYmVyKVxuICogQHBhcmFtIGxoc1xuICogQHBhcmFtIHJoc1xuICovXG5leHBvcnQgZnVuY3Rpb24gVmVyc2lvbkVxdWFsVG8obGhzOiBWZXJzaW9uTnVtYmVyLCByaHM6IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGxocy5tYWpvciA9PT0gcmhzLm1ham9yICYmIGxocy5taW5vciA9PT0gcmhzLm1pbm9yO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1ham9yTWlub3JUcmFuc2xhdG9yczxUPiB7XG4gIFttYWpvcjogbnVtYmVyXTogeyBbbWlub3I6IG51bWJlcl06IEFycmF5PFQ+IH07XG59XG5cbi8vIEEgbWFwcGluZyBmcm9tIGFuIG9sZGVyIGNsaWVudCB2ZXJzaW9uIG9mIGludGVybmFsLWNvbnRyYWN0IHRvIHRoZSBjdXJyZW50IHBsYXRmb3JtIHZlcnNpb24gb2YgdGhpcyBjb250cmFjdC5cbi8vIEVhY2ggdmVyc2lvbiBidW1wIGNhbiBoYXZlIGFuIGFycmF5IG9mIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGluIG9yZGVyLiBOb3RpY2UgdGhhdCB0aGlzIGlzXG4vLyBkaWZmZXJlbnQgdGhhbiB0aGUgbWFqb3IgdXBncmFkZXMvZG93bmdyYWRlcyBhYm92ZSBiZWNhdXNlIGl0IGhhbmRsZXMgYm90aCBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBjaGFuZ2VzLlxuLy8gQWxzbyBwbGVhc2Ugbm90ZTogZG93bmdyYWRlRXhlY3V0ZUNhbGwgaXMgaGFuZGxlZCBvbiB0aGUgY2xpZW50L2V4dGVybmFsIHNpZGUgcmF0aGVyIHRoYW4gcGxhdGZvcm0gc2lkZS5cbi8vIFdoZW4gdXBkYXRpbmcgdGhlIG1ham9yIG9yIG1pbm9yIHZlcnNpb24gb2Ygb3VyIGludGVybmFsLWNvbnRyYWN0LCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGVzZSBkYXRhIHN0cnVjdHVyZXMuXG4vLyAqIElmIHRoZXJlIGFyZSB0cmFuc2xhdGlvbnMgdG8gYWRkLCBhZGQgdGhlbSB0byB0aGUgdmVyc2lvbiB0byBcInVwZ3JhZGUgZnJvbVwiIG9yIFwiZG93bmdyYWRlIHRvXCIuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLCAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JEb3duZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+ID0ge1xuICAxOiB7XG4gICAgNTogW0Rvd25ncmFkZVdvcmtzaGVldE5hbWVzXSxcbiAgICA5OiBbXSxcbiAgICAxNzU6IFtEb3duZ3JhZGVXb3Jrc2hlZXRGb21hdHRpbmcxNzVdLFxuICAgIDE4MjogW0Rvd25ncmFkZUV4dGVuc2lvbkVudmlyb25tZW50Q29udGV4dF0sXG4gICAgMTg5OiBbRG93bmdyYWRlUGVyaW9kVHlwZV0sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgTm90aWZpY2F0aW9uTWlub3JEb3duZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLkRvd25ncmFkZU5vdGlmaWNhdGlvbj4gPSB7XG4gIDE6IHtcbiAgICA5OiBbXSxcbiAgICAxMDogW0Rvd25ncmFkZUZsaXBib2FyZFpvbmVJRF0sXG4gICAgMTc1OiBbRG93bmdyYWRlV29ya3NoZWV0Rm9tYXR0aW5nTm90aWZpY2F0aW9uMTc1XSxcbiAgfSxcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB3aGljaCBoYXMgdGhlIGFiaWxpdHkgdG8gdXBncmFkZSBhbmQgZG93bmdyYWRlIHRoZSBjb250cmFjdFxuICogYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zLCB3aGljaCBhcmUgc3BlY2lmaWVkLiBJZiBleHRlcm5hbE1ham9yVmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gKiBhbiBlcnJvciB3aWxsIGJlIHRocm93biBiZWNhdXNlIHdlIHdvbid0IGtub3cgaG93IHRvIGRvIHRob3NlIGNvbnZlcnNpb25zLlxuICogVGhpcyBjb252ZXJ0ZXIgY2FuIGhhbmRsZSBib3RoIG1ham9yIGFuZCBtaW5vciB1cGRhdGVzIHdoZW4gdGhlIHBsYXRmb3JtIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIGV4dGVybmFsIHZlcnNpb24uXG4gKlxuICogQHBhcmFtIGV4dGVybmFsVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIHBsYXRmb3JtIGlzIHVzaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVWZXJzaW9uQ29udmVydGVyKGV4dGVybmFsVmVyc2lvbjogVmVyc2lvbk51bWJlciwgcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyKTogSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICByZXR1cm4gQ3JlYXRlVmVyc2lvbkNvbnZlcnRlcldpdGhUcmFuc2xhdG9ycyhcbiAgICBleHRlcm5hbFZlcnNpb24sXG4gICAgcGxhdGZvcm1WZXJzaW9uLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVzLFxuICAgIEV4ZWN1dGVNaW5vckRvd25ncmFkZXMsXG4gICAgTm90aWZpY2F0aW9uTWlub3JEb3duZ3JhZGVzLFxuICApO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIENyZWF0ZVZlcnNpb25Db252ZXJ0ZXIuIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHVwZ3JhZGUsIGRvd25ncmFkZSwgYW5kXG4gKiBub3RpZmljYXRpb24gYXJyYXlzIHNvIHRoYXQgYWxsIHRoZSBsb2dpYyBjYW4gYmUgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICogQHBhcmFtIHVwZ3JhZGVzIE1ham9yTWlub3JUcmFuc2xhdG9ycyBmb3IgdXBncmFkZXNcbiAqIEBwYXJhbSBkb3duZ3JhZGVzIE1ham9yTWlub3JUcmFuc2xhdG9ycyBmb3IgZG93bmdyYWRlc1xuICogQHBhcmFtIG5vdGlmaWNhdGlvbkRvd25ncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciBub3RpZmljYXRpb24gZG93bmdyYWRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVmVyc2lvbkNvbnZlcnRlcldpdGhUcmFuc2xhdG9ycyhcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHVwZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4sXG4gIGRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4sXG4gIG5vdGlmaWNhdGlvbkRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPixcbik6IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgY29uc3QgZXh0ZXJuYWxNYWpvclZlcnNpb246IG51bWJlciA9IGV4dGVybmFsVmVyc2lvbi5tYWpvcjtcbiAgY29uc3QgZXh0ZXJuYWxNaW5vclZlcnNpb246IG51bWJlciA9IGV4dGVybmFsVmVyc2lvbi5taW5vcjtcbiAgY29uc3QgcGxhdGZvcm1NYWpvclZlcnNpb246IG51bWJlciA9IHBsYXRmb3JtVmVyc2lvbi5tYWpvcjtcblxuICBpZiAoZXh0ZXJuYWxNYWpvclZlcnNpb24gPiBwbGF0Zm9ybU1ham9yVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXh0ZXJuYWwgdmVyc2lvbiBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBwbGF0Zm9ybSB2ZXJzaW9uLlxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uPSR7ZXh0ZXJuYWxNYWpvclZlcnNpb259IHBsYXRmb3JtTWFqb3JWZXJzaW9uPSR7cGxhdGZvcm1NYWpvclZlcnNpb259YCk7XG4gIH1cblxuICAvLyBJZiB3ZSBhcmUgdXNpbmcgdGhlIGV4YWN0IHNhbWUgdmVyc2lvbnMgKG1ham9yLm1pbm9yKSwganVzdCB1c2UgdGhlIGlkZW50aXR5IGNvbnZlcnRlclxuICBpZiAoVmVyc2lvbkVxdWFsVG8oZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIoKTtcbiAgfVxuXG4gIC8vIFdhbGsgdGhlIHNwYW4gYmV0d2VlbiB0aGUgdmVyc2lvbnMgd2UgaGF2ZSBoZXJlIGFuZCBjb2xsZWN0IHRoZSB1cGdyYWRlIGFuZCBkb3duZ3JhZGVzIG5lY2Vzc2FyeVxuICBjb25zdCBuZWVkZWRFeGVjdXRlVXBncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+ID0gR2V0TmVlZGVkVHJhbnNsYXRpb25zKFxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uLFxuICAgIHBsYXRmb3JtTWFqb3JWZXJzaW9uLFxuICAgIGV4dGVybmFsTWlub3JWZXJzaW9uLFxuICAgIHVwZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVEb3duZ3JhZGVzOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4gPSBHZXROZWVkZWRUcmFuc2xhdGlvbnMoXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgZXh0ZXJuYWxNaW5vclZlcnNpb24sXG4gICAgZG93bmdyYWRlcyxcbiAgKTtcblxuICBjb25zdCBuZWVkZWROb3RpZmljYXRpb25Eb3duZ3JhZGVzOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPiA9IEdldE5lZWRlZFRyYW5zbGF0aW9ucyhcbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBleHRlcm5hbE1pbm9yVmVyc2lvbixcbiAgICBub3RpZmljYXRpb25Eb3duZ3JhZGVzLFxuICApO1xuXG4gIC8vIFdlIHdhbnQgdG8gYXBwbHkgdGhlIGRvd25ncmFkZXMgaW4gcmV2ZXJzZSBvcmRlciBpbiBjYXNlIG9mIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZW1cbiAgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXMucmV2ZXJzZSgpO1xuICBuZWVkZWROb3RpZmljYXRpb25Eb3duZ3JhZGVzLnJldmVyc2UoKTtcblxuICByZXR1cm4gU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyLmZyb21EYXRhKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgbmVlZGVkRXhlY3V0ZVVwZ3JhZGVzLFxuICAgIG5lZWRlZEV4ZWN1dGVEb3duZ3JhZGVzLFxuICAgIG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXMsXG4gICk7XG59XG5cbmZ1bmN0aW9uIEdldE5lZWRlZFRyYW5zbGF0aW9uczxUPihcbiAgZXh0ZXJuYWxNYWpvclZlcnNpb246IG51bWJlcixcbiAgcGxhdGZvcm1NYWpvclZlcnNpb246IG51bWJlcixcbiAgZXh0ZXJuYWxNaW5vclZlcnNpb246IG51bWJlcixcbiAgbWFqb3JNaW5vclRyYW5zbGF0b3JzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VD4sXG4pOiBBcnJheTxUPiB7XG4gIGNvbnN0IG5lZWRlZFRyYW5zbGF0aW9uczogQXJyYXk8VD4gPSBbXTtcblxuICBmb3IgKGxldCBtYWpvciA9IGV4dGVybmFsTWFqb3JWZXJzaW9uOyBtYWpvciA8PSBwbGF0Zm9ybU1ham9yVmVyc2lvbjsgbWFqb3IrKykge1xuICAgIGlmIChtYWpvciBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnMpIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gbWFqb3IgPT09IGV4dGVybmFsTWFqb3JWZXJzaW9uID8gZXh0ZXJuYWxNaW5vclZlcnNpb24gOiAwO1xuICAgICAgY29uc3QgbWF4aW11bU1pbm9yVmVyc2lvbiA9IEdldE1heGltdW1NaW5vckluZGV4KE9iamVjdC5rZXlzKG1ham9yTWlub3JUcmFuc2xhdG9yc1ttYWpvcl0pKTtcbiAgICAgIGZvciAobGV0IG1pbm9yID0gc3RhcnQ7IG1pbm9yIDw9IG1heGltdW1NaW5vclZlcnNpb247IG1pbm9yKyspIHtcbiAgICAgICAgaWYgKG1pbm9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9yc1ttYWpvcl0pIHtcbiAgICAgICAgICBuZWVkZWRUcmFuc2xhdGlvbnMucHVzaCguLi5tYWpvck1pbm9yVHJhbnNsYXRvcnNbbWFqb3JdW21pbm9yXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmVlZGVkVHJhbnNsYXRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gR2V0TWF4aW11bU1pbm9ySW5kZXgobWlub3JWZXJzaW9uczogQXJyYXk8c3RyaW5nPik6IG51bWJlciB7XG4gIHJldHVybiBtaW5vclZlcnNpb25zLm1hcCgoYSkgPT4gTnVtYmVyKGEpKS5yZWR1Y2UoKGEsIGIpID0+IChhID4gYiA/IGEgOiBiKSk7XG59XG4iLCJpbXBvcnQge1xuICBDbGFzc05hbWVLZXksXG4gIERhdGVTdGVwUGVyaW9kLFxuICBEb21haW5SZXN0cmljdGlvblR5cGUsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeGVjdXRlUmVzcG9uc2UsXG4gIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8sXG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIE5vdGlmaWNhdGlvbixcbiAgUGFyYW1ldGVySW5mbyxcbiAgVmVyYklkLFxuICBWaXN1YWxJZCxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nLFxufSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uSWQgfSBmcm9tICcuLi9jb250cmFjdC9Ob3RpZmljYXRpb25zJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgb2xkIHZlcnMgYW5kIHBhcmFtZXRlcnMgZnJvbSB0aGUgZXh0ZXJuYWwgYmVmb3JlIHdlIHNlbmQgaXQgdG8gcGxhdGZvcm0gKi9cbmV4cG9ydCB0eXBlIFVwZ3JhZGVFeGVjdXRlQ2FsbCA9ICh2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKSA9PiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfTtcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZWQgYSByZXNwb25zZSBiYWNrIGZyb20gcGxhdGZvcm0gYW5kIHdlIG5lZWQgdG8gZG93bmdyYWRlIGl0IHRvIGV4dGVybmFsJ3MgdmVyc2lvbiAqL1xuZXhwb3J0IHR5cGUgRG93bmdyYWRlRXhlY3V0ZVJldHVybiA9IChleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSkgPT4gRXhlY3V0ZVJlc3BvbnNlO1xuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGZyb20gcGxhdGZvcm0gYW5kIHdlIG5lZWQgdG8gZG93bmdyYWRlIGl0IHRvIGV4dGVybmFsJ3MgdmVyc2lvbiAqL1xuZXhwb3J0IHR5cGUgRG93bmdyYWRlTm90aWZpY2F0aW9uID0gKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKSA9PiBOb3RpZmljYXRpb247XG5cbi8vIFRoaXMgaXMgd2hlcmUgd2Ugd2lsbCBzdGFydCB0byBkZWZpbmUgc29tZSBvZiB0aGVzZSB0cmFuc2xhdGlvbnMuXG4vLyBXaGVuIG1vZGlmeWluZyBleGlzdGluZyBtb2RlbHMsIGFkZCB0aGUgcmVxdWlzaXRlIGNvbnZlcnNpb24gZnVuY3Rpb25zIGhlcmUsIHRoZW4gdXNlIHRoZW1cbi8vIGluIHRoZSBWZXJzaW9uQ29udmVydGVyRmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4gSW1wb3J0IG9sZCB2ZXJzaW9ucyBhcyB5b3Ugd291bGQgYW55IG90aGVyIG1vZHVsZVxuXG4vLyAwIDwtPiBUcmFuc2xhdGlvbnNcbi8vIFVuY29tbWVudCB0aGlzIGxpbmUgdG8gaW1wb3J0IGZyb20gdGhlIFYwIGRlZmluaXRpb24gb2YgdGhlIEFQSVxuLy8gaW1wb3J0ICogYXMgVjAgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzLXYwJztcblxuLy8gMSA8LT4gMiBUcmFuc2xhdGlvbnNcbi8vIFVuY29tbWVudCB0aGlzIGxpbmUgdG8gaW1wb3J0IGZyb20gdGhlIFYxIGRlZmluaXRpb24gb2YgdGhlIEFQSVxuLy8gaW1wb3J0ICogYXMgVjEgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzLXYxJztcblxuZXhwb3J0IGZ1bmN0aW9uIERvd25ncmFkZVdvcmtzaGVldE5hbWVzKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgLy8gRml4IHRoZSBkYXNoYm9hcmQgZnJpZW5kbHkgbmFtZSBpc3N1ZS4gVGhlIHN0cnVjdHVyZXMgYXJlIGNvbXBhdGlibGUsXG4gIC8vIHNvIHdlIHN0aWxsIHJldHVybiB0aGUgb3JpZ2luYWwgcmVwbHksIGJ1dCB3ZSBjb3B5IHRoZSBTaGVldEluZm8ubmFtZVxuICAvLyBpbnRvIHRoZSBEYXNoYm9hcmRab25lLm5hbWUsIHdoZXJlIHYxIHdhbnRzIHRvIGZpbmQgaXQuXG5cbiAgY29uc3QgYm9vdHN0cmFwSW5mbyA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbztcbiAgaWYgKGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYm9vdHN0cmFwSW5mby5leHRlbnNpb25EYXNoYm9hcmRJbmZvLnpvbmVzLmZvckVhY2goKHpvbmUpID0+IHtcbiAgICAgIGlmICh6b25lLnNoZWV0SW5mbykge1xuICAgICAgICB6b25lLm5hbWUgPSB6b25lLnNoZWV0SW5mby5uYW1lO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIERvd25ncmFkZUZsaXBib2FyZFpvbmVJRChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gIC8vIEZpeCB0aGUgRmxpcGJvYXJkWm9uZUlkIGlzc3VlLiBPbGRlciBleHRlcm5hbCB2ZXJzaW9ucyBzdGlsbCBjaGVjayBmb3IgZmxpcGJvYXJkWm9uZUlEcy5cbiAgLy8gV2hlbiBydW5uaW5nIGFnYWluc3QgYSBuZXdlciBzZXJ2ZXIsIGlmIGZsaXBib2FyZFpvbmVJZCBpcyBhYnNlbnQsIHNldCBpdCB0byBkZWZhdWx0KDApLlxuXG4gIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQgPT09IE5vdGlmaWNhdGlvbklkLlNlbGVjdGVkTWFya3NDaGFuZ2VkKSB7XG4gICAgY29uc3QgdmlzdWFsTW9kZWwgPSBub3RpZmljYXRpb24uZGF0YSBhcyBWaXN1YWxJZDtcbiAgICBpZiAodmlzdWFsTW9kZWwuZmxpcGJvYXJkWm9uZUlEID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZpc3VhbE1vZGVsLmZsaXBib2FyZFpvbmVJRCA9IDA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vdGlmaWNhdGlvbjtcbn1cblxuLy8gRmlsdGVyIG91dCBmb3JtYXR0aW5nIHNoZWV0cyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIGNsYXNzTmFtZXMgbGlzdFxuZnVuY3Rpb24gRG93bmdyYWRlV29ya3NoZWV0Rm9ybWF0dGluZyhleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgY2xhc3NOYW1lczogQ2xhc3NOYW1lS2V5W10pOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBjb25zdCBib290c3RyYXBJbmZvID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25Cb290c3RyYXBJbmZvO1xuXG4gIGlmIChib290c3RyYXBJbmZvPy5leHRlbnNpb25Xb3Jrc2hlZXRJbmZvPy5mb3JtYXR0aW5nKVxuICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uV29ya3NoZWV0SW5mby5mb3JtYXR0aW5nLmZvcm1hdHRpbmdTaGVldHMgPVxuICAgICAgYm9vdHN0cmFwSW5mby5leHRlbnNpb25Xb3Jrc2hlZXRJbmZvLmZvcm1hdHRpbmcuZm9ybWF0dGluZ1NoZWV0cy5maWx0ZXIoKHgpID0+ICFjbGFzc05hbWVzLmluY2x1ZGVzKHguY2xhc3NOYW1lS2V5KSk7XG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbi8vIEZpbHRlciBvdXQgZm9ybWF0dGluZyBzaGVldHMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBjbGFzc05hbWVzIGxpc3Rcbi8vIEZpbHRlciBvdXQgZm9ybWF0dGluZyBzaGVldHMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBjbGFzc05hbWVzIGxpc3RcbmZ1bmN0aW9uIERvd25ncmFkZVdvcmtzaGVldEZvcm1hdHRpbmdOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24sIGNsYXNzTmFtZXM6IENsYXNzTmFtZUtleVtdKTogTm90aWZpY2F0aW9uIHtcbiAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25JZCA9PT0gTm90aWZpY2F0aW9uSWQuV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWQpIHtcbiAgICBjb25zdCBmb3JtYXR0aW5nID0gbm90aWZpY2F0aW9uLmRhdGEgYXMgV29ya2Jvb2tGb3JtYXR0aW5nO1xuICAgIG5vdGlmaWNhdGlvbi5kYXRhID0gZm9ybWF0dGluZy5mb3JtYXR0aW5nU2hlZXRzLmZpbHRlcigoeCkgPT4gIWNsYXNzTmFtZXMuaW5jbHVkZXMoeC5jbGFzc05hbWVLZXkpKTtcbiAgfVxuXG4gIHJldHVybiBub3RpZmljYXRpb247XG59XG5cbi8vIFdlIGFkZGVkIG5ldyBlbnVtIHZhbHVlcyBmb3IgQ2xhc3NOYW1lS2V5cyBlbnVtIGluIDE3Ni4gTmVlZCB0byBmaWx0ZXIgdGhlbSBvdXQgaWYgdGhlIGNsaWVudCB2ZXJzaW9uIGlzIDwxNzZcbmNvbnN0IENsYXNzTmFtZUtleXNUb0ZpbHRlcjE3NSA9IFtDbGFzc05hbWVLZXkuUm93RGl2aWRlcnMsIENsYXNzTmFtZUtleS5Db2x1bW5EaXZpZGVycywgQ2xhc3NOYW1lS2V5LlBhbmVdO1xuXG5leHBvcnQgY29uc3QgRG93bmdyYWRlV29ya3NoZWV0Rm9tYXR0aW5nMTc1ID0gKHJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+XG4gIERvd25ncmFkZVdvcmtzaGVldEZvcm1hdHRpbmcocmVzcG9uc2UsIENsYXNzTmFtZUtleXNUb0ZpbHRlcjE3NSk7XG5leHBvcnQgY29uc3QgRG93bmdyYWRlV29ya3NoZWV0Rm9tYXR0aW5nTm90aWZpY2F0aW9uMTc1ID0gKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKSA9PlxuICBEb3duZ3JhZGVXb3Jrc2hlZXRGb3JtYXR0aW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgQ2xhc3NOYW1lS2V5c1RvRmlsdGVyMTc1KTtcblxuZXhwb3J0IGZ1bmN0aW9uIERvd25ncmFkZUV4dGVuc2lvbkVudmlyb25tZW50Q29udGV4dChleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIC8vIEZpeCB0aGUgZXh0ZW5zaW9uIGVudmlyb25tZW50IGNvbnRleHQgaXNzdWUuIFJlcGxhY2VzIG5ldyBlbnVtIHZhbHVlcyB0aGF0IGdvIHVucmVjb2duaXplZFxuICAvLyBieSBvbGRlciBleHRlbnNpb25zIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSBvbGRlciBlbnVtIHZhbHVlcy5cbiAgY29uc3QgYm9vdHN0cmFwSW5mbyA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbztcblxuICBpZiAoYm9vdHN0cmFwSW5mby5leHRlbnNpb25FbnZpcm9ubWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY29udGV4dCA9IGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ29udGV4dDtcbiAgICBpZiAoY29udGV4dCA9PT0gRXh0ZW5zaW9uQ29udGV4dC5QdWJsaWNXZWIgfHwgY29udGV4dCA9PT0gRXh0ZW5zaW9uQ29udGV4dC5DbG91ZCkge1xuICAgICAgYm9vdHN0cmFwSW5mby5leHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25Db250ZXh0ID0gRXh0ZW5zaW9uQ29udGV4dC5TZXJ2ZXI7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBFeHRlbnNpb25Db250ZXh0LlB1YmxpY0Rlc2t0b3ApIHtcbiAgICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ29udGV4dCA9IEV4dGVuc2lvbkNvbnRleHQuRGVza3RvcDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBIYW5kbGVEb3duZ3JhZGVQZXJpb2RUeXBlRm9yUGFyYW1ldGVyKHBhcmFtZXRlcjogUGFyYW1ldGVySW5mbykge1xuICBpZiAocGFyYW1ldGVyLmFsbG93YWJsZVZhbHVlc1R5cGUgPT09IERvbWFpblJlc3RyaWN0aW9uVHlwZS5SYW5nZSkge1xuICAgIGlmIChwYXJhbWV0ZXIuZGF0ZVN0ZXBQZXJpb2QgPT09IERhdGVTdGVwUGVyaW9kLklzb1llYXJzKSB7XG4gICAgICBwYXJhbWV0ZXIuZGF0ZVN0ZXBQZXJpb2QgPSBEYXRlU3RlcFBlcmlvZC5ZZWFycztcbiAgICB9IGVsc2UgaWYgKHBhcmFtZXRlci5kYXRlU3RlcFBlcmlvZCA9PT0gRGF0ZVN0ZXBQZXJpb2QuSXNvUXVhcnRlcnMpIHtcbiAgICAgIHBhcmFtZXRlci5kYXRlU3RlcFBlcmlvZCA9IERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzO1xuICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyLmRhdGVTdGVwUGVyaW9kID09PSBEYXRlU3RlcFBlcmlvZC5Jc29XZWVrcykge1xuICAgICAgcGFyYW1ldGVyLmRhdGVTdGVwUGVyaW9kID0gRGF0ZVN0ZXBQZXJpb2QuV2Vla3M7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVQZXJpb2RUeXBlKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCkpIHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxQYXJhbWV0ZXJJbmZvPjtcbiAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICBIYW5kbGVEb3duZ3JhZGVQZXJpb2RUeXBlRm9yUGFyYW1ldGVyKHBhcmFtZXRlcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHBhcmFtZXRlciA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgUGFyYW1ldGVySW5mbztcbiAgICBIYW5kbGVEb3duZ3JhZGVQZXJpb2RUeXBlRm9yUGFyYW1ldGVyKHBhcmFtZXRlcik7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4ZWN1dGVSZXNwb25zZSwgTm90aWZpY2F0aW9uLCBWZXJiSWQgfSBmcm9tICcuLi8uLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuXG4vLyBXZSBuZWVkIHRvIGRpc2FibGUgYW55IGJlY2F1c2UgdGhlc2UgbWV0aG9kcyBuZWVkIHRvIGJlIGdlbmVyaWNcbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG5ld2VyIHZlcmIgYW5kIHBhcmFtZXRlcnMgZnJvbSBleHRlcm5hbFxuICAgKiBhbmQgbmVlZCB0byBkb3duZ3JhZGUgaXQgZm9yIGFuIG9sZGVyIHBsYXRmb3JtXG4gICAqL1xuICBkb3duZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gYW4gb2xkZXIgcGxhdGZvcm0gYW5kIHdlIG5lZWRcbiAgICogdG8gdXBncmFkZSBpdCB0byBhIG5ld2VyIGV4dGVybmFsLiBUaGUgdmVyYiBhbmQgcGFyYW1ldGVycyBwcm92aWRlIGNvbnRleHQgdG8gYmUgYWJsZSB0byBtYWtlXG4gICAqIGRlY2lzaW9ucyBvbiB3aGF0IHdlIG5lZWQgdG8gZG8uXG4gICAqL1xuICB1cGdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IEV4ZWN1dGVSZXNwb25zZTtcblxuICAvKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGZyb20gcGxhdGZvcm0gYW5kIHdlIG5lZWQgdG8gdXBncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbiAgdXBncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbjtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoaXMgdmVyc2lvbiBjb252ZXJ0ZXIgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyBidXQgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gd2UgaGF2ZVxuICogYSBtYXRjaGluZyBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgdmVyc2lvbiBudW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcmI6IHZlcmIgYXMgVmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyBhcyBFeGVjdXRlUGFyYW1ldGVycyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCB2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIHJldHVybiBub3RpZmljYXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9FeHRlcm5hbFZlcnNpb25UcmFuc2xhdGlvbnMnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbi8qKlxuICogVGhlIHZlcnNpb24gY29udmVydGVyIGlzIGRlc2lnbmVkIHRvIGFsbG93IHRoZSBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgbW9kdWxlc1xuICogdG8gc2VlbWxlc3NseSBjb21tdW5pY2F0ZSBvdmVyIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGludGVybmFsIEFQSS4gVGhpcyBjb252ZXJ0ZXJcbiAqIHN1cHBvcnRzIGV4dGVybmFsJ3MgdmVyc2lvbihtaW5vcikgPj0gcGxhdGZvcm0ncyB2ZXJzaW9uKG1pbm9yKS4gV2hlbiBleGVjdXRpbmdcbiAqIGNvbW1hbmRzLCBpdCBpcyB1c2VkIHRvIGRvd25ncmFkZSB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdG8gd2hhdCBwbGF0Zm9ybSBrbm93cyBvbiB0aGUgd2F5IGluXG4gKiBhbmQgdXBncmFkZSB0aGUgcmVwcmVzZW50YXRpb25zIG9uIHRoZSB3YXkgb3V0LlxuICovXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbFZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IGFwaS1leHRlcm5hbC1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3BsYXRmb3JtVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX2Rvd25ncmFkZUV4ZWN1dGVDYWxsVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiBkb3duZ3JhZGluZyBjbWQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlUmV0dXJuVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB1cGdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgY21kIGlzIGV4ZWN1dGVkXG4gICAqIEBwYXJhbSBfdXBncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdXBncmFkZSBub3RmaWNhdGlvbnMgdG8gcGVyZm9ybSBvbiBldmVudHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9leHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZUV4ZWN1dGVDYWxsVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIHByaXZhdGUgX3VwZ3JhZGVFeGVjdXRlUmV0dXJuVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICAgIHByaXZhdGUgX3VwZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlTm90aWZpY2F0aW9uPixcbiAgKSB7XG4gICAgaWYgKHRoaXMuX2V4dGVybmFsVmVyc2lvbi5tYWpvciA+IHRoaXMuX3BsYXRmb3JtVmVyc2lvbi5tYWpvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCBiZXR3ZWVuIGV4dGVybmFsIHZlcnNpb24gJHt0aGlzLl9leHRlcm5hbFZlcnNpb24ubWFqb3J9XG4gICAgICBhbmQgJHt0aGlzLl9wbGF0Zm9ybVZlcnNpb24ubWFqb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIC8vIFBlcmZvcm0gdGhlIGRvd25ncmFkZSBvZiB0aGUgdmVyYiBhbmQgcGFyYW1ldGVycyB0byB0aGUgbGV2ZWwgdGhhdCBwbGF0Zm9ybSBpcyB1c2luZ1xuICAgIGxldCBkb3duZ3JhZGVkID0geyB2ZXJiOiB2ZXJiLCBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIH07XG4gICAgZm9yIChjb25zdCBkb3duZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQudmVyYiwgZG93bmdyYWRlZC5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG93bmdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgLy8gUGVyZm9ybSB0aGUgdXBncmFkZSBvZiB0aGUgcmVzcG9uc2UgdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCB1cGdyYWRlZCA9IGV4ZWN1dGVSZXNwb25zZTtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlVHJhbnNsYXRpb24odXBncmFkZWQsIHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICAvLyBQZXJmb3JtIHRoZSB1cGdyYWRlIG9mIG5vdGlmaWNhdGlvbiB0byB3aGF0IHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgZXhwZWN0aW5nXG4gICAgbGV0IHVwZ3JhZGVkID0gbm90aWZpY2F0aW9uO1xuICAgIGZvciAoY29uc3QgdXBncmFkZU5vdGlmaWNhdGlvbiBvZiB0aGlzLl91cGdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zKSB7XG4gICAgICB1cGdyYWRlZCA9IHVwZ3JhZGVOb3RpZmljYXRpb24odXBncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBHZXRNYXhpbXVtTWlub3JJbmRleCwgTWFqb3JNaW5vclRyYW5zbGF0b3JzLCBWZXJzaW9uRXF1YWxUbyB9IGZyb20gJy4uL1ZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9uc0V4dGVybmFsIGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gQSBtYXBwaW5nIGZyb20gdGhlIGN1cnJlbnQgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gYW4gb2xkZXIgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgY29udHJhY3QuXG4vLyBFYWNoIHZlcnNpb24gYnVtcCBjYW4gaGF2ZSBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBpbiBvcmRlci5cbi8vIFRoZXNlIHRyYW5zbGF0aW9ucyBoYW5kbGUgZG93bmdyYWRlRXhlY3V0ZUNhbGwgYW5kIHVwZ3JhZGVFeGVjdXRlUmV0dXJuIGFuZCBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIG9uIHRoZVxuLy8gY2xpZW50L2V4dGVybmFsIHNpZGUuXG4vLyBXaGVuIHVwZGF0aW5nIHRoZSBtYWpvciBvciBtaW5vciB2ZXJzaW9uIG9mIG91ciBpbnRlcm5hbC1jb250cmFjdCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzLlxuLy8gKiBJZiB0aGVyZSBhcmUgdHJhbnNsYXRpb25zIHRvIGFkZCwgYWRkIHRoZW0gdG8gdGhlIHZlcnNpb24gdG8gJ3VwZ3JhZGUgZnJvbScgb3IgJ2Rvd25ncmFkZSB0bycuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuRG93bmdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgZG93bmdyYWRlcyBmcm9tIDEuMTAgdG8gMS45IGluIHRoZSBbMV1bOV0gYnVja2V0XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZVJldHVybkV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vclVwZ3JhZGVOb3RpZmljYXRpb246IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlTm90aWZpY2F0aW9uPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLCAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfSxcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB3aGljaCBoYXMgdGhlIGFiaWxpdHkgdG8gdXBncmFkZSBhbmQgZG93bmdyYWRlXG4gKiB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGxlc3MgdGhhblxuICogcGxhdGZvcm1NYWpvclZlcnNpb24sIGFuIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBIYW5kbGVzIHVwZ3JhZGUvZG93bmdyYWRlIGZvciBib3RoIG1ham9yIGFuZCBtaW5vciB1cGRhdGVzLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcihcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVSZXR1cm5FeHRlcm5hbCxcbiAgICBFeGVjdXRlTWlub3JVcGdyYWRlTm90aWZpY2F0aW9uLFxuICApO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMuXG4gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB1cGdyYWRlLCBkb3duZ3JhZGUgYXJyYXlzIHNvIHRoYXQgYWxsIHRoZSBsb2dpYyBjYW4gYmUgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqIEBwYXJhbSB1cGdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIHJlc3BvbnNlIHVwZ3JhZGVzXG4gKiBAcGFyYW0gZG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIGV4ZWN1dGUgY2FsbCBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlRXhlY3V0ZVJldHVybj4sXG4gIHVwZ3JhZGVOb3RpZmljYXRpb25zOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZU5vdGlmaWNhdGlvbj4sXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIGNvbnN0IGV4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBleHRlcm5hbFZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWlub3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWlub3I7XG5cbiAgLy8gVGhpcyBjaGVjayBpcyBwcmVzZW50IGluIFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LiBXZSB0aHJvdyB0aGUgc2FtZSBlcnJvciBoZXJlIGFzIHdlbGwuXG4gIC8vIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbWlub3IgdmVyc2lvbnMgZm9yIHRyYW5zbGF0aW9ucy5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uID4gcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVybmFsIHZlcnNpb24gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcGxhdGZvcm0gdmVyc2lvbi5cbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbj0ke2V4dGVybmFsTWFqb3JWZXJzaW9ufSBwbGF0Zm9ybU1ham9yVmVyc2lvbj0ke3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICB9XG5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uIDwgcGxhdGZvcm1NYWpvclZlcnNpb24gfHwgVmVyc2lvbkVxdWFsVG8oZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIG5ldyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVDYWxsRG93bmdyYWRlOiBBcnJheTxUcmFuc2xhdGlvbnNFeHRlcm5hbC5Eb3duZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRFeHRlcm5hbFRyYW5zbGF0aW9ucyhcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVSZXR1cm5VcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZU5vdGlmaWNhdGlvbnMsXG4gICk7XG5cbiAgLy8gUmV2ZXJzZSB0aGUgZG93bmdyYWRlIGNhbGxzLCBzbyB0aGF0IHdlIHN0YXJ0IHRoZSBkb3duZ3JhZGUgZnJvbSB0aGUgZXh0ZXJuYWwgdmVyc2lvbiB0byB0aGUgcGxhdGZvcm0gdmVyc2lvblxuICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZS5yZXZlcnNlKCk7XG4gIHJldHVybiBuZXcgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZSxcbiAgICBuZWVkZWRFeGVjdXRlUmV0dXJuVXBncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXMsXG4gICk7XG59XG5cbmZ1bmN0aW9uIEdldE5lZWRlZEV4dGVybmFsVHJhbnNsYXRpb25zPFQ+KFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybU1ham9yVmVyc2lvbiBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnMpIHtcbiAgICBjb25zdCBzdGFydCA9IHBsYXRmb3JtTWlub3JWZXJzaW9uO1xuICAgIGNvbnN0IG1heGltdW1NaW5vclZlcnNpb24gPSBHZXRNYXhpbXVtTWlub3JJbmRleChPYmplY3Qua2V5cyhtYWpvck1pbm9yVHJhbnNsYXRvcnNbcGxhdGZvcm1NYWpvclZlcnNpb25dKSk7XG4gICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgaWYgKG1pbm9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9yc1twbGF0Zm9ybU1ham9yVmVyc2lvbl0pIHtcbiAgICAgICAgbmVlZGVkVHJhbnNsYXRpb25zLnB1c2goLi4ubWFqb3JNaW5vclRyYW5zbGF0b3JzW3BsYXRmb3JtTWFqb3JWZXJzaW9uXVttaW5vcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG4iLCIvLyBFeHBvcnQgZXZlcnl0aGluZyB3aGljaCBoYWQgYmVlbiBwcmV2aW91c2x5IGluIHRoZSBhcGktc2hhcmVkIG1vZHVsZVxuXG5leHBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnLi9BcGlTaGFyZWQvQXBpVmVyc2lvbic7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVCb290c3RyYXAnO1xuZXhwb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcbmV4cG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9EYXRhU291cmNlJztcbmV4cG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4vQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuZXhwb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5leHBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJy4vQXBpU2hhcmVkL0V2ZW50TGlzdGVuZXJNYW5hZ2VyJztcbmV4cG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9BcGlTaGFyZWQvRmllbGQnO1xuZXhwb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmV4cG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwnO1xuZXhwb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5leHBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuZXhwb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvUGFyYW1ldGVySW1wbCc7XG5leHBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NoZWV0SW1wbCc7XG5leHBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TaGVldEluZm9JbXBsJztcbmV4cG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlckltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwnO1xuZXhwb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwnO1xuZXhwb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbXBsJztcbmV4cG9ydCB7IFN0b3J5UG9pbnRJbmZvSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvU3RvcnlQb2ludEluZm9JbXBsJztcbmV4cG9ydCB7IFdvcmtib29rSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvV29ya2Jvb2tJbXBsJztcbmV4cG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwnO1xuZXhwb3J0IHsgUG9pbnQgfSBmcm9tICcuL0FwaVNoYXJlZC9Qb2ludCc7XG5leHBvcnQgeyBBbm5vdGF0aW9uU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0Fubm90YXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuZXhwb3J0IHsgRXhwb3J0U2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0V4cG9ydFNlcnZpY2UnO1xuZXhwb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuZXhwb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlLCBVbnJlZ2lzdGVyRm4gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9Ob3RpZmljYXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyc7XG5leHBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU2VsZWN0aW9uU2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuZXhwb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TaXplU2VydmljZSc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU3RvcnlBY3RpdmF0aW9uU2VydmljZSc7XG5leHBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvVml6U2VydmljZSc7XG5leHBvcnQgeyBDbGllbnRJbmZvU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0NsaWVudEluZm9TZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlLCBSZWdpc3RyYXRpb24gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTaXplU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2luZ2xlRXZlbnRNYW5hZ2VyJztcbmV4cG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vQXBpU2hhcmVkL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0RlZmVycmVkJztcbmV4cG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycyc7XG5leHBvcnQgeyBFeHBvcnRIZWxwZXJzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvRXhwb3J0SGVscGVycyc7XG5leHBvcnQgeyBTaGVldFV0aWxzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvU2hlZXRVdGlscyc7XG5leHBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9BcGlTaGFyZWQvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgeyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICcuL1ZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlcic7XG4iLCJpbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9WZXJzaW9uTnVtYmVyJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXJDb250cmFjdCB9IGZyb20gJy4vVmVyc2lvbk51bWJlckNvbnRyYWN0JztcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGV0b24gd3JhcHBlciBvZiBWZXJzaW9uTnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlWZXJzaW9uIHtcbiAgLy8gVXNpbmcgc29tZSB3ZWJwYWNrIHRyaWNrcywgd2UgY2FuIGluamVjdCB0aGlzIHZlcnNpb24gaW50byBvdXIgY29kZSAoa2luZGEgbGlrZSBjKysgcHJlcHJvY2Vzc29yIHN0dWZmKVxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFZlcnNpb25OdW1iZXJDb250cmFjdDtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFZlcnNpb25OdW1iZXJDb250cmFjdCB7XG4gICAgcmV0dXJuIEFwaVZlcnNpb24uX2luc3RhbmNlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBTZXRWZXJzaW9uTnVtYmVyKG51bVN0cmluZzogc3RyaW5nLCBpc0FscGhhOiBib29sZWFuKTogdm9pZCB7XG4gICAgQXBpVmVyc2lvbi5faW5zdGFuY2UgPSBuZXcgVmVyc2lvbk51bWJlcihudW1TdHJpbmcsIGlzQWxwaGEpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSBjb25uZWN0aW9uIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uU3VtbWFyeSBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbm5lY3Rpb25TdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Nvbm5lY3Rpb25JbmZvOiBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5KSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VydmVyVVJJKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLnNlcnZlclVSSTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby50eXBlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgQ3Jvc3NGcmFtZU1lc3NlbmdlcixcbiAgSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICBNRVNTQUdJTkdfVkVSU0lPTiBhcyBBcGlNZXNzYWdpbmdWZXJzaW9uLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcblxuLy8gQ2hlY2tzIHRvIHNlZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBhbiBpZnJhbWUgY3VycmVudGx5OiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzI2MDc2Lzg4MjExNTNcbmZ1bmN0aW9uIGluSWZyYW1lKHRoaXNXaW5kb3c6IFdpbmRvdyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzV2luZG93LnNlbGYgIT09IHRoaXNXaW5kb3cucGFyZW50O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBib290c3RyYXAgdGhlIGV4dGVuc2lvbiB3aXRoIGEgY3Jvc3MtZnJhbWUgcGFyZW50IHdoZXJlIFRhYmxlYXUgaXMgcnVubmluZ1xuICpcbiAqIEBwYXJhbSB0aGlzV2luZG93IFRoZSB3aW5kb3cgd2hpY2ggd2UgYXJlIHJ1bm5pbmcgaW4gKGluamVjdGVkIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMpXG4gKiBAcGFyYW0gaW50ZXJuYWxDb250cmFjdFZlcnNpb24gVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3ZSBhcmUgdXNpbmdcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCBpcyBkb2luZyB0aGUgYWN0dWFsIGJvb3RzdHJhcHBpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcChcbiAgdGhpc1dpbmRvdzogV2luZG93LFxuICBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbjogQ29udHJhY3QuVmVyc2lvbk51bWJlcixcbiAgb3B0aW9uczogSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuKTogUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IHBhcmVudDogV2luZG93O1xuXG4gICAgLy8gTm9ybWFsbHksIHdlIGFyZSBydW5uaW5nIGluc2lkZSBhbiBpZnJhbWUuICBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgaXNcbiAgICAvLyB3aGVuIHdlIGFyZSBydW5uaW5nIGFzIGFuIGV4dGVuc2lvbiBpbnNpZGUgYSBkaWFsb2cgYXMgcGFydCBvZiB0aGUgVUlOYW1lc3BhY2VcbiAgICAvLyBmdW5jdGlvbmFsaXR5LiAgSW4gdGhhdCBjYXNlLCB3ZSB3YW50IHRoZSBvcGVuZXIgb2YgdGhpcyB3aW5kb3cgcmF0aGVyIHRoYW4gdGhlIHBhcmVudC5cbiAgICBpZiAoIWluSWZyYW1lKHRoaXNXaW5kb3cpKSB7XG4gICAgICBwYXJlbnQgPSB0aGlzV2luZG93Lm9wZW5lcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50ID0gdGhpc1dpbmRvdy5wYXJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJlamVjdCgnVGhpcyBleHRlbnNpb24gaXMgbm90IHJ1bm5pbmcgaW5zaWRlIGFuIGlmcmFtZSwgZGVza3RvcCwgb3IgcG9wdXAgd2luZG93LiBJbml0aWFsaXphdGlvbiBmYWlsZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBtZXNzZW5nZXIgd2hpY2ggd2lsbCBkbyBoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhpcyB3aW5kb3cgYW5kIG91ciBwYXJlbnRcbiAgICAvLyBTaW5jZSB3ZSBkb24ndCBrbm93IHdoZXJlIHdlIGFyZSBydW5uaW5nIHlldCwgd2UgaGF2ZSB0byBtYWtlIHRoaXMgaW5pdGlhbCBvcmlnaW4gJyonLiBPbmNlXG4gICAgLy8gd2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgb3VyIGV4dGVuc2lvbiwgd2Ugd2lsbCBsaW1pdCB3aGVyZSB3ZSBzZW5kIG1lc3NhZ2VzXG4gICAgY29uc3QgbWVzc2VuZ2VyID0gbmV3IENyb3NzRnJhbWVNZXNzZW5nZXIodGhpc1dpbmRvdywgcGFyZW50LCAnKicpO1xuXG4gICAgLy8gUHJlcGFyZSB0byBzZW5kIGFuIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgdG8gdGhlIHBhcmVudCBmcmFtZVxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uTWVzc2FnZSA9IG1lc3Nlbmdlci5wcmVwYXJlSW5pdGlhbGl6YXRpb25NZXNzYWdlKGludGVybmFsQ29udHJhY3RWZXJzaW9uLCBBcGlNZXNzYWdpbmdWZXJzaW9uLCBvcHRpb25zKTtcblxuICAgIC8vIFdoZW4gd2UgcmVjZWl2ZSBhIHJlc3BvbnNlIGJhY2sgZnJvbSB0aGUgcGFyZW50LCB3ZSBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGd1aWRzIG1hdGNoIGFuZCB0aGVuIHdlIGtub3dcbiAgICAvLyB0aGF0IHRoZSBwYXJlbnQgaXMgYXdhcmUgb2YgdXMgYW5kIHdlIGNhbiBzdGFydCBjb21tdW5pY2F0aW5nXG4gICAgbWVzc2VuZ2VyLnNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGZ1bmN0aW9uIChtc2c6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UpOiB2b2lkIHtcbiAgICAgIC8vIFZlcmlmeSB3ZSBhcmUgZ2V0dGluZyBhIHJlc3BvbnNlIGZyb20gb3VyIGluaXRpYWxpemUgbWVzc2FnZVxuICAgICAgaWYgKG1zZy5jb21tYW5kR3VpZCA9PT0gaW5pdGlhbGl6YXRpb25NZXNzYWdlLm1lc3NhZ2VHdWlkKSB7XG4gICAgICAgIC8vIFRoZSB2ZXJzaW9uaW5nIG9mIHRoZSBkaXNwYXRjaGVyIGhhcHBlbnMgb24gdGhlIG90aGVyIHNpZGUgb2Ygb3VyIGZyYW1lLCBhbmRcbiAgICAgICAgLy8gaW4gYSB3cmFwcGVyIG9uIHRoaXMgc2lkZS4gVGhpcyBvbmUgZG9lc24ndCBoYXZlIGFueSB2ZXJzaW9uIGtub3dsZWRnZS5cbiAgICAgICAgY29uc3QgZGlzcGF0Y2hlckZhY3RvcnkgPSAoKSA9PiBuZXcgQ3Jvc3NGcmFtZURpc3BhdGNoZXIobWVzc2VuZ2VyKTtcbiAgICAgICAgcmVzb2x2ZShkaXNwYXRjaGVyRmFjdG9yeSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBOb3cgdGhhdCBvdXIgaGFuZGxlcnMgYXJlIHJlYWR5LCBzdGFydCBsaXN0ZW5pbmcgYW5kIHNlbmQgb3VyIGluaXRpYWxpemF0aW9uIG1lc3NhZ2VcbiAgICBtZXNzZW5nZXIuc3RhcnRMaXN0ZW5pbmcoKTtcbiAgICBpbml0aWFsaXphdGlvbk1lc3NhZ2Uuc2VuZCgpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IEVtYmVkZGluZ0Vycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBNZXNzZW5nZXIsXG4gIE1vZGVsLFxuICBOb3RpZmljYXRpb25IYW5kbGVyLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxuICBWZXJiSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEludGVybmFsQXBpRGlzcGF0Y2hlciBpbnRlcmZhY2Ugd2hpY2ggZnVuY3Rpb25zIGJ5IHBhc3NpbmcgbWVzc2FnZXNcbiAqIGFjcm9zcyBhIGZyYW1lIGJvdW5kYXJ5LiBUaGlzIGlzIHVzdWFsbHkgYmV0d2VlbiB0aGUgY29kZSB3aGVyZSBvdXIgamF2c2NyaXB0IGxpYnJhcnkgaGFzIGJlZW4gaW5jbHVkZWRcbiAqIGJ5IGEgM3JkIHBhcnR5IGRldiBhbmQgYW5vdGhlciBmcmFtZSB3aGVyZSBUYWJsZWF1IHNlcnZlciBoYXMgY29udGVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVEaXNwYXRjaGVyIGltcGxlbWVudHMgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIHtcbiAgLy8gQ29sbGVjdGlvbiBvZiBwZW5kaW5nIHByb21pc2VzIHdoaWNoIGFyZSB3YWl0aW5nIHRvIGJlIHJlc29sdmVkLiBXaGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gdGhlIG90aGVyIGZyYW1lLFxuICAvLyB0aGVzZSBwcm9taXNlcyBjYW4gYmUgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkXG4gIHByaXZhdGUgX3BlbmRpbmdQcm9taXNlczogeyBbbWVzc2FnZUd1aWQ6IHN0cmluZ106IHsgcmVzb2x2ZTogKHJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IHZvaWQ7IHJlamVjdDogKGVycm9yOiBNb2RlbCkgPT4gdm9pZCB9IH0gPVxuICAgIHt9O1xuXG4gIC8vIFRoZSBjb2xsZWN0aW9uIG9mIG5vdGlmaWNhdGlvbiBoYW5kbGVycyB3aGljaCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZGlzcGF0Y2hlclxuICBwcml2YXRlIF9ub3RpZmljYXRpb25IYW5kbGVyczogQXJyYXk8Tm90aWZpY2F0aW9uSGFuZGxlcj4gPSBbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lRGlzcGF0Y2hlciB3aGljaCB3aWxsIHVzZSB0aGUgZ2l2ZW4gbWVzc2VuZ2VyIHRvIGNvbW11bmljYXRlXG4gICAqIEBwYXJhbSBfbWVzc2VuZ2VyIGFuIGluc3RhbnRpYXRlZCBhbmQgbGlzdGVuaW5nIG1lc3NlbmdlciBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tZXNzZW5nZXI6IE1lc3Nlbmdlcikge1xuICAgIGlmICghdGhpcy5fbWVzc2VuZ2VyKSB7XG4gICAgICB0aHJvdyAnTWlzc2luZyBtZXNzZW5nZXIgb2JqZWN0JztcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgb3VyIG1lc3NhZ2UgaGFuZGxlcnMuIFdlIG9ubHkgY2FyZSBhYm91dCBpbmNvbWluZyBub3RpZmljYXRpb25zIGFuZCBjb21tYW5kIHJlc3BvbnNlc1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcih0aGlzLm9uQ29tbWFuZFJlc3BvbnNlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXROb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcih0aGlzLm9uTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8vLy8vIFN0YXJ0IEludGVybmFsQXBpRGlzcGF0Y2hlciBpbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIC8vIFRvIGV4ZWN1dGUgYSB2ZXJiLCB3ZSBmaXJzdCBwcmVwYXJlIGEgY29tbWFuZCBtZXNzYWdlIGFuZCB0aGVuIGRlZmluZSBhIHByb21pc2UuXG4gICAgY29uc3QgcHJlcGFyZWRNZXNzYWdlID0gdGhpcy5fbWVzc2VuZ2VyLnByZXBhcmVDb21tYW5kTWVzc2FnZSh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBTYXZlIG9mZiB0aGUgcGVuZGluZyBwcm9taXNlIGJ5IHRoZSBtZXNzYWdlR3VpZCB3ZSBhcmUgYWJvdXQgdG8gc2VuZC4gV2hlbiBhIHJlc3BvbnNlIGlzXG4gICAgICAvLyByZWNlaXZlZCwgd2UnbGwgYmUgYWJsZSB0byByZXNvbHZlIHRoaXMgcHJvbWlzZSB3aXRoIHRoZSByZXN1bHRcbiAgICAgIHRoaXMuX3BlbmRpbmdQcm9taXNlc1twcmVwYXJlZE1lc3NhZ2UubWVzc2FnZUd1aWRdID0geyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSBhbmQgcmV0dXJuIHRoZSBwcm9taXNlXG4gICAgcHJlcGFyZWRNZXNzYWdlLnNlbmQoKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgdW5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZmlsdGVyKChoKSA9PiBoICE9PSBoYW5kbGVyKTtcbiAgfVxuXG4gIC8vLy8vLyBFbmQgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uXG5cbiAgcHJpdmF0ZSBvbkNvbW1hbmRSZXNwb25zZShyZXNwb25zZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSk6IHZvaWQge1xuICAgIC8vIFdlIGdvdCBhIGNvbW1hbmQgcmVzcG9uc2UsIGxvb2sgdGhyb3VnaCB0aGUgcGVuZGluZyBwcm9taXNlcyBhbmQgcmVzb2x2ZVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9wZW5kaW5nUHJvbWlzZXMpLmluZGV4T2YocmVzcG9uc2UuY29tbWFuZEd1aWQpIDwgMCkge1xuICAgICAgcmV0dXJuOyAvLyBXZSBkb24ndCBoYXZlIGFueSByZWZlcmVuY2UgdG8gdGhpcyBjb21tYW5kLCBqdXN0IHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlID0gdGhpcy5fcGVuZGluZ1Byb21pc2VzW3Jlc3BvbnNlLmNvbW1hbmRHdWlkXTtcblxuICAgIC8vIElmIHdlIGhhdmUgYW4gZXJyb3IgZGVmaW5lZCwgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICBwZW5kaW5nUHJvbWlzZS5yZWplY3QocmVzcG9uc2UuZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgZGF0YSBkZWZpbmVkLCByZXNvbHZlIHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgIHBlbmRpbmdQcm9taXNlLnJlc29sdmUoeyByZXN1bHQ6IHJlc3BvbnNlLmRhdGEgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgb3VyIHBlbmRpbmcgcHJvbWlzZXMgb2JqZWN0XG4gICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdQcm9taXNlc1tyZXNwb25zZS5jb21tYW5kR3VpZF07XG4gIH1cblxuICBwcml2YXRlIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UpOiB2b2lkIHtcbiAgICAvLyBHbyB0aHJvdWdoIGVhY2ggbm90aWZpY2F0aW9uIGhhbmRsZXIgd2UgaGF2ZSByZWdpc3RlcmVkIGFuZCBsZXQgdGhlbSBrbm93IGEgbm90aWZpY2F0aW9uIGNhbWUgaW5cbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoeyBub3RpZmljYXRpb25JZDogbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCwgZGF0YTogbm90aWZpY2F0aW9uTWVzc2FnZS5kYXRhIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJbmNhc2Ugb2YgYSBJbmNvbXBhdGlibGVWZXJzaW9uRXJyb3IsIHJlLXRocm93IHRoZSBlcnJvci5cbiAgICAgICAgaWYgKChlIGFzIFRhYmxlYXVFcnJvcikuZXJyb3JDb2RlID09PSBFbWJlZGRpbmdFcnJvckNvZGVzLkluY29tcGF0aWJsZVZlcnNpb25FcnJvcikge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRWxzZSBJZ25vcmUgIHNvIGlmIG9uZSBoYW5kbGVyIGVycm9ycywgdGhlIG90aGVyIHN0aWxsIGdldCB0aGUgbWVzc2FnZS5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW1wbDogRGF0YVNvdXJjZUltcGwpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8Q29udHJhY3QuRmllbGQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZmllbGRzO1xuICB9XG5cbiAgcHVibGljIGdldCBleHRyYWN0VXBkYXRlVGltZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5leHRyYWN0VXBkYXRlVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeHRyYWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc0V4dHJhY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUHVibGlzaGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc1B1Ymxpc2hlZDtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoZWRVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwucHVibGlzaGVkVXJsKCk7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5yZWZyZXNoQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zb2xlLndhcm4oJ0RhdGFTb3VyY2UuZ2V0QWN0aXZlVGFibGVzQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYy4nKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0QWN0aXZlVGFibGVzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ0RhdGFTb3VyY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICcgK1xuICAgICAgICAnRGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVzQXN5bmMgYW5kIERhdGFTb3VyY2UuZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jLicsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMobG9naWNhbFRhYmxlSWQsIHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIERhdGVSYW5nZVR5cGUgYXMgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEaWFsb2dTdHlsZSBhcyBFeHRlcm5hbERpYWxvZ1N0eWxlLFxuICBGaWx0ZXJEb21haW5UeXBlIGFzIEV4dGVybmFsRG9tYWluVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSBhcyBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24gYXMgRXh0ZXJuYWxOdWxsT3B0aW9uLFxuICBTaGVldFR5cGUgYXMgRXh0ZXJuYWxTaGVldFR5cGUsXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBQZXJpb2RUeXBlLFxuICBSZXBsYXlTcGVlZFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNob3dEYXRhVGFibGVGb3JtYXQsXG4gIERhdGVTdGVwUGVyaW9kLFxuICBEYXRlUmFuZ2VUeXBlIGFzIEludGVybmFsRGF0ZVJhbmdlVHlwZSxcbiAgRGlhbG9nU3R5bGUgYXMgSW50ZXJuYWxEaWFsb2dTdHlsZSxcbiAgRmlsdGVyRG9tYWluVHlwZSBhcyBJbnRlcm5hbERvbWFpblR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUgYXMgSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLFxuICBGaWx0ZXJOdWxsT3B0aW9uIGFzIEludGVybmFsTnVsbE9wdGlvbixcbiAgU2hlZXRUeXBlIGFzIEludGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRW51bUNvbnZlcnRlciB9IGZyb20gJy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTp0eXBlZGVmIC0gRGlzYWJsZSB0aGlzIHRvIG1ha2UgZGVjbGFyaW5nIHRoZXNlIGNsYXNzZXMgYSBiaXQgZWFzaWVyICovXG4vKipcbiAqIE1hcHMgZW51bXMgdXNlZCBieSB0aGUgZXh0ZXJuYWwtYXBpLWNvbnRyYWN0IHRvIHRoZSBlbnVtcyB1c2VkXG4gKiBpbiB0aGUgaW50ZXJuYWwtYXBpLWNvbnRyYWN0LCB3aGljaCBkZXZlbG9wZXJzIGNvZGUgYWdhaW5zdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB7XG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyRG9tYWluVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRG9tYWluVHlwZSwgSW50ZXJuYWxEb21haW5UeXBlPih7XG4gICAgW0V4dGVybmFsRG9tYWluVHlwZS5SZWxldmFudF06IEludGVybmFsRG9tYWluVHlwZS5SZWxldmFudCxcbiAgICBbRXh0ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlXTogSW50ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIG51bGxPcHRpb25zID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxOdWxsT3B0aW9uLCBJbnRlcm5hbE51bGxPcHRpb24+KHtcbiAgICBbRXh0ZXJuYWxOdWxsT3B0aW9uLkFsbFZhbHVlc106IEludGVybmFsTnVsbE9wdGlvbi5BbGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk51bGxWYWx1ZXMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVXBkYXRlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSwgSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlPih7XG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGRdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkLFxuICAgIFtFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbCxcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZV06IEludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmUsXG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2UsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2V0VmlzaWJpbGl0eVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxab25lVmlzaWJpbGl0eVR5cGUsIGJvb2xlYW4+KHtcbiAgICBbWm9uZVZpc2liaWxpdHlUeXBlLlNob3ddOiB0cnVlLFxuICAgIFtab25lVmlzaWJpbGl0eVR5cGUuSGlkZV06IGZhbHNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNldFJlcGxheVNwZWVkVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFJlcGxheVNwZWVkVHlwZSwgbnVtYmVyPih7XG4gICAgLy8gdGhlc2UgbnVtYmVycyBhcmUgZHVyYXRpb24gbXVsdGlwbGllcnNcbiAgICAvLyAyLjAsIGZvciBleGFtcGxlLCBkb3VibGVzIHRoZSBkdXJhdGlvbiBvZiB0aGUgcmVwbGF5LCBzbG93aW5nIGl0IGRvd24gdG8gMC41eCBzcGVlZFxuICAgIFtSZXBsYXlTcGVlZFR5cGUuU2xvd106IDIuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLk5vcm1hbF06IDEuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLkZhc3RdOiAwLjUsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxTaGVldFR5cGUsIEludGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0V4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgIFtFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeV06IEludGVybmFsU2hlZXRUeXBlLlN0b3J5LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNob3dEYXRhVGFibGVGb3JtYXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sIEFwaVNob3dEYXRhVGFibGVGb3JtYXQ+KHtcbiAgICBbSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzXTogQXBpU2hvd0RhdGFUYWJsZUZvcm1hdC5OYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMsXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlOYXRpdmVWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0Lk5hdGl2ZVZhbHVlc09ubHksXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlGb3JtYXR0ZWRWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LkZvcm1hdHRlZFZhbHVlc09ubHksXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgcGVyaW9kVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFBlcmlvZFR5cGUsIERhdGVTdGVwUGVyaW9kPih7XG4gICAgW1BlcmlvZFR5cGUuWWVhcnNdOiBEYXRlU3RlcFBlcmlvZC5ZZWFycyxcbiAgICBbUGVyaW9kVHlwZS5RdWFydGVyc106IERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtQZXJpb2RUeXBlLk1vbnRoc106IERhdGVTdGVwUGVyaW9kLk1vbnRocyxcbiAgICBbUGVyaW9kVHlwZS5XZWVrc106IERhdGVTdGVwUGVyaW9kLldlZWtzLFxuICAgIFtQZXJpb2RUeXBlLkRheXNdOiBEYXRlU3RlcFBlcmlvZC5EYXlzLFxuICAgIFtQZXJpb2RUeXBlLkhvdXJzXTogRGF0ZVN0ZXBQZXJpb2QuSG91cnMsXG4gICAgW1BlcmlvZFR5cGUuTWludXRlc106IERhdGVTdGVwUGVyaW9kLk1pbnV0ZXMsXG4gICAgW1BlcmlvZFR5cGUuU2Vjb25kc106IERhdGVTdGVwUGVyaW9kLlNlY29uZHMsXG4gICAgW1BlcmlvZFR5cGUuSXNvWWVhcnNdOiBEYXRlU3RlcFBlcmlvZC5Jc29ZZWFycyxcbiAgICBbUGVyaW9kVHlwZS5Jc29RdWFydGVyc106IERhdGVTdGVwUGVyaW9kLklzb1F1YXJ0ZXJzLFxuICAgIFtQZXJpb2RUeXBlLklzb1dlZWtzXTogRGF0ZVN0ZXBQZXJpb2QuSXNvV2Vla3MsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVJhbmdlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRGF0ZVJhbmdlVHlwZSwgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlPih7XG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0XTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3QsXG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0Tl06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0TixcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHRdOiBJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dCxcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROLFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudF06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50LFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkaWFsb2dTdHlsZXMgPSBuZXcgRW51bUNvbnZlcnRlcjxFeHRlcm5hbERpYWxvZ1N0eWxlLCBJbnRlcm5hbERpYWxvZ1N0eWxlPih7XG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuV2luZG93XTogSW50ZXJuYWxEaWFsb2dTdHlsZS5XaW5kb3csXG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuTW9kYWxdOiBJbnRlcm5hbERpYWxvZ1N0eWxlLk1vZGFsLFxuICAgIFtFeHRlcm5hbERpYWxvZ1N0eWxlLk1vZGVsZXNzXTogSW50ZXJuYWxEaWFsb2dTdHlsZS5Nb2RlbGVzcyxcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCB7XG4gIEFubm90YXRpb25UeXBlIGFzIEV4dGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBFeHRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBFeHRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhRm9ybWF0VHlwZSBhcyBFeHRlcm5hbERhdGFGb3JtYXRUeXBlLFxuICBEYXRhVHlwZSBhcyBFeHRlcm5hbERhdGFUeXBlLFxuICBQZXJpb2RUeXBlIGFzIEV4dGVybmFsRGF0ZVBlcmlvZCxcbiAgRGF0ZVJhbmdlVHlwZSBhcyBFeHRlcm5hbERhdGVSYW5nZVR5cGUsXG4gIEVycm9yQ29kZXMgYXMgRXh0ZXJuYWxFcnJvckNvZGVzLFxuICBFeHBvcnRlZE1lZGlhVHlwZSBhcyBFeHRlcm5hbEV4cG9ydGVkTWVkaWFUeXBlLFxuICBFeHRlbnNpb25Db250ZXh0IGFzIEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUgYXMgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUgYXMgRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSBhcyBFeHRlcm5hbEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlclR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSBhcyBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIE1hcmtUeXBlIGFzIEV4dGVybmFsTWFya1R5cGUsXG4gIE5lZ2F0aXZlTnVtYmVyRm9ybWF0IGFzIEV4dGVybmFsTmVnYXRpdmVOdW1iZXJGb3JtYXQsXG4gIE51bWJlckZvcm1hdFVuaXRzIGFzIEV4dGVybmFsTnVtYmVyRm9ybWF0VW5pdHMsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSBhcyBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQW5ub3RhdGVFbnVtIGFzIEludGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBJbnRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBJbnRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhRm9ybWF0VHlwZSBhcyBJbnRlcm5hbERhdGFGb3JtYXRUeXBlLFxuICBEYXRhVHlwZSBhcyBJbnRlcm5hbERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlIGFzIEludGVybmFsRGF0ZVJhbmdlVHlwZSxcbiAgRGF0ZVN0ZXBQZXJpb2QgYXMgSW50ZXJuYWxEYXRlU3RlcFBlcmlvZCxcbiAgRG9tYWluUmVzdHJpY3Rpb25UeXBlIGFzIEludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLFxuICBFcnJvckNvZGVzIGFzIEludGVybmFsRXJyb3JDb2RlcyxcbiAgRXhwb3J0ZWRNZWRpYVR5cGUgYXMgSW50ZXJuYWxFeHBvcnRlZE1lZGlhVHlwZSxcbiAgRXh0ZW5zaW9uQ29udGV4dCBhcyBJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LFxuICBFeHRlbnNpb25Nb2RlIGFzIEludGVybmFsRXh0ZW5zaW9uc01vZGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlIGFzIEludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUgYXMgSW50ZXJuYWxGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEludGVybmFsRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSBhcyBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgYXMgSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICBNYXJrVHlwZSBhcyBJbnRlcm5hbE1hcmtUeXBlLFxuICBOZWdhdGl2ZU51bWJlckZvcm1hdCBhcyBJbnRlcm5hbE5lZ2F0aXZlTnVtYmVyRm9ybWF0LFxuICBOdW1iZXJGb3JtYXRVbml0cyBhcyBJbnRlcm5hbE51bWJlckZvcm1hdFVuaXRzLFxuICBTaGVldFR5cGUgYXMgSW50ZXJuYWxTaGVldFR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vVXRpbHMvRW51bUNvbnZlcnRlcic7XG5cbi8qIHRzbGludDpkaXNhYmxlOnR5cGVkZWYgLSBEaXNhYmxlIHRoaXMgdG8gbWFrZSBkZWNsYXJpbmcgdGhlc2UgY2xhc3NlcyBhIGJpdCBlYXNpZXIgKi9cbi8qKlxuICogTWFwcyBlbnVtcyB1c2VkIGJ5IHRoZSBpbnRlcm5hbC1hcGktY29udHJhY3QgdG8gdGhlIGVudW1zIHVzZWRcbiAqIGluIHRoZSBleHRlcm5hbC1hcGktY29udHJhY3QsIHdoaWNoIGRldmVsb3BlcnMgY29kZSBhZ2FpbnN0LlxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIHtcbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Db250ZXh0ID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dCwgRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dD4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3BdOiBFeHRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3AsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuU2VydmVyXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5TZXJ2ZXIsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljV2ViXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5QdWJsaWNXZWIsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljRGVza3RvcF06IEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljRGVza3RvcCxcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5DbG91ZF06IEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuQ2xvdWQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0YUZvcm1hdFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhdGFGb3JtYXRUeXBlLCBFeHRlcm5hbERhdGFGb3JtYXRUeXBlPih7XG4gICAgW0ludGVybmFsRGF0YUZvcm1hdFR5cGUuQXV0b0Zvcm1hdF06IEV4dGVybmFsRGF0YUZvcm1hdFR5cGUuQXV0b0Zvcm1hdCxcbiAgICBbSW50ZXJuYWxEYXRhRm9ybWF0VHlwZS5TeXN0ZW1OdW1iZXJdOiBFeHRlcm5hbERhdGFGb3JtYXRUeXBlLlN5c3RlbU51bWJlcixcbiAgICBbSW50ZXJuYWxEYXRhRm9ybWF0VHlwZS5TeXN0ZW1DdXJyZW5jeV06IEV4dGVybmFsRGF0YUZvcm1hdFR5cGUuU3lzdGVtQ3VycmVuY3ksXG4gICAgW0ludGVybmFsRGF0YUZvcm1hdFR5cGUuU3lzdGVtTG9uZ0RhdGVdOiBFeHRlcm5hbERhdGFGb3JtYXRUeXBlLlN5c3RlbUxvbmdEYXRlLFxuICAgIFtJbnRlcm5hbERhdGFGb3JtYXRUeXBlLlN5c3RlbVNob3J0RGF0ZV06IEV4dGVybmFsRGF0YUZvcm1hdFR5cGUuU3lzdGVtU2hvcnREYXRlLFxuICAgIFtJbnRlcm5hbERhdGFGb3JtYXRUeXBlLlN5c3RlbVRpbWVdOiBFeHRlcm5hbERhdGFGb3JtYXRUeXBlLlN5c3RlbVRpbWUsXG4gICAgW0ludGVybmFsRGF0YUZvcm1hdFR5cGUuQ3VzdG9tXTogRXh0ZXJuYWxEYXRhRm9ybWF0VHlwZS5DdXN0b20sXG4gICAgW0ludGVybmFsRGF0YUZvcm1hdFR5cGUuQ3VzdG9tTnVtYmVyXTogRXh0ZXJuYWxEYXRhRm9ybWF0VHlwZS5DdXN0b21OdW1iZXIsXG4gICAgW0ludGVybmFsRGF0YUZvcm1hdFR5cGUuQ3VzdG9tQ3VycmVuY3ldOiBFeHRlcm5hbERhdGFGb3JtYXRUeXBlLkN1c3RvbUN1cnJlbmN5LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIG51bWJlckZvcm1hdFVuaXRzID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxOdW1iZXJGb3JtYXRVbml0cywgRXh0ZXJuYWxOdW1iZXJGb3JtYXRVbml0cz4oe1xuICAgIFtJbnRlcm5hbE51bWJlckZvcm1hdFVuaXRzLk5vbmVdOiBFeHRlcm5hbE51bWJlckZvcm1hdFVuaXRzLk5vbmUsXG4gICAgW0ludGVybmFsTnVtYmVyRm9ybWF0VW5pdHMuVGhvdXNhbmRzXTogRXh0ZXJuYWxOdW1iZXJGb3JtYXRVbml0cy5UaG91c2FuZHMsXG4gICAgW0ludGVybmFsTnVtYmVyRm9ybWF0VW5pdHMuTWlsbGlvbnNdOiBFeHRlcm5hbE51bWJlckZvcm1hdFVuaXRzLk1pbGxpb25zLFxuICAgIFtJbnRlcm5hbE51bWJlckZvcm1hdFVuaXRzLkJpbGxpb25zRW5nbGlzaF06IEV4dGVybmFsTnVtYmVyRm9ybWF0VW5pdHMuQmlsbGlvbnNFbmdsaXNoLFxuICAgIFtJbnRlcm5hbE51bWJlckZvcm1hdFVuaXRzLkJpbGxpb25zU3RhbmRhcmRdOiBFeHRlcm5hbE51bWJlckZvcm1hdFVuaXRzLkJpbGxpb25zU3RhbmRhcmQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgbmVnYXRpdmVOdW1iZXJGb3JtYXQgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbE5lZ2F0aXZlTnVtYmVyRm9ybWF0LCBFeHRlcm5hbE5lZ2F0aXZlTnVtYmVyRm9ybWF0Pih7XG4gICAgW0ludGVybmFsTmVnYXRpdmVOdW1iZXJGb3JtYXQuQXV0b21hdGljXTogRXh0ZXJuYWxOZWdhdGl2ZU51bWJlckZvcm1hdC5BdXRvbWF0aWMsXG4gICAgW0ludGVybmFsTmVnYXRpdmVOdW1iZXJGb3JtYXQuUGFyZW50aGVzZXNdOiBFeHRlcm5hbE5lZ2F0aXZlTnVtYmVyRm9ybWF0LlBhcmVudGhlc2VzLFxuICAgIFtJbnRlcm5hbE5lZ2F0aXZlTnVtYmVyRm9ybWF0Lk91dGVyUHJlZml4XTogRXh0ZXJuYWxOZWdhdGl2ZU51bWJlckZvcm1hdC5PdXRlclByZWZpeCxcbiAgICBbSW50ZXJuYWxOZWdhdGl2ZU51bWJlckZvcm1hdC5PdXRlclN1ZmZpeF06IEV4dGVybmFsTmVnYXRpdmVOdW1iZXJGb3JtYXQuT3V0ZXJTdWZmaXgsXG4gICAgW0ludGVybmFsTmVnYXRpdmVOdW1iZXJGb3JtYXQuSW5uZXJQcmVmaXhdOiBFeHRlcm5hbE5lZ2F0aXZlTnVtYmVyRm9ybWF0LklubmVyUHJlZml4LFxuICAgIFtJbnRlcm5hbE5lZ2F0aXZlTnVtYmVyRm9ybWF0LklubmVyU3VmZml4XTogRXh0ZXJuYWxOZWdhdGl2ZU51bWJlckZvcm1hdC5Jbm5lclN1ZmZpeCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Nb2RlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zTW9kZSwgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZT4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNNb2RlLkF1dGhvcmluZ106IEV4dGVybmFsRXh0ZW5zaW9uc01vZGUuQXV0aG9yaW5nLFxuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNNb2RlLlZpZXdpbmddOiBFeHRlcm5hbEV4dGVuc2lvbnNNb2RlLlZpZXdpbmcsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZXhwb3J0ZWRNZWRpYVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEV4cG9ydGVkTWVkaWFUeXBlLCBFeHRlcm5hbEV4cG9ydGVkTWVkaWFUeXBlPih7XG4gICAgW0ludGVybmFsRXhwb3J0ZWRNZWRpYVR5cGUuSW1hZ2VdOiBFeHRlcm5hbEV4cG9ydGVkTWVkaWFUeXBlLkltYWdlLFxuICAgIFtJbnRlcm5hbEV4cG9ydGVkTWVkaWFUeXBlLlBkZl06IEV4dGVybmFsRXhwb3J0ZWRNZWRpYVR5cGUuUGRmLFxuICAgIFtJbnRlcm5hbEV4cG9ydGVkTWVkaWFUeXBlLlN2Z106IEV4dGVybmFsRXhwb3J0ZWRNZWRpYVR5cGUuU3ZnLFxuICAgIFtJbnRlcm5hbEV4cG9ydGVkTWVkaWFUeXBlLkh0bWxdOiBFeHRlcm5hbEV4cG9ydGVkTWVkaWFUeXBlLkh0bWwsXG4gICAgW0ludGVybmFsRXhwb3J0ZWRNZWRpYVR5cGUuUG93ZXJQb2ludF06IEV4dGVybmFsRXhwb3J0ZWRNZWRpYVR5cGUuUG93ZXJQb2ludCxcbiAgICBbSW50ZXJuYWxFeHBvcnRlZE1lZGlhVHlwZS5FeGNlbF06IEV4dGVybmFsRXhwb3J0ZWRNZWRpYVR5cGUuRXhjZWwsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgY29sdW1uVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsQ29sdW1uVHlwZSwgRXh0ZXJuYWxDb2x1bW5UeXBlPih7XG4gICAgW0ludGVybmFsQ29sdW1uVHlwZS5Db250aW51b3VzXTogRXh0ZXJuYWxDb2x1bW5UeXBlLkNvbnRpbnVvdXMsXG4gICAgW0ludGVybmFsQ29sdW1uVHlwZS5EaXNjcmV0ZV06IEV4dGVybmFsQ29sdW1uVHlwZS5EaXNjcmV0ZSxcbiAgICBbSW50ZXJuYWxDb2x1bW5UeXBlLlVua25vd25dOiBFeHRlcm5hbENvbHVtblR5cGUuVW5rbm93bixcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWVsZEFnZ3JlZ2F0aW9uVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUsIEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdHRyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdHRyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkF2Z106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXZnLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvbGxlY3RdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvbGxlY3QsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQ291bnRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50ZF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQ291bnRkLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkRheV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuRGF5LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkVuZF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuRW5kLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkhvdXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkhvdXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuSW5PdXRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkluT3V0LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkt1cnRvc2lzXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5LdXJ0b3NpcyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NYXhdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1heCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZHldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1keSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZWRpYW5dOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1lZGlhbixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW5dOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1pbixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW51dGVdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1pbnV0ZSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Nb250aFllYXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1vbnRoWWVhcixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ob25lXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ob25lLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXRyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXVhcnQxLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0M106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXVhcnQzLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNlY29uZF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2Vjb25kLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNrZXduZXNzXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ta2V3bmVzcyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdGRldl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXYsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZwXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdGRldnAsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3VtXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdW0sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNEYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jRGF5LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jSG91cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNIb3VyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jTWludXRlXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY01pbnV0ZSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY01vbnRoXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY01vbnRoLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jUXRyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1F0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1NlY29uZF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNTZWNvbmQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNXZWVrXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1dlZWssXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNZZWFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1llYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVXNlcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVXNlcixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5WYXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlZhcixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5WYXJwXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5WYXJwLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWssXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuV2Vla2RheV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuV2Vla2RheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5ZZWFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5ZZWFyLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGZpZWxkUm9sZVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpZWxkUm9sZVR5cGUsIEV4dGVybmFsRmllbGRSb2xlVHlwZT4oe1xuICAgIFtJbnRlcm5hbEZpZWxkUm9sZVR5cGUuRGltZW5zaW9uXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLkRpbWVuc2lvbixcbiAgICBbSW50ZXJuYWxGaWVsZFJvbGVUeXBlLk1lYXN1cmVdOiBFeHRlcm5hbEZpZWxkUm9sZVR5cGUuTWVhc3VyZSxcbiAgICBbSW50ZXJuYWxGaWVsZFJvbGVUeXBlLlVua25vd25dOiBFeHRlcm5hbEZpZWxkUm9sZVR5cGUuVW5rbm93bixcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBzaGVldFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbFNoZWV0VHlwZSwgRXh0ZXJuYWxTaGVldFR5cGU+KHtcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuRGFzaGJvYXJkXTogRXh0ZXJuYWxTaGVldFR5cGUuRGFzaGJvYXJkLFxuICAgIFtJbnRlcm5hbFNoZWV0VHlwZS5TdG9yeV06IEV4dGVybmFsU2hlZXRUeXBlLlN0b3J5LFxuICAgIFtJbnRlcm5hbFNoZWV0VHlwZS5Xb3Jrc2hlZXRdOiBFeHRlcm5hbFNoZWV0VHlwZS5Xb3Jrc2hlZXQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGFzaGJvYXJkT2JqZWN0VHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZSwgRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlPih7XG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5FeHRlbnNpb25dOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuRXh0ZW5zaW9uLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuQmxhbmtdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuQmxhbmssXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5JbWFnZV06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5JbWFnZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkxlZ2VuZF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5MZWdlbmQsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYWdlRmlsdGVyXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlBhZ2VGaWx0ZXIsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYXJhbWV0ZXJDb250cm9sXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlBhcmFtZXRlckNvbnRyb2wsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5RdWlja0ZpbHRlcl06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5RdWlja0ZpbHRlcixcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRleHRdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuVGV4dCxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRpdGxlXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRpdGxlLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV2ViUGFnZV06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5XZWJQYWdlLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV29ya3NoZWV0XTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRhVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0YVR5cGUsIEV4dGVybmFsRGF0YVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5Cb29sXTogRXh0ZXJuYWxEYXRhVHlwZS5Cb29sLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkRhdGVdOiBFeHRlcm5hbERhdGFUeXBlLkRhdGUsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuRGF0ZVRpbWVdOiBFeHRlcm5hbERhdGFUeXBlLkRhdGVUaW1lLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkZsb2F0XTogRXh0ZXJuYWxEYXRhVHlwZS5GbG9hdCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5JbnRdOiBFeHRlcm5hbERhdGFUeXBlLkludCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5TcGF0aWFsXTogRXh0ZXJuYWxEYXRhVHlwZS5TcGF0aWFsLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLlN0cmluZ106IEV4dGVybmFsRGF0YVR5cGUuU3RyaW5nLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGZpbHRlclVwZGF0ZVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZT4oe1xuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkXTogRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFkZCxcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbF06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BbGwsXG4gICAgW0ludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmVdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVtb3ZlLFxuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVwbGFjZV06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGFsbG93YWJsZVZhbHVlcyA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLCBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZT4oe1xuICAgIFtJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZS5BbGxdOiBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZS5BbGwsXG4gICAgW0ludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLkxpc3RdOiBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZS5MaXN0LFxuICAgIFtJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZS5SYW5nZV06IEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlLlJhbmdlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhdGVTdGVwUGVyaW9kID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxEYXRlU3RlcFBlcmlvZCwgRXh0ZXJuYWxEYXRlUGVyaW9kPih7XG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuWWVhcnNdOiBFeHRlcm5hbERhdGVQZXJpb2QuWWVhcnMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuUXVhcnRlcnNdOiBFeHRlcm5hbERhdGVQZXJpb2QuUXVhcnRlcnMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuTW9udGhzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLk1vbnRocyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5XZWVrc106IEV4dGVybmFsRGF0ZVBlcmlvZC5XZWVrcyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5EYXlzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLkRheXMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuSG91cnNdOiBFeHRlcm5hbERhdGVQZXJpb2QuSG91cnMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuTWludXRlc106IEV4dGVybmFsRGF0ZVBlcmlvZC5NaW51dGVzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlNlY29uZHNdOiBFeHRlcm5hbERhdGVQZXJpb2QuU2Vjb25kcyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5Jc29ZZWFyc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Jc29ZZWFycyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5Jc29RdWFydGVyc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Jc29RdWFydGVycyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5Jc29XZWVrc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Jc29XZWVrcyxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRlUmFuZ2VUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxEYXRlUmFuZ2VUeXBlLCBFeHRlcm5hbERhdGVSYW5nZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkN1cnJlbnRdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3RdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTGFzdCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3ROXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3ROLFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dF06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5OZXh0LFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dE5dOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dE4sXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5Ub0RhdGVdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGVycm9yQ29kZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRXJyb3JDb2RlcywgRXh0ZXJuYWxFcnJvckNvZGVzPihcbiAgICB7XG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLklOSVRJQUxJWkFUSU9OX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLklOVEVSTkFMX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLk1JU1NJTkdfRU5VTV9NQVBQSU5HXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLk1JU1NJTkdfUEFSQU1FVEVSXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlBFUk1JU1NJT05fREVOSUVEXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlBSRVNfTU9ERUxfUEFSU0lOR19FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5VTktOT1dOX1ZFUkJfSURdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuVkVSU0lPTl9OT1RfQ09ORklHVVJFRF06IEV4dGVybmFsRXJyb3JDb2Rlcy5BUElOb3RJbml0aWFsaXplZCxcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuVklTSUJJTElUWV9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5WaXNpYmlsaXR5RXJyb3IsXG4gICAgfSxcbiAgICBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgKTtcblxuICBwdWJsaWMgc3RhdGljIGZpbHRlclR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpbHRlclR5cGUsIEV4dGVybmFsRmlsdGVyVHlwZT4oe1xuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuQ2F0ZWdvcmljYWxdOiBFeHRlcm5hbEZpbHRlclR5cGUuQ2F0ZWdvcmljYWwsXG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5SYW5nZV06IEV4dGVybmFsRmlsdGVyVHlwZS5SYW5nZSxcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZV06IEV4dGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGUsXG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5IaWVyYXJjaGljYWxdOiBFeHRlcm5hbEZpbHRlclR5cGUuSGllcmFyY2hpY2FsLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGNsYXNzTmFtZUtleSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsQ2xhc3NOYW1lS2V5LCBFeHRlcm5hbENsYXNzTmFtZUtleT4oe1xuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZV06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LkRhc2hib2FyZFRpdGxlLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5TdG9yeVRpdGxlXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuU3RvcnlUaXRsZSxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuVG9vbHRpcF06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXAsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldF06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldCxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0VGl0bGVdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRUaXRsZSxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuUGFuZV06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlBhbmUsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuUm93RGl2aWRlcnMsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LkNvbHVtbkRpdmlkZXJzXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuQ29sdW1uRGl2aWRlcnMsXG4gICAgLy8gVGVtcG9yYXJ5IHVudGlsIHdlIGZpeCAxMzE3MjY2IC0gUGxhdGZvcm0gaGFzbid0IGJlZW4gdXBkYXRlZCBjdXJyZW50bHkgYmVjYXVzZSBuZWFyIGJyYW5jaCBpcyBjbG9zZWRcbiAgICBbJ2Rhc2hib2FyZC10aXRsZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZSxcbiAgICBbJ3N0b3J5LXRpdGxlJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlN0b3J5VGl0bGUsXG4gICAgWyd0b29sdGlwJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXAsXG4gICAgWyd3b3Jrc2hlZXQnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0LFxuICAgIFsnd29ya3NoZWV0LXRpdGxlJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldFRpdGxlLFxuICAgIFsncGFuZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5QYW5lLFxuICAgIFsncm93LWRpdmlkZXJzJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzLFxuICAgIFsnY29sdW1uLWRpdmlkZXJzJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LkNvbHVtbkRpdmlkZXJzLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgPSBuZXcgRW51bUNvbnZlcnRlcjxcbiAgICBJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gICAgRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlXG4gID4oe1xuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuQWxsU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuQWxsU2VsZWN0ZWQsXG4gICAgW0ludGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Ob25lU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuTm9uZVNlbGVjdGVkLFxuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuU29tZVNlbGVjdGVkXTogRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlNvbWVTZWxlY3RlZCxcbiAgICBbSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlVua25vd25TZWxlY3RlZF06IEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Vbmtub3duU2VsZWN0ZWQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgYW5ub3RhdGlvblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEFubm90YXRpb25UeXBlLCBFeHRlcm5hbEFubm90YXRpb25UeXBlPih7XG4gICAgW0ludGVybmFsQW5ub3RhdGlvblR5cGUuQXJlYV06IEV4dGVybmFsQW5ub3RhdGlvblR5cGUuQXJlYSxcbiAgICBbSW50ZXJuYWxBbm5vdGF0aW9uVHlwZS5NYXJrXTogRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZS5NYXJrLFxuICAgIFtJbnRlcm5hbEFubm90YXRpb25UeXBlLlBvaW50XTogRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZS5Qb2ludCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBtYXJrVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsTWFya1R5cGUsIEV4dGVybmFsTWFya1R5cGU+KHtcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5BcmVhXTogRXh0ZXJuYWxNYXJrVHlwZS5BcmVhLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkJhcl06IEV4dGVybmFsTWFya1R5cGUuQmFyLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkNpcmNsZV06IEV4dGVybmFsTWFya1R5cGUuQ2lyY2xlLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkdhbnR0QmFyXTogRXh0ZXJuYWxNYXJrVHlwZS5HYW50dEJhcixcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5IZWF0bWFwXTogRXh0ZXJuYWxNYXJrVHlwZS5IZWF0bWFwLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkxpbmVdOiBFeHRlcm5hbE1hcmtUeXBlLkxpbmUsXG4gICAgW0ludGVybmFsTWFya1R5cGUuTWFwXTogRXh0ZXJuYWxNYXJrVHlwZS5NYXAsXG4gICAgW0ludGVybmFsTWFya1R5cGUuUGllXTogRXh0ZXJuYWxNYXJrVHlwZS5QaWUsXG4gICAgW0ludGVybmFsTWFya1R5cGUuUG9seWdvbl06IEV4dGVybmFsTWFya1R5cGUuUG9seWdvbixcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5TaGFwZV06IEV4dGVybmFsTWFya1R5cGUuU2hhcGUsXG4gICAgW0ludGVybmFsTWFya1R5cGUuU3F1YXJlXTogRXh0ZXJuYWxNYXJrVHlwZS5TcXVhcmUsXG4gICAgW0ludGVybmFsTWFya1R5cGUuVGV4dF06IEV4dGVybmFsTWFya1R5cGUuVGV4dCxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5WaXpFeHRlbnNpb25dOiBFeHRlcm5hbE1hcmtUeXBlLlZpekV4dGVuc2lvbixcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlciB9IGZyb20gJy4vU2luZ2xlRXZlbnRNYW5hZ2VyJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vVGFibGVhdUVycm9yJztcblxuLyoqXG4gKiBDbGFzcyBkZXNpZ25lZCB0byByZWdpc3RlciBhbmQgdW5yZWdpc3RlciBoYW5kbGVycyBmcm9tIGEgdXNlci4gT25seSB0aG9zZSBldmVudHNcbiAqIHdoaWNoIGFyZSBhZGRlZCB2aWEgQWRkTmV3RXZlbnRUeXBlIHdpbGwgYmUgc3VwcG9ydGVkIGJ5IHRoaXMgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgQ29udHJhY3QuRXZlbnRMaXN0ZW5lck1hbmFnZXIge1xuICBwcml2YXRlIF9ldmVudExpc3RlbmVyTWFuYWdlcnM6IHsgW3RhYmxlYXVFdmVudFR5cGU6IHN0cmluZ106IFNpbmdsZUV2ZW50TWFuYWdlciB9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnMgPSB7fTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZSwgaGFuZGxlcjogQ29udHJhY3QuVGFibGVhdUV2ZW50SGFuZGxlckZuKTogQ29udHJhY3QuVGFibGVhdUV2ZW50VW5yZWdpc3RlckZuIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudFR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuVW5zdXBwb3J0ZWRFdmVudE5hbWUsIGBDYW5ub3QgYWRkIGV2ZW50LCB1bnN1cHBvcnRlZCBldmVudCB0eXBlOiAke2V2ZW50VHlwZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzW2V2ZW50VHlwZV0uYWRkRXZlbnRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZSwgaGFuZGxlcjogQ29udHJhY3QuVGFibGVhdUV2ZW50SGFuZGxlckZuKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnMuaGFzT3duUHJvcGVydHkoZXZlbnRUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLlVuc3VwcG9ydGVkRXZlbnROYW1lLCBgQ2Fubm90IHJlbW92ZSBldmVudCwgdW5zdXBwb3J0ZWQgZXZlbnQgdHlwZTogJHtldmVudFR5cGV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vyc1tldmVudFR5cGVdLnJlbW92ZUV2ZW50TGlzdGVuZXIoaGFuZGxlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkTmV3RXZlbnRUeXBlKGV2ZW50TWFuYWdlcjogU2luZ2xlRXZlbnRNYW5hZ2VyKTogdm9pZCB7XG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzW2V2ZW50TWFuYWdlci5ldmVudFR5cGVdID0gZXZlbnRNYW5hZ2VyO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29sdW1uVHlwZSwgRGF0YVR5cGUsIEZpZWxkQWdncmVnYXRpb25UeXBlLCBGaWVsZFJvbGVUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEZpZWxkSW1wbCB9IGZyb20gJy4vSW1wbC9GaWVsZEltcGwnO1xuXG5leHBvcnQgY2xhc3MgRmllbGQgaW1wbGVtZW50cyBDb250cmFjdC5GaWVsZCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9maWVsZEltcGw6IEZpZWxkSW1wbCkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBEYXRhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5kYXRhVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWdncmVnYXRpb24oKTogRmllbGRBZ2dyZWdhdGlvblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuYWdncmVnYXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5kYXRhU291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldCByb2xlKCk6IEZpZWxkUm9sZVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwucm9sZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1uVHlwZSgpOiBDb2x1bW5UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmNvbHVtblR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ2FsY3VsYXRlZEZpZWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNDYWxjdWxhdGVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ29tYmluZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzQ29tYmluZWRGaWVsZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW5lcmF0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0dlbmVyYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW9zcGF0aWFsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNHZW9zcGF0aWFsO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzSGlkZGVuO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbWFudGljUm9sZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuc2VtYW50aWNSb2xlO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhRm9ybWF0KCk6IENvbnRyYWN0LkRhdGFGb3JtYXQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuZGF0YUZvcm1hdDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ3VzdG9tVmlld01vZGVsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzLCBWaXpTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vQXBpU2hhcmVkJztcbmV4cG9ydCBjbGFzcyBDdXN0b21WaWV3SW1wbCB7XG4gIHByaXZhdGUgX2x1aWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIF9zaGFyZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX2lzRGVmYXVsdDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfb3duZXJOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgX3VybDogc3RyaW5nO1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgY3VzdG9tVmlld01vZGVsOiBDdXN0b21WaWV3TW9kZWwsXG4gICAgcHJpdmF0ZSBfcmVnaXN0cnlJZDogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLl9sdWlkID0gY3VzdG9tVmlld01vZGVsLmx1aWQ7XG4gICAgdGhpcy5fbmFtZSA9IGN1c3RvbVZpZXdNb2RlbC5uYW1lO1xuICAgIHRoaXMuX3NoYXJlZCA9IGN1c3RvbVZpZXdNb2RlbC5zaGFyZWQ7XG4gICAgdGhpcy5faXNEZWZhdWx0ID0gY3VzdG9tVmlld01vZGVsLmlzRGVmYXVsdDtcbiAgICB0aGlzLl9vd25lck5hbWUgPSBjdXN0b21WaWV3TW9kZWwub3duZXIudXNlckZyaWVuZGx5TmFtZTtcbiAgICB0aGlzLl91cmwgPSBjdXN0b21WaWV3TW9kZWwudXJsO1xuICB9XG5cbiAgcHVibGljIGdldCBsdWlkKCkge1xuICAgIHJldHVybiB0aGlzLl9sdWlkO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIHNldCBuYW1lKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSBuYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGFyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoYXJlZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2hhcmVkKHNoYXJlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX3NoYXJlZCA9IHNoYXJlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNEZWZhdWx0KCkge1xuICAgIHJldHVybiB0aGlzLl9pc0RlZmF1bHQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGlzRGVmYXVsdChpc0RlZmF1bHQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0RlZmF1bHQgPSBpc0RlZmF1bHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG93bmVyTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fb3duZXJOYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCB1cmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQXN5bmMoKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Vml6U2VydmljZT4oU2VydmljZU5hbWVzLlZpeik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2F2ZUFzeW5jKHRoaXMpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzLFxuICBFcnJvckNvZGVzLFxuICBTaGFyZWRFcnJvckNvZGVzLFxuICBTaGVldFR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RUeXBlLCBEYXNoYm9hcmRab25lLCBTaGVldFBhdGgsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi9Qb2ludCc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvQW5pbWF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRmlsdGVyU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBab25lU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1pvbmVTZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4vRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL1NoZWV0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcbmltcG9ydCB7IFN0b3J5UG9pbnRJbXBsIH0gZnJvbSAnLi9TdG9yeVBvaW50SW1wbCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRJbXBsIH0gZnJvbSAnLi9Xb3Jrc2hlZXRJbXBsJztcblxuZXhwb3J0IGNsYXNzIERhc2hib2FyZEltcGwgZXh0ZW5kcyBTaGVldEltcGwge1xuICBwcml2YXRlIF93b3Jrc2hlZXRzSW1wbDogQXJyYXk8V29ya3NoZWV0SW1wbD47XG4gIHByaXZhdGUgX29iamVjdHM6IEFycmF5PERhc2hib2FyZE9iamVjdEltcGw+O1xuICBwcml2YXRlIHpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBfc2hlZXRJbmZvOiBTaGVldEluZm9JbXBsLFxuICAgIHByaXZhdGUgX3pvbmVzOiBBcnJheTxEYXNoYm9hcmRab25lPixcbiAgICBwcml2YXRlIF9zaGVldFBhdGg6IFNoZWV0UGF0aCxcbiAgICBfcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX3BhcmVudFN0b3J5UG9pbnRJbXBsOiBTdG9yeVBvaW50SW1wbCB8IG51bGwsXG4gICAgcHJpdmF0ZSBfYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQ6IG51bWJlciA9IDAsXG4gICkge1xuICAgIHN1cGVyKF9zaGVldEluZm8sIF9yZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0c0ltcGwoKTogQXJyYXk8V29ya3NoZWV0SW1wbD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRzSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb2JqZWN0cygpOiBBcnJheTxEYXNoYm9hcmRPYmplY3RJbXBsPiB7XG4gICAgcmV0dXJuIHRoaXMuX29iamVjdHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudFN0b3J5UG9pbnQoKTogU3RvcnlQb2ludEltcGwgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50U3RvcnlQb2ludEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZURhc2hib2FyZE9iamVjdElkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZURhc2hib2FyZE9iamVjdElkO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVEYXNoYm9hcmROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0UGF0aC5zaGVldE5hbWU7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKCk6IHZvaWQge1xuICAgIHRoaXMuX3dvcmtzaGVldHNJbXBsID0gbmV3IEFycmF5PFdvcmtzaGVldEltcGw+KCk7XG4gICAgdGhpcy5fb2JqZWN0cyA9IG5ldyBBcnJheTxEYXNoYm9hcmRPYmplY3RJbXBsPigpO1xuICAgIHRoaXMuem9uZU1hcCA9IG5ldyBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPigpO1xuXG4gICAgLy8gUHJvY2VzcyBhbGwgdGhlIHpvbmVzIHdoaWNoIGFyZSBjb250YWluZWQgaW4gdGhpcyBkYXNoYm9hcmRcbiAgICBmb3IgKGNvbnN0IHpvbmUgb2YgdGhpcy5fem9uZXMpIHtcbiAgICAgIGxldCB3b3Jrc2hlZXRJbXBsOiBXb3Jrc2hlZXRJbXBsIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCB6b25lU2l6ZTogQ29udHJhY3QuU2l6ZSA9IHsgd2lkdGg6IHpvbmUud2lkdGgsIGhlaWdodDogem9uZS5oZWlnaHQgfTtcbiAgICAgIC8vIEFzIHRoZSBkYXNoYm9hcmQgaXMgYWN0aXZlLCBhbGwgb3RoZXIgem9uZXMgaW4gdGhlIGRhc2hib2FyZCBhcmUgaW5hY3RpdmUuXG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICBpZiAoem9uZS56b25lVHlwZSA9PT0gRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQgfHwgem9uZS56b25lVHlwZSA9PT0gRGFzaGJvYXJkT2JqZWN0VHlwZS5RdWlja0ZpbHRlcikge1xuICAgICAgICBsZXQgd29ya3NoZWV0TmFtZSA9ICcnO1xuICAgICAgICBsZXQgd29ya3NoZWV0VXJsID0gJyc7XG4gICAgICAgIGxldCBpc0hpZGRlbiA9IGZhbHNlO1xuICAgICAgICBpZiAoem9uZS5zaGVldEluZm8pIHtcbiAgICAgICAgICAvLyB6b25lLnNoZWV0SW5mbyB3YXMgbm90IGluaXRpYWxpemVkIHByaW9yIHRvIGludGVybmFsLWNvbnRyYWN0IDEuNi4wXG4gICAgICAgICAgd29ya3NoZWV0TmFtZSA9IHpvbmUuc2hlZXRJbmZvLm5hbWU7XG5cbiAgICAgICAgICAvLyB3b3Jrc2hlZXRVcmwgJiBpc0hpZGRlbiBpcyBmb3IgRW1iZWRkaW5nIG9ubHlcbiAgICAgICAgICB3b3Jrc2hlZXRVcmwgPSB6b25lLnNoZWV0SW5mby51cmwgfHwgJyc7XG4gICAgICAgICAgLy8gSWYgdGhlcmUncyBhIHVybCwgdGhlbiBpdCdzIG5vdCBoaWRkZW5cbiAgICAgICAgICBpc0hpZGRlbiA9IHdvcmtzaGVldFVybCA9PT0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd29ya3NoZWV0TmFtZSA9IHpvbmUubmFtZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbmRleGVzLCBpc0FjdGl2ZSBhbmQgc29tZSBtb3JlIHByb3BlcnRpZXMgaW4gc2hlZXRJbmZvSW1wbCBhcmUgZW1iZWRkaW5nIHNwZWNpZmljLlxuICAgICAgICAvLyBCdXQgd2UgaW5pdCB0aGVtIGZvciBib3RoIGV4dGVuc2lvbnMgYW5kIGVtYmVkZGluZyBhcyB0aGUgTW9kZWxzIHdpbGwgb25seSB1c2Ugd2hhdCBpcyByZWxldmFudC5cbiAgICAgICAgY29uc3Qgc2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKFxuICAgICAgICAgIHdvcmtzaGVldE5hbWUsXG4gICAgICAgICAgU2hlZXRUeXBlLldvcmtzaGVldCxcbiAgICAgICAgICB6b25lU2l6ZSxcbiAgICAgICAgICB0aGlzLl93b3Jrc2hlZXRzSW1wbC5sZW5ndGgsXG4gICAgICAgICAgaXNBY3RpdmUsXG4gICAgICAgICAgaXNIaWRkZW4sXG4gICAgICAgICAgd29ya3NoZWV0VXJsLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHZpeklkOiBWaXN1YWxJZCA9IHtcbiAgICAgICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgICAgICAgZGFzaGJvYXJkOiB0aGlzLl9zaGVldEluZm9JbXBsLm5hbWUsXG4gICAgICAgICAgc3Rvcnlib2FyZDogdGhpcy5fc2hlZXRQYXRoLnN0b3J5Ym9hcmQsXG4gICAgICAgICAgZmxpcGJvYXJkWm9uZUlEOiB0aGlzLl9zaGVldFBhdGguZmxpcGJvYXJkWm9uZUlELFxuICAgICAgICAgIHN0b3J5UG9pbnRJRDogdGhpcy5fc2hlZXRQYXRoLnN0b3J5UG9pbnRJRCxcbiAgICAgICAgfTtcblxuICAgICAgICB3b3Jrc2hlZXRJbXBsID0gbmV3IFdvcmtzaGVldEltcGwoc2hlZXRJbmZvSW1wbCwgdGhpcy5fcmVnaXN0cnlJZCwgdml6SWQsIHRoaXMsIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsKTtcbiAgICAgICAgaWYgKHpvbmUuem9uZVR5cGUgPT09IERhc2hib2FyZE9iamVjdFR5cGUuV29ya3NoZWV0KSB7XG4gICAgICAgICAgdGhpcy5fd29ya3NoZWV0c0ltcGwucHVzaCh3b3Jrc2hlZXRJbXBsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB6b25lUG9pbnQgPSBuZXcgUG9pbnQoem9uZS54LCB6b25lLnkpO1xuXG4gICAgICBjb25zdCBkYXNoYm9hcmRPYmplY3RJbXBsID0gbmV3IERhc2hib2FyZE9iamVjdEltcGwoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXNoYm9hcmRPYmplY3RUeXBlLmNvbnZlcnQoem9uZS56b25lVHlwZSksXG4gICAgICAgIHpvbmVQb2ludCxcbiAgICAgICAgem9uZVNpemUsXG4gICAgICAgIHdvcmtzaGVldEltcGwsXG4gICAgICAgIHpvbmUubmFtZSxcbiAgICAgICAgem9uZS5pc0Zsb2F0aW5nICE9PSB1bmRlZmluZWQgPyB6b25lLmlzRmxvYXRpbmcgOiBmYWxzZSwgLy8gYmVmb3JlIDEuNi4wIHdlIGRpZG4ndCBoYXZlIGlzRmxvYXRpbmcsIHNvIHdlIGFzc3VtZSBmYWxzZVxuICAgICAgICB6b25lLmlzVmlzaWJsZSAhPT0gdW5kZWZpbmVkID8gem9uZS5pc1Zpc2libGUgOiB0cnVlLCAvLyBiZWZvcmUgMS42LjAgd2UgZGlkbid0IGhhdmUgaXNWaXNpYmxlLCBzbyB3ZSBhc3N1bWUgdHJ1ZVxuICAgICAgICB6b25lLnpvbmVJZCxcbiAgICAgICAgem9uZS5maWVsZElkLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5fb2JqZWN0cy5wdXNoKGRhc2hib2FyZE9iamVjdEltcGwpO1xuICAgICAgdGhpcy56b25lTWFwLnNldCh6b25lLnpvbmVJZCwgZGFzaGJvYXJkT2JqZWN0SW1wbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlBc3luYyhkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwIHwgb2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgem9uZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Wm9uZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5ab25lKTtcblxuICAgIHJldHVybiB6b25lU2VydmljZS5zZXRWaXNpYmlsaXR5QXN5bmMoLypEYXNoYm9hcmQgTmFtZSovIHRoaXMubmFtZSwgdGhpcy56b25lTWFwLCBkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXNoYm9hcmRPYmplY3RCeUlkKGRhc2hib2FyZE9iamVjdElkOiBudW1iZXIpOiBEYXNoYm9hcmRPYmplY3RJbXBsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy56b25lTWFwLmdldChkYXNoYm9hcmRPYmplY3RJZCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlWm9uZXMobmV3Wm9uZXM6IEFycmF5PERhc2hib2FyZFpvbmU+LCBuZXdBY3RpdmVab25lSWQgPSAwLCBuZXdBY3RpdmVEYXNoYm9hcmROYW1lID0gJycpOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzIHtcbiAgICAvLyBnZXR0aW5nIHByZXZpb3VzIGRhc2hib2FyZCBvYmplY3RzLCBhY3RpdmUgem9uZSBJRCBhbmQgYWN0aXZlIGRhc2hib2FyZCBuYW1lXG4gICAgY29uc3Qgb2xkRGFzaGJvYXJkT2JqZWN0cyA9IHRoaXMuX29iamVjdHM7XG4gICAgY29uc3Qgb2xkWm9uZU1hcCA9IHRoaXMuem9uZU1hcDtcbiAgICBjb25zdCBvbGRBY3RpdmVab25lSWQgPSB0aGlzLl9hY3RpdmVEYXNoYm9hcmRPYmplY3RJZDtcbiAgICBjb25zdCBvbGRBY3RpdmVEYXNoYm9hcmROYW1lID0gdGhpcy5fc2hlZXRQYXRoLnNoZWV0TmFtZTtcbiAgICAvLyB1cGRhdGluZyB6b25lcyBhbmQgcmVpbml0aWFsaXppbmcgaW5zdGFuY2UgdmFyaWFibGVzXG4gICAgdGhpcy5fem9uZXMgPSBuZXdab25lcztcbiAgICB0aGlzLl9hY3RpdmVEYXNoYm9hcmRPYmplY3RJZCA9IG5ld0FjdGl2ZVpvbmVJZDtcbiAgICBpZiAobmV3QWN0aXZlRGFzaGJvYXJkTmFtZSkge1xuICAgICAgdGhpcy5fc2hlZXRQYXRoLnNoZWV0TmFtZSA9IG5ld0FjdGl2ZURhc2hib2FyZE5hbWU7XG4gICAgICB0aGlzLl9zaGVldEluZm9JbXBsLm5hbWUgPSBuZXdBY3RpdmVEYXNoYm9hcmROYW1lO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcygpO1xuICAgIC8vIGdldHRpbmcgbmV3IGRhc2hib2FyZCBvYmplY3RzXG4gICAgY29uc3QgbmV3RGFzaGJvYXJkT2JqZWN0cyA9IHRoaXMuX29iamVjdHM7XG4gICAgY29uc3QgbmV3Wm9uZU1hcCA9IHRoaXMuem9uZU1hcDtcbiAgICAvLyBpbml0aWFsaXppbmcgbWFwIGZvciBjaGFuZ2VzXG4gICAgY29uc3Qgem9uZUNoYW5nZXM6IERhc2hib2FyZExheW91dENoYW5nZURldGFpbHMgPSBuZXcgTWFwKCk7XG5cbiAgICAvLyBjb21wYXJpbmcgb2xkIGRhc2hib2FyZCBvYmplY3RzIHdpdGggbmV3IG9uZXNcbiAgICBvbGREYXNoYm9hcmRPYmplY3RzLmZvckVhY2goKG9sZE9iamVjdCkgPT4ge1xuICAgICAgY29uc3Qgb2xkSWQ6IG51bWJlciA9IG9sZE9iamVjdC5pZDtcblxuICAgICAgLy8gY2hlY2tpbmcgaWYgem9uZSB3YXMgcmVtb3ZlZFxuICAgICAgaWYgKCFuZXdab25lTWFwLmhhcyhvbGRJZCkpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuUmVtb3ZlZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3T2JqZWN0ID0gbmV3Wm9uZU1hcC5nZXQob2xkSWQpO1xuICAgICAgaWYgKG9sZE9iamVjdC5pc0Zsb2F0aW5nICE9PSBuZXdPYmplY3QhLmlzRmxvYXRpbmcpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuSXNGbG9hdGluZ0NoYW5nZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkT2JqZWN0LmlzVmlzaWJsZSAhPT0gbmV3T2JqZWN0IS5pc1Zpc2libGUpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuSXNWaXNpYmxlQ2hhbmdlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRPYmplY3QubmFtZSAhPT0gbmV3T2JqZWN0IS5uYW1lKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLk5hbWVDaGFuZ2VkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZE9iamVjdC5wb3NpdGlvbi54ICE9PSBuZXdPYmplY3QhLnBvc2l0aW9uLnggfHwgb2xkT2JqZWN0LnBvc2l0aW9uLnkgIT09IG5ld09iamVjdCEucG9zaXRpb24ueSkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5Qb3NpdGlvbkNoYW5nZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkT2JqZWN0LnNpemUud2lkdGggIT09IG5ld09iamVjdCEuc2l6ZS53aWR0aCB8fCBvbGRPYmplY3Quc2l6ZS5oZWlnaHQgIT09IG5ld09iamVjdCEuc2l6ZS5oZWlnaHQpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuU2l6ZUNoYW5nZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2tpbmcgZm9yIGFueSBhZGRlZCB6b25lc1xuICAgIG5ld0Rhc2hib2FyZE9iamVjdHMuZm9yRWFjaCgobmV3T2JqZWN0KSA9PiB7XG4gICAgICBpZiAoIW9sZFpvbmVNYXAuaGFzKG5ld09iamVjdC5pZCkpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2UobmV3T2JqZWN0LmlkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLkFkZGVkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNraW5nIGlmIHpvbmUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkXG4gICAgaWYgKG9sZEFjdGl2ZVpvbmVJZCAhPT0gbmV3QWN0aXZlWm9uZUlkKSB7XG4gICAgICBpZiAobmV3QWN0aXZlWm9uZUlkICE9PSAwKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG5ld0FjdGl2ZVpvbmVJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5TZWxlY3RlZCk7XG4gICAgICB9XG4gICAgICBpZiAob2xkQWN0aXZlWm9uZUlkICE9PSAwKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZEFjdGl2ZVpvbmVJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5EZXNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVja2luZyBpZiBzd2l0Y2hlZCB0byBhbm90aGVyIGRhc2hib2FyZFxuICAgIGlmIChuZXdBY3RpdmVEYXNoYm9hcmROYW1lICYmIG9sZEFjdGl2ZURhc2hib2FyZE5hbWUgIT09IG5ld0FjdGl2ZURhc2hib2FyZE5hbWUpIHtcbiAgICAgIHRoaXMuYWRkQ2hhbmdlKDAsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuRGFzaGJvYXJkQ2hhbmdlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHpvbmVDaGFuZ2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDaGFuZ2Uoem9uZUlkOiBudW1iZXIsIHpvbmVDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzLCBjaGFuZ2U6IERhc2hib2FyZExheW91dENoYW5nZSk6IHZvaWQge1xuICAgIGlmICghem9uZUNoYW5nZXMuaGFzKHpvbmVJZCkpIHtcbiAgICAgIHpvbmVDaGFuZ2VzLnNldCh6b25lSWQsIFtdKTtcbiAgICB9XG5cbiAgICB6b25lQ2hhbmdlcy5nZXQoem9uZUlkKSEucHVzaChjaGFuZ2UpO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVEYXNoYm9hcmRPYmplY3RzQXN5bmMoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB6b25lU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxab25lU2VydmljZT4oU2VydmljZU5hbWVzLlpvbmUpO1xuXG4gICAgcmV0dXJuIHpvbmVTZXJ2aWNlLm1vdmVBbmRSZXNpemVBc3luYygvKkRhc2hib2FyZCBOYW1lKi8gdGhpcy5uYW1lLCB0aGlzLnpvbmVNYXAsIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5KTtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBbmltYXRpb25Bc3luYyhyZXBsYXlTcGVlZDogQ29udHJhY3QuUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYW5pbWF0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxBbmltYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQW5pbWF0aW9uKTtcblxuICAgIHJldHVybiBhbmltYXRpb25TZXJ2aWNlLnJlcGxheUFzeW5jKHJlcGxheVNwZWVkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldE9yRW1iZWRkZWRJbkFjdGl2ZVN0b3J5UG9pbnQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RGFzaGJvYXJkRmlsdGVyc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZT4odXBkYXRlVHlwZSwgQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSwgJ0ZpbHRlclVwZGF0ZVR5cGUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ3ZhbHVlcyBwYXJhbWV0ZXIgZm9yIGFwcGx5RGFzaGJvYXJkRmlsdGVyQXN5bmMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0T3JFbWJlZGRlZEluQWN0aXZlU3RvcnlQb2ludCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBseURhc2hib2FyZEZpbHRlckFzeW5jKGZpZWxkTmFtZSwgdmFsdWVzLCB1cGRhdGVUeXBlLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIEBXLTEyOTg2NDM5OiByZW1vdmUgb25jZSBpbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMgaXMgbW92ZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGlzIGNsYXNzXG4gIC8vIFRoaXMgbWV0aG9kIG9ubHkgZXhpc3RzIHNpbmNlIHdvcmtzaGVldHNJbXBsIGNhbiBiZSB1bmRlZmluZWQsIGJ1dCB3ZSBuZWVkIHRoZSB3b3Jrc2hlZXQgbmFtZXMgaW4gdGhlIEV4cG9ydCBBUElzXG4gIHB1YmxpYyBnZXRXb3Jrc2hlZXROYW1lc0Zyb21ab25lcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBjb25zdCB3b3Jrc2hlZXROYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHpvbmUgb2YgdGhpcy5fem9uZXMpIHtcbiAgICAgIGlmICh6b25lLnpvbmVUeXBlICE9PSBEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIHpvbmUuc2hlZXRJbmZvIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gaW50ZXJuYWwtY29udHJhY3QgMS42LjBcbiAgICAgIGNvbnN0IHdvcmtzaGVldE5hbWUgPSB6b25lLnNoZWV0SW5mbyA/IHpvbmUuc2hlZXRJbmZvLm5hbWUgOiB6b25lLm5hbWU7XG4gICAgICB3b3Jrc2hlZXROYW1lcy5wdXNoKHdvcmtzaGVldE5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiB3b3Jrc2hlZXROYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgdmVyaWZ5QWN0aXZlU2hlZXRPckVtYmVkZGVkSW5BY3RpdmVTdG9yeVBvaW50KCkge1xuICAgIGNvbnN0IGlzUm9vdEFuZEFjdGl2ZURhc2hib2FyZCA9IHRoaXMuYWN0aXZlO1xuICAgIGNvbnN0IGlzV2l0aGluQWN0aXZlU3RvcnlQb2ludCA9IHRoaXMucGFyZW50U3RvcnlQb2ludCAhPSBudWxsICYmIHRoaXMucGFyZW50U3RvcnlQb2ludC5hY3RpdmU7XG4gICAgaWYgKCFpc1Jvb3RBbmRBY3RpdmVEYXNoYm9hcmQgJiYgIWlzV2l0aGluQWN0aXZlU3RvcnlQb2ludCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLk5vdEFjdGl2ZVNoZWV0LCAnT3BlcmF0aW9uIG5vdCBhbGxvd2VkIG9uIG5vbi1hY3RpdmUgc2hlZXQnKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0Rhc2hib2FyZEltcGwnO1xuaW1wb3J0IHsgV29ya3NoZWV0SW1wbCB9IGZyb20gJy4vV29ya3NoZWV0SW1wbCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRhc2hib2FyZCBvYmplY3RzIC0gdGhlIHpvbmVzIGluIGEgZGFzaGJvYXJkLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkT2JqZWN0SW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9kYXNoYm9hcmRJbXBsOiBEYXNoYm9hcmRJbXBsLFxuICAgIHByaXZhdGUgX3R5cGU6IERhc2hib2FyZE9iamVjdFR5cGUsXG4gICAgcHJpdmF0ZSBfcG9zaXRpb246IENvbnRyYWN0LlBvaW50LFxuICAgIHByaXZhdGUgX3NpemU6IENvbnRyYWN0LlNpemUsXG4gICAgcHJpdmF0ZSBfd29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIF9uYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfaXNGbG9hdGluZzogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pc1Zpc2libGU6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9maWVsZElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZEltcGwoKTogRGFzaGJvYXJkSW1wbCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogRGFzaGJvYXJkT2JqZWN0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvc2l0aW9uKCk6IENvbnRyYWN0LlBvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fcG9zaXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldEltcGwoKTogV29ya3NoZWV0SW1wbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNGbG9hdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNGbG9hdGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1Zpc2libGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDb25uZWN0aW9uU3VtbWFyeSB9IGZyb20gJy4uL0Nvbm5lY3Rpb25TdW1tYXJ5JztcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi4vRmllbGQnO1xuaW1wb3J0IHsgTG9naWNhbFRhYmxlIH0gZnJvbSAnLi4vTG9naWNhbFRhYmxlJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBUYWJsZVN1bW1hcnkgfSBmcm9tICcuLi9UYWJsZVN1bW1hcnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IEZpZWxkSW1wbCB9IGZyb20gJy4vRmllbGRJbXBsJztcblxuZXhwb3J0IGNsYXNzIERhdGFTb3VyY2VJbXBsIHtcbiAgcHJpdmF0ZSBfZmllbGRzOiBBcnJheTxGaWVsZD47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2RhdGFTb3VyY2VJbmZvOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFTb3VyY2UsXG4gICAgcHJpdmF0ZSBfcmVnaXN0cnlJZDogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLl9maWVsZHMgPSBfZGF0YVNvdXJjZUluZm8uZmllbGRzLm1hcCgoZmllbGRNb2RlbCkgPT4ge1xuICAgICAgY29uc3QgZmllbGRJbXBsID0gbmV3IEZpZWxkSW1wbChmaWVsZE1vZGVsLCB0aGlzKTtcbiAgICAgIHJldHVybiBuZXcgRmllbGQoZmllbGRJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXh0cmFjdFVwZGF0ZVRpbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uZXh0cmFjdFVwZGF0ZVRpbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxDb250cmFjdC5GaWVsZD4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXh0cmFjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uaXNFeHRyYWN0O1xuICB9XG5cbiAgcHVibGljIGdldCBpc1B1Ymxpc2hlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uaXNQdWJsaXNoZWQ7XG4gIH1cblxuICBwdWJsaWMgcHVibGlzaGVkVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbmZvLnB1Ymxpc2hlZFVybDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhQYWdlUm93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLnJlZnJlc2hBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuQ29ubmVjdGlvblN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLmdldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCkudGhlbjxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeVtdPigoc3VtbWFyaWVzKSA9PiB7XG4gICAgICByZXR1cm4gc3VtbWFyaWVzLm1hcCgoc3VtbWFyeSkgPT4gbmV3IENvbm5lY3Rpb25TdW1tYXJ5KHN1bW1hcnkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zdCBkYXRhU291cmNlU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBkYXRhU291cmNlU2VydmljZS5nZXRBY3RpdmVUYWJsZXNBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCkudGhlbjxBcnJheTxDb250cmFjdC5UYWJsZVN1bW1hcnk+PigodGFibGVJbmZvcykgPT4ge1xuICAgICAgcmV0dXJuIHRhYmxlSW5mb3MubWFwKCh0YWJsZUluZm8pID0+IG5ldyBUYWJsZVN1bW1hcnkodGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgZ2V0RGF0YVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBnZXREYXRhU2VydmljZS5nZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsIC8vIDAgYW5kIFtdIGFyZSBkZWZhdWx0c1xuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlIHx8IFtdLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBnZXREYXRhU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIGdldERhdGFTZXJ2aWNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhcbiAgICAgIHRoaXMuaWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsIC8vIDAgYW5kIFtdIGFyZSBkZWZhdWx0c1xuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlIHx8IFtdLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIGNvbnN0IGdldERhdGFTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gZ2V0RGF0YVNlcnZpY2UuZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgIGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgcGFnZVJvd0NvdW50IHx8IHRoaXMuZ2V0TWF4UGFnZVJvd0xpbWl0KCksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcyhkYXRhU291cmNlOiBDb250cmFjdC5EYXRhU291cmNlKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUludGVybmFsVmFsdWUoZGF0YVNvdXJjZSwgJ2RhdGFTb3VyY2UnKTtcblxuICAgIHRoaXMuX2ZpZWxkcyA9IHRoaXMuX2RhdGFTb3VyY2VJbmZvLmZpZWxkcy5tYXAoKGZpZWxkTW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkSW1wbCA9IG5ldyBGaWVsZEltcGwoZmllbGRNb2RlbCwgZGF0YVNvdXJjZSk7XG4gICAgICByZXR1cm4gbmV3IEZpZWxkKGZpZWxkSW1wbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLmdldExvZ2ljYWxUYWJsZXNBc3luYyh0aGlzLmlkKS50aGVuPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+KChsb2dpY2FsVGFibGVJbmZvcykgPT4ge1xuICAgICAgcmV0dXJuIGxvZ2ljYWxUYWJsZUluZm9zLm1hcCgobG9naWNhbFRhYmxlSW5mbykgPT4gbmV3IExvZ2ljYWxUYWJsZShsb2dpY2FsVGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9maWVsZEluZm86IEludGVybmFsQ29udHJhY3QuRmllbGQsXG4gICAgcHJpdmF0ZSBfcGFyZW50RGF0YVNvdXJjZT86IENvbnRyYWN0LkRhdGFTb3VyY2UsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBDb250cmFjdC5EYXRhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5kYXRhVHlwZSA/PyBDb250cmFjdC5EYXRhVHlwZS5Vbmtub3duO1xuICB9XG5cbiAgcHVibGljIGdldCBhZ2dyZWdhdGlvbigpOiBDb250cmFjdC5GaWVsZEFnZ3JlZ2F0aW9uVHlwZSB7XG4gICAgcmV0dXJuIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5maWVsZEFnZ3JlZ2F0aW9uVHlwZS5jb252ZXJ0KHRoaXMuX2ZpZWxkSW5mby5hZ2dyZWdhdGlvbik7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgaWYgKCF0aGlzLl9wYXJlbnREYXRhU291cmNlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGF0YSBzb3VyY2UgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyBmaWVsZC4gUGxlYXNlIHVzZSBnZXRGaWVsZEFzeW5jIG1ldGhvZCB0byBnZXQgZmllbGQncyBkYXRhIHNvdXJjZSBpbmZvcm1hdGlvbmAsXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnREYXRhU291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldCByb2xlKCk6IENvbnRyYWN0LkZpZWxkUm9sZVR5cGUge1xuICAgIHJldHVybiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZmllbGRSb2xlVHlwZS5jb252ZXJ0KHRoaXMuX2ZpZWxkSW5mby5yb2xlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1uVHlwZSgpOiBDb250cmFjdC5Db2x1bW5UeXBlIHtcbiAgICBsZXQgZGVmaW5lZFZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkNvbHVtblR5cGUgPSB0aGlzLl9maWVsZEluZm8uY29sdW1uVHlwZSB8fCBJbnRlcm5hbENvbnRyYWN0LkNvbHVtblR5cGUuVW5rbm93bjtcbiAgICByZXR1cm4gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmNvbHVtblR5cGUuY29udmVydChkZWZpbmVkVmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NhbGN1bGF0ZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlzQ2FsY3VsYXRlZEZpZWxkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NvbWJpbmVkRmllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0NvbWJpbmVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR2VuZXJhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNHZW5lcmF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR2Vvc3BhdGlhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlzR2Vvc3BhdGlhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldCBzZW1hbnRpY1JvbGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLnNlbWFudGljUm9sZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YUZvcm1hdCgpOiBDb250cmFjdC5EYXRhRm9ybWF0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmRhdGFGb3JtYXQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgUGFyYW1ldGVyVmFsdWVUeXBlLCBQZXJpb2RUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlckluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1BhcmFtZXRlcnNTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uL1V0aWxzL1BhcmFtJztcblxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlckltcGwge1xuICBwcml2YXRlIF9hbGxvd2FibGVWYWx1ZXM6IENvbnRyYWN0LlBhcmFtZXRlckRvbWFpblJlc3RyaWN0aW9uO1xuICBwcml2YXRlIF9nbG9iYWxGaWVsZE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfcGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbyxcbiAgICBwcml2YXRlIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMuc2V0UGFyYW1ldGVySW5mbyhwYXJhbWV0ZXJJbmZvKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJJbmZvLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1cnJlbnRWYWx1ZSgpOiBEYXRhVmFsdWUge1xuICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUodGhpcy5fcGFyYW1ldGVySW5mby5jdXJyZW50VmFsdWUsIHRoaXMuX3BhcmFtZXRlckluZm8uZGF0YVR5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBEYXRhVHlwZSB7XG4gICAgcmV0dXJuIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXRhVHlwZS5jb252ZXJ0KHRoaXMuX3BhcmFtZXRlckluZm8uZGF0YVR5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9nbG9iYWxGaWVsZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbG93YWJsZVZhbHVlcygpOiBDb250cmFjdC5QYXJhbWV0ZXJEb21haW5SZXN0cmljdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FsbG93YWJsZVZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSk6IFByb21pc2U8RGF0YVZhbHVlPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihuZXdWYWx1ZSwgJ25ld1ZhbHVlJyk7XG5cbiAgICBjb25zdCBjb2VyY2VkVmFsdWUgPSBQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZShuZXdWYWx1ZSk7XG4gICAgY29uc3QgcGFyYW1ldGVyc1NlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8UGFyYW1ldGVyc1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gcGFyYW1ldGVyc1NlcnZpY2UuY2hhbmdlUGFyYW1ldGVyVmFsdWVBc3luYyh0aGlzLl9nbG9iYWxGaWVsZE5hbWUsIGNvZXJjZWRWYWx1ZSkudGhlbigocGFyYW1ldGVySW5mbykgPT4ge1xuICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlckluZm8pO1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFZhbHVlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlckluZm86IFBhcmFtZXRlckluZm8pOiB2b2lkIHtcbiAgICB0aGlzLl9wYXJhbWV0ZXJJbmZvID0gcGFyYW1ldGVySW5mbztcbiAgICB0aGlzLl9nbG9iYWxGaWVsZE5hbWUgPSBwYXJhbWV0ZXJJbmZvLmZpZWxkTmFtZTtcblxuICAgIGNvbnN0IHR5cGUgPSBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuYWxsb3dhYmxlVmFsdWVzLmNvbnZlcnQocGFyYW1ldGVySW5mby5hbGxvd2FibGVWYWx1ZXNUeXBlKTtcbiAgICBsZXQgbGlzdFZhbHVlczogQXJyYXk8RGF0YVZhbHVlPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbWluVmFsdWU6IERhdGFWYWx1ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbWF4VmFsdWU6IERhdGFWYWx1ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RlcFNpemU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZGF0ZVN0ZXBQZXJpb2Q6IFBlcmlvZFR5cGUgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZSA9PT0gUGFyYW1ldGVyVmFsdWVUeXBlLkxpc3QpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHBhcmFtZXRlckluZm8uYWxsb3dhYmxlVmFsdWVzIHx8IFtdO1xuICAgICAgbGlzdFZhbHVlcyA9IHZhbHVlcy5tYXAoKHZhbCkgPT4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlUGFyYW1ldGVyRGF0YVZhbHVlKHZhbCwgcGFyYW1ldGVySW5mby5kYXRhVHlwZSkpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gUGFyYW1ldGVyVmFsdWVUeXBlLlJhbmdlKSB7XG4gICAgICBtaW5WYWx1ZSA9IHBhcmFtZXRlckluZm8ubWluVmFsdWUgJiYgRGF0YVZhbHVlRmFjdG9yeS5NYWtlUGFyYW1ldGVyRGF0YVZhbHVlKHBhcmFtZXRlckluZm8ubWluVmFsdWUsIHBhcmFtZXRlckluZm8uZGF0YVR5cGUpO1xuICAgICAgbWF4VmFsdWUgPSBwYXJhbWV0ZXJJbmZvLm1heFZhbHVlICYmIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVBhcmFtZXRlckRhdGFWYWx1ZShwYXJhbWV0ZXJJbmZvLm1heFZhbHVlLCBwYXJhbWV0ZXJJbmZvLmRhdGFUeXBlKTtcbiAgICAgIHN0ZXBTaXplID0gcGFyYW1ldGVySW5mby5zdGVwU2l6ZTtcbiAgICAgIGRhdGVTdGVwUGVyaW9kID0gcGFyYW1ldGVySW5mby5kYXRlU3RlcFBlcmlvZCAmJiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZGF0ZVN0ZXBQZXJpb2QuY29udmVydChwYXJhbWV0ZXJJbmZvLmRhdGVTdGVwUGVyaW9kKTtcbiAgICB9XG5cbiAgICB0aGlzLl9hbGxvd2FibGVWYWx1ZXMgPSB7XG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgYWxsb3dhYmxlVmFsdWVzOiBsaXN0VmFsdWVzLFxuICAgICAgbWluVmFsdWU6IG1pblZhbHVlLFxuICAgICAgbWF4VmFsdWU6IG1heFZhbHVlLFxuICAgICAgc3RlcFNpemU6IHN0ZXBTaXplLFxuICAgICAgZGF0ZVN0ZXBQZXJpb2Q6IGRhdGVTdGVwUGVyaW9kLFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldFBhdGggfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ2xpZW50SW5mb1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9DbGllbnRJbmZvU2VydmljZSc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1BhcmFtZXRlcnNTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNpemVTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvU2l6ZVNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uL1V0aWxzL1BhcmFtJztcbmltcG9ydCB7IFNoZWV0VXRpbHMgfSBmcm9tICcuLi9VdGlscy9TaGVldFV0aWxzJztcbmltcG9ydCB7IFBhcmFtZXRlckltcGwgfSBmcm9tICcuL1BhcmFtZXRlckltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5cbmludGVyZmFjZSBQYXJ0aWFsU2hlZXRTaXplIHtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGFuIGVudW1lcmF0aW9uIHZhbHVlIG9mIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBBVVRPTUFUSUMsIEVYQUNUTFksIFJBTkdFLCBBVExFQVNULCBhbmQgQVRNT1NULlxuICAgKi9cbiAgcmVhZG9ubHkgYmVoYXZpb3I6IENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiAgVGhpcyBpcyBvbmx5IGRlZmluZWQgd2hlbiBiZWhhdmlvciBpcyBFWEFDVExZLCBSQU5HRSwgb3IgQVRMRUFTVC5cbiAgICovXG4gIHJlYWRvbmx5IG1pblNpemU/OiBQYXJ0aWFsPENvbnRyYWN0LlNpemU+O1xuXG4gIC8qKlxuICAgKiAgVGhpcyBpcyBvbmx5IGRlZmluZWQgd2hlbiBiZWhhdmlvciBpcyBFWEFDVExZLCBSQU5HRSBvciBBVE1PU1QuXG4gICAqL1xuICByZWFkb25seSBtYXhTaXplPzogUGFydGlhbDxDb250cmFjdC5TaXplPjtcbn1cblxuZXhwb3J0IGNsYXNzIFNoZWV0SW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgX3NoZWV0SW5mb0ltcGw6IFNoZWV0SW5mb0ltcGwsXG4gICAgcHJvdGVjdGVkIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFR5cGUoKTogQ29udHJhY3QuU2hlZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0UGF0aCgpOiBTaGVldFBhdGgge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLnNoZWV0UGF0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHwgQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFNpemU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhpZGRlbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pc0hpZGRlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5pc0hpZGRlbjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBpc0hpZGRlbiBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9zaGVldEluZm9JbXBsLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLmlzQWN0aXZlO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYGFjdGl2ZSBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYWN0aXZlKGFjdGl2ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLl9zaGVldEluZm9JbXBsLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3NoZWV0SW5mb0ltcGwuYWN0aXZlID0gYWN0aXZlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5pbmRleDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBpbmRleCBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuX3NoZWV0SW5mb0ltcGwudXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLnVybDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGB1cmwgbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwcml2YXRlIGdldFNoZWV0U2l6ZSgpOiBDb250cmFjdC5TaGVldFNpemUge1xuICAgIGlmICghU2hlZXRVdGlscy5pc1ZhbGlkU2hlZXRTaXplKHRoaXMuc2l6ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnc2l6ZSBpcyBub3Qgb2YgdHlwZSBTaGVldFNpemUnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zaXplO1xuICB9XG5cbiAgcHVibGljIGZpbmRQYXJhbWV0ZXJBc3luYyhwYXJhbWV0ZXJOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFBhcmFtZXRlckltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUsICdwYXJhbWV0ZXJOYW1lJyk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFBhcmFtZXRlcnNTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuUGFyYW1ldGVycyk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZmluZFBhcmFtZXRlckJ5TmFtZUFzeW5jKHBhcmFtZXRlck5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmFtZXRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PFBhcmFtZXRlckltcGw+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jKHRoaXMuc2hlZXRQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VTaXplQXN5bmMobmV3U2l6ZTogQ29udHJhY3QuU2hlZXRTaXplKTogUHJvbWlzZTxDb250cmFjdC5TaGVldFNpemU+IHtcbiAgICBjb25zdCBpbnZhbGlkU2l6ZUVycm9yID0gbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnSW52YWxpZCBzaGVldCBzaXplIHBhcmFtZXRlcicpO1xuICAgIGlmICghbmV3U2l6ZSB8fCAhbmV3U2l6ZS5iZWhhdmlvcikge1xuICAgICAgdGhyb3cgaW52YWxpZFNpemVFcnJvcjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aWFsU2hlZXRTaXplID0gdGhpcy5ub3JtYWxpemVTaGVldFNpemUobmV3U2l6ZSk7XG5cbiAgICBjb25zdCBpc0F1dG9tYXRpYyA9IHBhcnRpYWxTaGVldFNpemUuYmVoYXZpb3IgPT09IENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkF1dG9tYXRpYztcbiAgICBpZiAoIWlzQXV0b21hdGljICYmICFwYXJ0aWFsU2hlZXRTaXplLm1pblNpemUgJiYgIXBhcnRpYWxTaGVldFNpemUubWF4U2l6ZSkge1xuICAgICAgdGhyb3cgaW52YWxpZFNpemVFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQXV0b21hdGljICYmIHRoaXMuc2hlZXRUeXBlID09PSBDb250cmFjdC5TaGVldFR5cGUuV29ya3NoZWV0KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplQmVoYXZpb3JPbldvcmtzaGVldCxcbiAgICAgICAgJ09ubHkgU2hlZXRTaXplQmVoYXZpb3IuQXV0b21hdGljIGlzIGFsbG93ZWQgb24gV29ya3NoZWV0cycsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpc0F1dG9tYXRpYyAmJiB0aGlzLmdldFNoZWV0U2l6ZSgpLmJlaGF2aW9yID09PSBwYXJ0aWFsU2hlZXRTaXplLmJlaGF2aW9yKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ld1NpemUpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2Nlc3NlZE5ld1NpemUgPSB0aGlzLnByb2Nlc3NOZXdTaXplKHBhcnRpYWxTaGVldFNpemUpO1xuXG4gICAgY29uc3Qgc2l6ZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2l6ZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TaXplKTtcbiAgICByZXR1cm4gc2l6ZVNlcnZpY2UuY2hhbmdlU2l6ZUFzeW5jKHRoaXMubmFtZSwgcHJvY2Vzc2VkTmV3U2l6ZSkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBjbGllbnRJbmZvU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxDbGllbnRJbmZvU2VydmljZT4oU2VydmljZU5hbWVzLkNsaWVudEluZm8pO1xuXG4gICAgICByZXR1cm4gY2xpZW50SW5mb1NlcnZpY2UuZ2V0Q2xpZW50SW5mb0FzeW5jKCkudGhlbigoYm9vdHN0cmFwSW5mbykgPT4ge1xuICAgICAgICBjb25zdCBzaGVldCA9IGJvb3RzdHJhcEluZm8ucHVibGlzaGVkU2hlZXRzLmZpbmQoKHMpID0+IHMubmFtZSA9PT0gdGhpcy5uYW1lKTtcbiAgICAgICAgaWYgKCFzaGVldCkge1xuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgQ2FuJ3QgZmluZCBzaGVldCB3aXRoIG5hbWUgJHt0aGlzLm5hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaGVldFNpemUgPSBTaGVldFV0aWxzLmdldFNoZWV0U2l6ZUZyb21TaXplQ29uc3RyYWludHMoc2hlZXQuc2l6ZUNvbnN0cmFpbnQpO1xuICAgICAgICB0aGlzLl9zaGVldEluZm9JbXBsLnNoZWV0U2l6ZSA9IHNoZWV0U2l6ZTtcblxuICAgICAgICByZXR1cm4gc2hlZXRTaXplO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVNoZWV0U2l6ZShuZXdTaXplOiBDb250cmFjdC5TaGVldFNpemUpOiBQYXJ0aWFsU2hlZXRTaXplIHtcbiAgICBjb25zdCB7IGJlaGF2aW9yIH0gPSBuZXdTaXplO1xuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxDb250cmFjdC5TaGVldFNpemVCZWhhdmlvcj4oYmVoYXZpb3IsIENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLCAnU2hlZXRTaXplQmVoYXZpb3InKTtcblxuICAgIGNvbnN0IG1pblNpemUgPSBTaGVldEltcGwucGFyc2VEaW1lbnNpb25zKG5ld1NpemUubWluU2l6ZSk7XG4gICAgY29uc3QgbWF4U2l6ZSA9IFNoZWV0SW1wbC5wYXJzZURpbWVuc2lvbnMobmV3U2l6ZS5tYXhTaXplKTtcblxuICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplIH07XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NOZXdTaXplKG5ld1NpemU6IFBhcnRpYWxTaGVldFNpemUpOiBDb250cmFjdC5TaGVldFNpemUge1xuICAgIGNvbnN0IHsgYmVoYXZpb3IsIG1pblNpemU6IG1pblNpemVNYXliZSwgbWF4U2l6ZTogbWF4U2l6ZU1heWJlIH0gPSBuZXdTaXplO1xuXG4gICAgY29uc3QgaGFzTWluV2lkdGggPSAhUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQobWluU2l6ZU1heWJlPy53aWR0aCk7XG4gICAgY29uc3QgaGFzTWluSGVpZ2h0ID0gIVBhcmFtLmlzTnVsbE9yVW5kZWZpbmVkKG1pblNpemVNYXliZT8uaGVpZ2h0KTtcbiAgICBjb25zdCBoYXNNYXhXaWR0aCA9ICFQYXJhbS5pc051bGxPclVuZGVmaW5lZChtYXhTaXplTWF5YmU/LndpZHRoKTtcbiAgICBjb25zdCBoYXNNYXhIZWlnaHQgPSAhUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQobWF4U2l6ZU1heWJlPy5oZWlnaHQpO1xuICAgIGNvbnN0IGhhc1ZhbGlkTWluU2l6ZSA9IGhhc01pbldpZHRoICYmIGhhc01pbkhlaWdodDtcbiAgICBjb25zdCBoYXNWYWxpZE1heFNpemUgPSBoYXNNYXhXaWR0aCAmJiBoYXNNYXhIZWlnaHQ7XG5cbiAgICBzd2l0Y2ggKGJlaGF2aW9yKSB7XG4gICAgICBjYXNlIENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkF1dG9tYXRpYzoge1xuICAgICAgICByZXR1cm4geyBiZWhhdmlvciB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlIENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkF0TW9zdDoge1xuICAgICAgICBpZiAoIW1heFNpemVNYXliZSB8fCAhaGFzVmFsaWRNYXhTaXplKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLk1pc3NpbmdNYXhTaXplLCAnTWlzc2luZyBtYXhTaXplIGZvciBTaGVldFNpemVCZWhhdmlvci5BdE1vc3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgIGlmIChtYXhTaXplLndpZHRoIDwgMCB8fCBtYXhTaXplLmhlaWdodCA8IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZFNpemUsICdTaXplIHZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgYmVoYXZpb3IsIG1heFNpemUgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdExlYXN0OiB7XG4gICAgICAgIGlmICghbWluU2l6ZU1heWJlIHx8ICFoYXNWYWxpZE1pblNpemUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuTWlzc2luZ01pblNpemUsICdNaXNzaW5nIG1pblNpemUgZm9yIFNoZWV0U2l6ZUJlaGF2aW9yLkF0TGVhc3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1pblNpemUgPSB7IHdpZHRoOiBtaW5TaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1pblNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgIGlmIChtaW5TaXplLndpZHRoIDwgMCB8fCBtaW5TaXplLmhlaWdodCA8IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZFNpemUsICdTaXplIHZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgYmVoYXZpb3IsIG1pblNpemUgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5SYW5nZToge1xuICAgICAgICBpZiAoIW1pblNpemVNYXliZSB8fCAhbWF4U2l6ZU1heWJlIHx8ICFoYXNWYWxpZE1pblNpemUgfHwgIWhhc1ZhbGlkTWF4U2l6ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5NaXNzaW5nTWluTWF4U2l6ZSwgJ01pc3NpbmcgbWluU2l6ZSBvciBtYXhTaXplIGZvciBTaGVldFNpemVCZWhhdmlvci5SYW5nZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWluU2l6ZSA9IHsgd2lkdGg6IG1pblNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWluU2l6ZU1heWJlLmhlaWdodCEgfTtcbiAgICAgICAgY29uc3QgbWF4U2l6ZSA9IHsgd2lkdGg6IG1heFNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWF4U2l6ZU1heWJlLmhlaWdodCEgfTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgbWluU2l6ZS53aWR0aCA8IDAgfHxcbiAgICAgICAgICBtaW5TaXplLmhlaWdodCA8IDAgfHxcbiAgICAgICAgICBtYXhTaXplLndpZHRoIDwgMCB8fFxuICAgICAgICAgIG1heFNpemUuaGVpZ2h0IDwgMCB8fFxuICAgICAgICAgIG1pblNpemUud2lkdGggPiBtYXhTaXplLndpZHRoIHx8XG4gICAgICAgICAgbWluU2l6ZS5oZWlnaHQgPiBtYXhTaXplLmhlaWdodFxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZFNpemUsICdNaXNzaW5nIG1pblNpemUgb3IgbWF4U2l6ZSBmb3IgU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuRXhhY3RseToge1xuICAgICAgICBpZiAobWluU2l6ZU1heWJlICYmIG1heFNpemVNYXliZSkge1xuICAgICAgICAgIGlmIChoYXNWYWxpZE1pblNpemUgJiYgaGFzVmFsaWRNYXhTaXplKSB7XG4gICAgICAgICAgICBjb25zdCBtaW5TaXplID0geyB3aWR0aDogbWluU2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtaW5TaXplTWF5YmUuaGVpZ2h0ISB9O1xuICAgICAgICAgICAgY29uc3QgbWF4U2l6ZSA9IHsgd2lkdGg6IG1heFNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWF4U2l6ZU1heWJlLmhlaWdodCEgfTtcblxuICAgICAgICAgICAgaWYgKG1pblNpemUud2lkdGggIT09IG1heFNpemUud2lkdGggfHwgbWluU2l6ZS5oZWlnaHQgIT09IG1heFNpemUuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZSwgJ0NvbmZsaWN0aW5nIHNpemUgdmFsdWVzIGZvciBTaGVldFNpemVCZWhhdmlvci5FeGFjdGx5Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc1ZhbGlkTWluU2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgbWluU2l6ZSA9IHsgd2lkdGg6IG1pblNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWluU2l6ZU1heWJlLmhlaWdodCEgfTtcbiAgICAgICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplOiBtaW5TaXplIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc1ZhbGlkTWF4U2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgbWF4U2l6ZSA9IHsgd2lkdGg6IG1heFNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWF4U2l6ZU1heWJlLmhlaWdodCEgfTtcbiAgICAgICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplOiBtYXhTaXplLCBtYXhTaXplIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnSW52YWxpZCBzaGVldCBzaXplIHBhcmFtZXRlcicpO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgVW5zdXBwb3J0ZWQgc2hlZXQgc2l6ZSBiZWhhdmlvcjogJHtiZWhhdmlvcn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZURpbWVuc2lvbnMgPSAoc2l6ZTogQ29udHJhY3QuU2l6ZSB8IHVuZGVmaW5lZCk6IFBhcnRpYWw8Q29udHJhY3QuU2l6ZT4gPT4ge1xuICAgIGNvbnN0IGVtcHR5ID0geyB3aWR0aDogdW5kZWZpbmVkLCBoZWlnaHQ6IHVuZGVmaW5lZCB9O1xuXG4gICAgaWYgKCFzaXplKSB7XG4gICAgICByZXR1cm4gZW1wdHk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBzdWNjZXNzOiB3aWR0aFBhcnNlZCwgcGFyc2VkOiBwYXJzZWRXaWR0aCB9ID0gUGFyYW0udHJ5UGFyc2VOdW1iZXIoc2l6ZS53aWR0aCk7XG4gICAgY29uc3QgeyBzdWNjZXNzOiBoZWlnaHRQYXJzZWQsIHBhcnNlZDogcGFyc2VkSGVpZ2h0IH0gPSBQYXJhbS50cnlQYXJzZU51bWJlcihzaXplLmhlaWdodCk7XG5cbiAgICBpZiAod2lkdGhQYXJzZWQgJiYgaGVpZ2h0UGFyc2VkKSB7XG4gICAgICByZXR1cm4geyB3aWR0aDogcGFyc2VkV2lkdGghLCBoZWlnaHQ6IHBhcnNlZEhlaWdodCEgfTtcbiAgICB9XG5cbiAgICBpZiAod2lkdGhQYXJzZWQpIHtcbiAgICAgIHJldHVybiB7IHdpZHRoOiBwYXJzZWRXaWR0aCEgfTtcbiAgICB9XG5cbiAgICBpZiAoaGVpZ2h0UGFyc2VkKSB7XG4gICAgICByZXR1cm4geyBoZWlnaHQ6IHBhcnNlZEhlaWdodCEgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW1wdHk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBTaGVldFNpemUgYXMgRW1iZWRkaW5nU2hlZXRTaXplLCBTaXplIGFzIEV4dGVuc2lvblNoZWV0U2l6ZSwgU2hlZXRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNoZWV0UGF0aCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBTaGVldEluZm9JbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX25hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9zaGVldFR5cGU6IFNoZWV0VHlwZSxcbiAgICBwcml2YXRlIF9zaGVldFNpemU6IEV4dGVuc2lvblNoZWV0U2l6ZSB8IEVtYmVkZGluZ1NoZWV0U2l6ZSxcbiAgICBwcml2YXRlIF9pbmRleD86IG51bWJlcixcbiAgICBwcml2YXRlIF9pc0FjdGl2ZT86IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNIaWRkZW4/OiBib29sZWFuLFxuICAgIHByaXZhdGUgX3VybD86IHN0cmluZyxcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIHNldCBuYW1lKHNoZWV0TmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbmFtZSA9IHNoZWV0TmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRTaXplKCk6IEV4dGVuc2lvblNoZWV0U2l6ZSB8IEVtYmVkZGluZ1NoZWV0U2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0U2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2hlZXRTaXplKHZhbHVlOiBFeHRlbnNpb25TaGVldFNpemUgfCBFbWJlZGRpbmdTaGVldFNpemUpIHtcbiAgICB0aGlzLl9zaGVldFNpemUgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRUeXBlKCk6IFNoZWV0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRQYXRoKCk6IFNoZWV0UGF0aCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNoZWV0TmFtZTogdGhpcy5uYW1lLFxuICAgICAgaXNEYXNoYm9hcmQ6IHRoaXMuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuRGFzaGJvYXJkLFxuICAgICAgLy8gVE9ETyAtIFN0b3JpZXNcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBY3RpdmUoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQWN0aXZlO1xuICB9XG5cbiAgcHVibGljIHNldCBhY3RpdmUoYWN0aXZlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNBY3RpdmUgPSBhY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzSGlkZGVuKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi4vU2luZ2xlRXZlbnRNYW5hZ2VyJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFNpbmdsZUV2ZW50TWFuYWdlciBpbnRlcmZhY2UgZm9yIGEgc2luZ2xlIHR5cGUgb2YgVGFibGVhdSBldmVudFxuICpcbiAqIEB0ZW1wbGF0ZSBURXZlbnRUeXBlIFRoZSBUYWJsZWF1IGV2ZW50IHR5cGUgdGhpcyBjbGFzcyBzcGVjaWFsaXplc1xuICovXG5leHBvcnQgY2xhc3MgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxURXZlbnRUeXBlIGV4dGVuZHMgQ29udHJhY3QuVGFibGVhdUV2ZW50PiBpbXBsZW1lbnRzIFNpbmdsZUV2ZW50TWFuYWdlciB7XG4gIHByaXZhdGUgX2V2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZTtcbiAgcHJpdmF0ZSBfaGFuZGxlcnM6IEFycmF5PChldmVudE9iajogVEV2ZW50VHlwZSkgPT4gdm9pZD47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGV2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZSkge1xuICAgIHRoaXMuX2V2ZW50VHlwZSA9IGV2ZW50VHlwZTtcbiAgICB0aGlzLl9oYW5kbGVycyA9IFtdO1xuICB9XG5cbiAgcHVibGljIGdldCBldmVudFR5cGUoKTogVGFibGVhdUV2ZW50VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFdmVudExpc3RlbmVyKGhhbmRsZXI6IChldmVudE9iajogVEV2ZW50VHlwZSkgPT4gdm9pZCk6IENvbnRyYWN0LlRhYmxlYXVFdmVudFVucmVnaXN0ZXJGbiB7XG4gICAgdGhpcy5faGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUV2ZW50TGlzdGVuZXIoaGFuZGxlcjogKGV2ZW50T2JqOiBURXZlbnRUeXBlKSA9PiB2b2lkKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYmVmb3JlQ291bnQgPSB0aGlzLl9oYW5kbGVycy5sZW5ndGg7XG4gICAgdGhpcy5faGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVycy5maWx0ZXIoKGgpID0+IGggIT09IGhhbmRsZXIpO1xuICAgIHJldHVybiBiZWZvcmVDb3VudCA+IHRoaXMuX2hhbmRsZXJzLmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyB0cmlnZ2VyRXZlbnQoZXZlbnRHZW5lcmF0b3I6ICgpID0+IFRFdmVudFR5cGUpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5faGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGV2ZW50TW9kZWwgPSBldmVudEdlbmVyYXRvcigpO1xuICAgICAgICBoYW5kbGVyKGV2ZW50TW9kZWwpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBTaW5jZSB0aGlzIGhhbmRsZXIgY291bGQgYmUgb3V0c2lkZSBvdXIgY29udHJvbCwganVzdCBjYXRjaCBhbnl0aGluZyBpdCB0aHJvd3MgYW5kIGNvbnRpbnVlIG9uXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNoZWV0SW5mbywgU3RvcnlNb2RlbCwgU3RvcnlQb2ludE1vZGVsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFN0b3J5QWN0aXZhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TdG9yeUFjdGl2YXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgU2hvcnRMaXZlZERlZmVycmVkIH0gZnJvbSAnLi4vVXRpbHMvU2hvcnRMaXZlZERlZmVycmVkJztcbmltcG9ydCB7IFNoZWV0SW1wbCB9IGZyb20gJy4vU2hlZXRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL1NoZWV0SW5mb0ltcGwnO1xuaW1wb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL1N0b3J5UG9pbnRJbXBsJztcbmltcG9ydCB7IFN0b3J5UG9pbnRJbmZvSW1wbCB9IGZyb20gJy4vU3RvcnlQb2ludEluZm9JbXBsJztcblxuZXhwb3J0IGNsYXNzIFN0b3J5SW1wbCBleHRlbmRzIFNoZWV0SW1wbCB7XG4gIHByaXZhdGUgX2FjdGl2ZVN0b3J5UG9pbnRJbXBsOiBTdG9yeVBvaW50SW1wbDtcbiAgcHJpdmF0ZSBfc3RvcnlQb2ludEluZm9JbXBsczogQXJyYXk8U3RvcnlQb2ludEluZm9JbXBsPiA9IFtdO1xuICBwcml2YXRlIF9kZWZlcnJlZDogU2hvcnRMaXZlZERlZmVycmVkPFN0b3J5UG9pbnRJbXBsPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIF9zaGVldEluZm9JbXBsOiBTaGVldEluZm9JbXBsLFxuICAgIHN0b3J5TW9kZWw6IFN0b3J5TW9kZWwsXG4gICAgcHJpdmF0ZSBfcHVibGlzaGVkU2hlZXRJbmZvczogQXJyYXk8U2hlZXRJbmZvPixcbiAgICBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgKSB7XG4gICAgc3VwZXIoX3NoZWV0SW5mb0ltcGwsIF9yZWdpc3RyeUlkKTtcbiAgICB0aGlzLl9kZWZlcnJlZCA9IG5ldyBTaG9ydExpdmVkRGVmZXJyZWQ8U3RvcnlQb2ludEltcGw+KCk7XG4gICAgdGhpcy5pbml0aWFsaXplU3Rvcnkoc3RvcnlNb2RlbCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTdG9yeShzdG9yeU1vZGVsOiBTdG9yeU1vZGVsKSB7XG4gICAgc3RvcnlNb2RlbC5zdG9yeVBvaW50cy5mb3JFYWNoKChzdG9yeVBvaW50TW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gc3RvcnlQb2ludE1vZGVsLmluZGV4ID09PSBzdG9yeU1vZGVsLmFjdGl2ZVN0b3J5UG9pbnRJbmRleDtcbiAgICAgIGNvbnN0IHN0b3J5UG9pbnRJbmZvSW1wbCA9IG5ldyBTdG9yeVBvaW50SW5mb0ltcGwoXG4gICAgICAgIHN0b3J5UG9pbnRNb2RlbC5jYXB0aW9uLFxuICAgICAgICBzdG9yeVBvaW50TW9kZWwuaW5kZXgsXG4gICAgICAgIHN0b3J5UG9pbnRNb2RlbC5zdG9yeVBvaW50SWQsXG4gICAgICAgIGlzQWN0aXZlLFxuICAgICAgICBzdG9yeVBvaW50TW9kZWwudXBkYXRlZCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgICB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzLnB1c2goc3RvcnlQb2ludEluZm9JbXBsKTtcblxuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsID0gbmV3IFN0b3J5UG9pbnRJbXBsKFxuICAgICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbCxcbiAgICAgICAgICB0aGlzLl9wdWJsaXNoZWRTaGVldEluZm9zLFxuICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICAgICAgc3RvcnlQb2ludE1vZGVsLmNvbnRhaW5lZFNoZWV0SW5mbyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RvcnlJbmZvKGluZGV4OiBudW1iZXIsIHN0b3J5UG9pbnRNb2RlbDogU3RvcnlQb2ludE1vZGVsKSB7XG4gICAgaWYgKCF0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHN0b3J5SW5mb0ltcGwgPSB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzW2luZGV4XTtcbiAgICBpZiAoc3RvcnlJbmZvSW1wbC5zdG9yeVBvaW50SWQgIT09IHN0b3J5UG9pbnRNb2RlbC5zdG9yeVBvaW50SWQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuU3RvcnlQb2ludElkTWlzbWF0Y2gsXG4gICAgICAgIGBXZSBzaG91bGQgbm90IGJlIHVwZGF0aW5nIGEgc3RvcnkgcG9pbnQgd2hlbiB0aGUgSURzIGRvbid0IG1hdGNoLiBFeGlzdGluZyBzdG9yeVBvaW50SUQ9JHtzdG9yeUluZm9JbXBsLnN0b3J5UG9pbnRJZH0sIG5ld1N0b3J5UG9pbnRJRD0ke3N0b3J5UG9pbnRNb2RlbC5zdG9yeVBvaW50SWR9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHN0b3J5SW5mb0ltcGwuY2FwdGlvbiA9IHN0b3J5UG9pbnRNb2RlbC5jYXB0aW9uO1xuICAgIHN0b3J5SW5mb0ltcGwudXBkYXRlZCA9IHN0b3J5UG9pbnRNb2RlbC51cGRhdGVkO1xuXG4gICAgaWYgKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLnN0b3J5UG9pbnRJZCA9PT0gc3RvcnlQb2ludE1vZGVsLnN0b3J5UG9pbnRJZCkge1xuICAgICAgdGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwudXBkYXRlZCA9IHN0b3J5SW5mb0ltcGwudXBkYXRlZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlU3Rvcnkoc3RvcnlQb2ludE1vZGVsOiBTdG9yeVBvaW50TW9kZWwpIHtcbiAgICBpZiAoIXRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzLmZvckVhY2goKHN0b3J5UG9pbnRJbmZvSW1wbCkgPT4ge1xuICAgICAgY29uc3QgaXNBY3RpdmUgPSBzdG9yeVBvaW50SW5mb0ltcGwuc3RvcnlQb2ludElkID09PSBzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkO1xuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgc3RhdGVcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLmNhcHRpb24gPSBzdG9yeVBvaW50TW9kZWwuY2FwdGlvbjtcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLmluZGV4ID0gc3RvcnlQb2ludE1vZGVsLmluZGV4O1xuICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLnVwZGF0ZWQgPSBzdG9yeVBvaW50TW9kZWwudXBkYXRlZDtcblxuICAgICAgICAvLyByZS1pbml0aWFsaXplIGFjdGl2ZVN0b3J5UG9pbnRJbXBsXG4gICAgICAgIHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsID0gbmV3IFN0b3J5UG9pbnRJbXBsKFxuICAgICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbCxcbiAgICAgICAgICB0aGlzLl9wdWJsaXNoZWRTaGVldEluZm9zLFxuICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICAgICAgc3RvcnlQb2ludE1vZGVsLmNvbnRhaW5lZFNoZWV0SW5mbyxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNldCBvbGQgb25lcyB0byBmYWxzZVxuICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwuYWN0aXZlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5hY3RpdmVTdG9yeVBvaW50KSB7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZXNvbHZlKHRoaXMuYWN0aXZlU3RvcnlQb2ludCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVTdG9yeVBvaW50KCk6IFN0b3J5UG9pbnRJbXBsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0b3J5UG9pbnRzSW5mbygpOiBBcnJheTxTdG9yeVBvaW50SW5mb0ltcGw+IHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuYWN0aXZlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLl9zaGVldEluZm9JbXBsLmlzSGlkZGVuO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlTmV4dFN0b3J5UG9pbnRBc3luYygpOiBQcm9taXNlPFN0b3J5UG9pbnRJbXBsPiB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLmluZGV4ID09PSB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwpO1xuICAgIH1cblxuICAgIGxldCBwcm9taXNlID0gdGhpcy5fZGVmZXJyZWQuZ2V0TmV3UHJvbWlzZU9yVGhyb3dJZkJ1c3koKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U3RvcnlBY3RpdmF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlN0b3J5QWN0aXZhdGlvbik7XG4gICAgc2VydmljZS5hY3RpdmF0ZU5leHRTdG9yeVBvaW50QXN5bmMoKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludEFzeW5jKCk6IFByb21pc2U8U3RvcnlQb2ludEltcGw+IHtcbiAgICBpZiAodGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwuaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwpO1xuICAgIH1cblxuICAgIGxldCBwcm9taXNlID0gdGhpcy5fZGVmZXJyZWQuZ2V0TmV3UHJvbWlzZU9yVGhyb3dJZkJ1c3koKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U3RvcnlBY3RpdmF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlN0b3J5QWN0aXZhdGlvbik7XG4gICAgc2VydmljZS5hY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludEFzeW5jKCk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgYWN0aXZhdGVTdG9yeVBvaW50QXN5bmMoaW5kZXg6IG51bWJlcik6IFByb21pc2U8U3RvcnlQb2ludEltcGw+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGluZGV4LCAnaW5kZXgnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShpbmRleCwgJ251bWJlcicsICdpbmRleCcpO1xuXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkluZGV4T3V0T2ZSYW5nZSwgJ1RoZSBpbmRleCBwYXNzZWQgdG8gdGhpcyBjb21tYW5kIGlzIG91dCBvZiByYW5nZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPT09IHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLmluZGV4KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvbWlzZSA9IHRoaXMuX2RlZmVycmVkLmdldE5ld1Byb21pc2VPclRocm93SWZCdXN5KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFN0b3J5QWN0aXZhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TdG9yeUFjdGl2YXRpb24pO1xuICAgIHNlcnZpY2UuYWN0aXZhdGVTdG9yeVBvaW50QXN5bmMoaW5kZXgpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgcHVibGljIHJldmVydFN0b3J5UG9pbnRBc3luYyhpbmRleDogbnVtYmVyKTogUHJvbWlzZTxTdG9yeVBvaW50SW5mb0ltcGw+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGluZGV4LCAnaW5kZXgnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShpbmRleCwgJ251bWJlcicsICdpbmRleCcpO1xuXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkluZGV4T3V0T2ZSYW5nZSwgJ1RoZSBpbmRleCBwYXNzZWQgdG8gdGhpcyBjb21tYW5kIGlzIG91dCBvZiByYW5nZS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFN0b3J5QWN0aXZhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TdG9yeUFjdGl2YXRpb24pO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UucmV2ZXJ0U3RvcnlQb2ludEFzeW5jKGluZGV4KS50aGVuPFN0b3J5UG9pbnRJbmZvSW1wbD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVN0b3J5SW5mbyhyZXNwb25zZS5pbmRleCwgcmVzcG9uc2UpO1xuICAgICAgY29uc3Qgc3RvcnlQb2ludEluZm9JbXBsID0gbmV3IFN0b3J5UG9pbnRJbmZvSW1wbChcbiAgICAgICAgcmVzcG9uc2UuY2FwdGlvbixcbiAgICAgICAgcmVzcG9uc2UuaW5kZXgsXG4gICAgICAgIHJlc3BvbnNlLnN0b3J5UG9pbnRJZCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHJlc3BvbnNlLnVwZGF0ZWQsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHN0b3J5UG9pbnRJbmZvSW1wbDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclBlbmRpbmdQcm9taXNlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGVmZXJyZWQpIHtcbiAgICAgIHRoaXMuX2RlZmVycmVkLnJlamVjdCgnQWxsIHBlbmRpbmcgcHJvbWlzZXMgY2xlYXJlZCcpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENvbnRhaW5lZFNoZWV0SW5mb01vZGVsLCBTaGVldEluZm8sIFNoZWV0UGF0aCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFNoZWV0VXRpbHMgfSBmcm9tICcuLi9VdGlscy9TaGVldFV0aWxzJztcbmltcG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0Rhc2hib2FyZEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9TaGVldEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5pbXBvcnQgeyBTdG9yeUltcGwgfSBmcm9tICcuL1N0b3J5SW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW5mb0ltcGwgfSBmcm9tICcuL1N0b3J5UG9pbnRJbmZvSW1wbCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRJbXBsIH0gZnJvbSAnLi9Xb3Jrc2hlZXRJbXBsJztcblxuZXhwb3J0IGNsYXNzIFN0b3J5UG9pbnRJbXBsIHtcbiAgcHJpdmF0ZSBfY29udGFpbmVkU2hlZXRJbXBsOiBTaGVldEltcGw7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3N0b3J5UG9pbnRJbmZvSW1wbDogU3RvcnlQb2ludEluZm9JbXBsLFxuICAgIHNoZWV0SW5mb3M6IEFycmF5PFNoZWV0SW5mbz4sXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIGNvbnRhaW5lZFNoZWV0SW5mbz86IENvbnRhaW5lZFNoZWV0SW5mb01vZGVsLFxuICApIHtcbiAgICBpZiAoY29udGFpbmVkU2hlZXRJbmZvKSB7XG4gICAgICB0aGlzLl9jb250YWluZWRTaGVldEltcGwgPSB0aGlzLmNyZWF0ZUNvbnRhaW5lZFNoZWV0KGNvbnRhaW5lZFNoZWV0SW5mbywgc2hlZXRJbmZvcywgcmVnaXN0cnlJZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGwuaW5kZXg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLmNhcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLmFjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXBkYXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLnVwZGF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IHVwZGF0ZWQodXBkYXRlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC51cGRhdGVkID0gdXBkYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50U3RvcnkoKTogU3RvcnlJbXBsIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLnBhcmVudFN0b3J5O1xuICB9XG5cbiAgcHVibGljIGdldCBjb250YWluZWRTaGVldCgpOiBTaGVldEltcGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb250YWluZWRTaGVldEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0b3J5UG9pbnRJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGwuc3RvcnlQb2ludElkO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb250YWluZWRTaGVldChjb250YWluZWRTaGVldEluZm86IENvbnRhaW5lZFNoZWV0SW5mb01vZGVsLCBzaGVldEluZm9zOiBBcnJheTxTaGVldEluZm8+LCByZWdpc3RyeUlkOiBudW1iZXIpOiBTaGVldEltcGwge1xuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0SWR4ID0gLTE7XG5cbiAgICBjb25zdCBwdWJsaXNoZWRTaGVldEluZm8gPSBTaGVldFV0aWxzLmdldFB1Ymxpc2hlZFNoZWV0SW5mb0J5TmFtZShjb250YWluZWRTaGVldEluZm8ubmFtZSwgc2hlZXRJbmZvcyk7XG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRTaXplID0gU2hlZXRVdGlscy5jcmVhdGVBdXRvbWF0aWNTaXplKCk7XG4gICAgY29uc3QgaXNDb250YWluZWRTaGVldEhpZGRlbiA9IHB1Ymxpc2hlZFNoZWV0SW5mbyA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0VXJsID0gcHVibGlzaGVkU2hlZXRJbmZvID8gcHVibGlzaGVkU2hlZXRJbmZvLnVybCA6ICcnO1xuICAgIC8vIENvbnRhaW5lZCBzaGVldHMgYXJlbid0IGFjdGl2ZSAtIHRoZSBjb250YWluaW5nIHNoZWV0IGlzIGFjdGl2ZS5cbiAgICBjb25zdCBjb250YWluZWRTaGVldEFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKFxuICAgICAgY29udGFpbmVkU2hlZXRJbmZvLm5hbWUsXG4gICAgICBTaGVldFV0aWxzLmdldFNoZWV0VHlwZUVudW0oY29udGFpbmVkU2hlZXRJbmZvLnNoZWV0VHlwZSksXG4gICAgICBjb250YWluZWRTaGVldFNpemUsXG4gICAgICBjb250YWluZWRTaGVldElkeCxcbiAgICAgIGNvbnRhaW5lZFNoZWV0QWN0aXZlLFxuICAgICAgaXNDb250YWluZWRTaGVldEhpZGRlbixcbiAgICAgIGNvbnRhaW5lZFNoZWV0VXJsLFxuICAgICk7XG5cbiAgICBsZXQgc2hlZXRJbXBsOiBTaGVldEltcGw7XG4gICAgc3dpdGNoIChjb250YWluZWRTaGVldEluZm9JbXBsLnNoZWV0VHlwZSkge1xuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFR5cGUuV29ya3NoZWV0OiB7XG4gICAgICAgIGNvbnN0IHZpeklkOiBWaXN1YWxJZCA9IHtcbiAgICAgICAgICB3b3Jrc2hlZXQ6IGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwubmFtZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzaGVldEltcGwgPSBuZXcgV29ya3NoZWV0SW1wbChjb250YWluZWRTaGVldEluZm9JbXBsLCByZWdpc3RyeUlkLCB2aXpJZCwgbnVsbCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFR5cGUuRGFzaGJvYXJkOiB7XG4gICAgICAgIGNvbnN0IHNoZWV0UGF0aDogU2hlZXRQYXRoID0ge1xuICAgICAgICAgIHNoZWV0TmFtZTogY29udGFpbmVkU2hlZXRJbmZvSW1wbC5uYW1lLFxuICAgICAgICAgIGlzRGFzaGJvYXJkOiB0cnVlLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNoZWV0SW1wbCA9IG5ldyBEYXNoYm9hcmRJbXBsKGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwsIGNvbnRhaW5lZFNoZWV0SW5mby5kYXNoYm9hcmRab25lcywgc2hlZXRQYXRoLCByZWdpc3RyeUlkLCB0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5TZXJ2ZXJFcnJvciwgJ0ludmFsaWQgU2hlZXRUeXBlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoZWV0SW1wbDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9TdG9yeUltcGwnO1xuXG5leHBvcnQgY2xhc3MgU3RvcnlQb2ludEluZm9JbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2NhcHRpb246IHN0cmluZyxcbiAgICBwcml2YXRlIF9pbmRleDogbnVtYmVyLFxuICAgIHByaXZhdGUgX3N0b3J5UG9pbnRJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2FjdGl2ZTogYm9vbGVhbixcbiAgICBwcml2YXRlIF91cGRhdGVkOiBib29sZWFuLFxuICAgIHByaXZhdGUgX3BhcmVudFN0b3J5SW1wbDogU3RvcnlJbXBsLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBjYXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9jYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIHNldCBjYXB0aW9uKGNhcHRpb246IHN0cmluZykge1xuICAgIHRoaXMuX2NhcHRpb24gPSBjYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gIH1cblxuICBwdWJsaWMgc2V0IGluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9pbmRleCA9IGluZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCBzdG9yeVBvaW50SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZShpc0FjdGl2ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2FjdGl2ZSA9IGlzQWN0aXZlO1xuICB9XG5cbiAgcHVibGljIGdldCB1cGRhdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl91cGRhdGVkO1xuICB9XG5cbiAgcHVibGljIHNldCB1cGRhdGVkKGlzVXBkYXRlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX3VwZGF0ZWQgPSBpc1VwZGF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudFN0b3J5KCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeUltcGw7XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBXb3JrYm9va0ltcGwge31cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlNZW51VHlwZSxcbiAgQ29udGV4dE1lbnVPcHRpb25zLFxuICBEYXRlUmFuZ2VUeXBlLFxuICBFcnJvckNvZGVzLFxuICBGaWx0ZXJOdWxsT3B0aW9uLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgUGVyaW9kVHlwZSxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2hhcmVkRXJyb3JDb2RlcyxcbiAgVG9vbHRpcENvbnRleHQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU2NoZW1hLCBEYXRhU291cmNlIGFzIERhdGFTb3VyY2VJbmZvLCBWaXN1YWxJZCwgV29ya3NoZWV0RGF0YVNvdXJjZUluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJy4uL0RhdGFTb3VyY2UnO1xuaW1wb3J0IHsgTG9naWNhbFRhYmxlIH0gZnJvbSAnLi4vTG9naWNhbFRhYmxlJztcbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvQWNjZXNzaWJpbGl0eVNlcnZpY2UnO1xuaW1wb3J0IHsgQW5ub3RhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9Bbm5vdGF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UsIEdldERhdGFUeXBlIH0gZnJvbSAnLi4vU2VydmljZXMvR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1NlbGVjdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgVmlzdWFsTW9kZWxTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvVmlzdWFsTW9kZWxTZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkSW1wbCB9IGZyb20gJy4vRGFzaGJvYXJkSW1wbCc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vRGF0YVNvdXJjZUltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9TaGVldEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW1wbCB9IGZyb20gJy4vU3RvcnlQb2ludEltcGwnO1xuXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0SW1wbCBleHRlbmRzIFNoZWV0SW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzaGVldEluZm9JbXBsOiBTaGVldEluZm9JbXBsLFxuICAgIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHByaXZhdGUgX3BhcmVudERhc2hib2FyZEltcGw6IERhc2hib2FyZEltcGwgfCBudWxsLFxuICAgIHByaXZhdGUgX3BhcmVudFN0b3J5UG9pbnRJbXBsOiBTdG9yeVBvaW50SW1wbCB8IG51bGwsXG4gICAgcHJpdmF0ZSBfYmFja2dyb3VuZENvbG9yOiBzdHJpbmcgfCBudWxsID0gbnVsbCxcbiAgICBwcml2YXRlIF9mb3JtYXR0aW5nOiBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nIHwgbnVsbCA9IG51bGwsXG4gICkge1xuICAgIHN1cGVyKHNoZWV0SW5mb0ltcGwsIF9yZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50RGFzaGJvYXJkKCk6IERhc2hib2FyZEltcGwgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50U3RvcnlQb2ludCgpOiBTdG9yeVBvaW50SW1wbCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmlzdWFsSWQoKTogVmlzdWFsSWQge1xuICAgIHJldHVybiB0aGlzLl92aXN1YWxJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhQYWdlUm93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJhY2tncm91bmRDb2xvcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYmFja2dyb3VuZENvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0aW5nKCk6IENvbnRyYWN0LldvcmtzaGVldEZvcm1hdHRpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlPih1cGRhdGVUeXBlLCBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLCAnQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZScpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWx0ZXJPcHRpb25zLCAnZmlsdGVyT3B0aW9ucycpO1xuICAgIGlmIChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pIHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RmlsdGVyTnVsbE9wdGlvbj4oZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uLCBGaWx0ZXJOdWxsT3B0aW9uLCAnRmlsdGVyTnVsbE9wdGlvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5UmFuZ2VQYXJhbVR5cGUoZmlsdGVyT3B0aW9ucy5taW4sIGZpbHRlck9wdGlvbnMubWF4KTtcbiAgICB9XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBseVJhbmdlRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCBmaWx0ZXJPcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPiB8IENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscyxcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHZhbHVlcywgJ3ZhbHVlcycpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZT4odXBkYXRlVHlwZSwgQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSwgJ0NvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUnKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSAmJiAhdmFsdWVzLmxldmVscykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAndmFsdWVzIHBhcmFtZXRlciBmb3IgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyBtdXN0IGJlIGFuIGFycmF5IG9yIGNvbnRhaW4gYSBsZXZlbHMga2V5JyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmNsZWFyRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIob3B0aW9ucywgJ29wdGlvbnMnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFBlcmlvZFR5cGU+KG9wdGlvbnMucGVyaW9kVHlwZSwgUGVyaW9kVHlwZSwgJ1BlcmlvZFR5cGUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPERhdGVSYW5nZVR5cGU+KG9wdGlvbnMucmFuZ2VUeXBlLCBEYXRlUmFuZ2VUeXBlLCAnRGF0ZVJhbmdlVHlwZScpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RGF0YVNvdXJjZXNBc3luYyh0aGlzLnZpc3VhbElkKS50aGVuPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PigocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hOiBEYXRhU2NoZW1hID0gcmVzdWx0O1xuICAgICAgY29uc3Qgd29ya3NoZWV0RGF0YVNvdXJjZUluZm86IFdvcmtzaGVldERhdGFTb3VyY2VJbmZvID0gZGF0YVNjaGVtYS53b3Jrc2hlZXREYXRhU2NoZW1hTWFwW3RoaXMubmFtZV07XG5cbiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzOiBBcnJheTxDb250cmFjdC5EYXRhU291cmNlPiA9IFtdO1xuXG4gICAgICAvLyBGaXJzdCwgYWRkIHRoZSBwcmltYXJ5IGRhdGFzb3VyY2UuICBCeSBjb252ZW50aW9uLCBpdCBjb21lcyBmaXJzdCBpbiB0aGUgcmV0dXJuZWQgYXJyYXkuXG4gICAgICBjb25zdCBwcmltYXJ5SWQ6IHN0cmluZyA9IHdvcmtzaGVldERhdGFTb3VyY2VJbmZvLnByaW1hcnlEYXRhU291cmNlO1xuICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU2NoZW1hLmRhdGFTb3VyY2VzW3ByaW1hcnlJZF0pKTtcblxuICAgICAgLy8gVGhlbiwgbG9vcCB0aHJvdWdoIGFueSBzZWNvbmRhcnkgZGF0YSBzb3VyY2VzIGFuZCBhZGQgdGhlbS5cbiAgICAgIGZvciAoY29uc3Qgc2Vjb25kYXJ5SWQgb2Ygd29ya3NoZWV0RGF0YVNvdXJjZUluZm8ucmVmZXJlbmNlZERhdGFTb3VyY2VMaXN0KSB7XG4gICAgICAgIGlmIChzZWNvbmRhcnlJZCAhPT0gcHJpbWFyeUlkKSB7XG4gICAgICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU2NoZW1hLmRhdGFTb3VyY2VzW3NlY29uZGFyeUlkXSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhU291cmNlcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRGaWx0ZXJzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFNlbGVjdGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIEdldERhdGFUeXBlLlN1bW1hcnksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVTZWxlY3Rpb24sXG4gICAgICB0cnVlLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgICBvcHRpb25zLmFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyA/PyBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMocGFnZVJvd0NvdW50OiBudW1iZXIsIG9wdGlvbnM6IENvbnRyYWN0LkdldFN1bW1hcnlEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBwYWdlUm93Q291bnQgfHwgdGhpcy5nZXRNYXhQYWdlUm93TGltaXQoKSxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgIHRydWUsIC8vIGluY2x1ZGVBbGxDb2x1bW5zIChjYW4gYmUgb3ZlcnJpZGRlbiBieSBjb2x1bW5zVG9JbmNsdWRlQnlJZClcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICAgIG9wdGlvbnMuYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nID8/IGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGFkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jKFxuICAgIG1hcmtzQ2FyZEluZGV4OiBudW1iZXIsXG4gICAgZW5jb2RpbmdUeXBlOiBDb250cmFjdC5FbmNvZGluZ1R5cGUsXG4gICAgY29sdW1uczogc3RyaW5nW10sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFZpc3VhbE1vZGVsU2VydmljZT4oU2VydmljZU5hbWVzLlZpc3VhbE1vZGVsKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmFkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jKHRoaXMudmlzdWFsSWQsIG1hcmtzQ2FyZEluZGV4LCBlbmNvZGluZ1R5cGUsIGNvbHVtbnMsIHN0YXJ0SW5kZXgpO1xuICB9XG5cbiAgcHVibGljIG1vdmVNYXJrc0NhcmRGaWVsZEFzeW5jKG1hcmtzQ2FyZEluZGV4OiBudW1iZXIsIGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIsIGZpZWxkQ291bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UubW92ZU1hcmtzQ2FyZEZpZWxkQXN5bmModGhpcy52aXN1YWxJZCwgbWFya3NDYXJkSW5kZXgsIGZyb21JbmRleCwgdG9JbmRleCwgZmllbGRDb3VudCk7XG4gIH1cblxuICBwdWJsaWMgc3BsaWNlTWFya3NDYXJkRmllbGRzQXN5bmMoXG4gICAgbWFya3NDYXJkSW5kZXg6IG51bWJlcixcbiAgICBlbmNvZGluZ1R5cGU6IENvbnRyYWN0LkVuY29kaW5nVHlwZSxcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgZGVsZXRlQ291bnQ6IG51bWJlcixcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxWaXN1YWxNb2RlbFNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXN1YWxNb2RlbCk7XG5cbiAgICByZXR1cm4gc2VydmljZS5zcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyh0aGlzLnZpc3VhbElkLCBtYXJrc0NhcmRJbmRleCwgZW5jb2RpbmdUeXBlLCBzdGFydEluZGV4LCBkZWxldGVDb3VudCwgY29sdW1ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db2x1bW4+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBHZXREYXRhVHlwZS5VbmRlcmx5aW5nLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgICBvcHRpb25zLmFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyA/PyBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdUYWJsZXNBc3luYyh0aGlzLnZpc3VhbElkKS50aGVuPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+KChsb2dpY2FsVGFibGVJbmZvcykgPT4ge1xuICAgICAgcmV0dXJuIGxvZ2ljYWxUYWJsZUluZm9zLm1hcCgobG9naWNhbFRhYmxlSW5mbykgPT4gbmV3IExvZ2ljYWxUYWJsZShsb2dpY2FsVGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgbG9naWNhbFRhYmxlSWQsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVTZWxlY3Rpb24sXG4gICAgICAhIW9wdGlvbnMuaW5jbHVkZUFsbENvbHVtbnMsXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkIHx8IFtdLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICAgIG9wdGlvbnMuYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nID8/IGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMsXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgIHBhZ2VSb3dDb3VudCB8fCB0aGlzLmdldE1heFBhZ2VSb3dMaW1pdCgpLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICAgb3B0aW9ucy5hcHBseVdvcmtzaGVldEZvcm1hdHRpbmcgPz8gZmFsc2UsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLmNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jKHNlbGVjdGlvbnM6IEFycmF5PENvbnRyYWN0LlNlbGVjdGlvbkNyaXRlcmlhPiwgc2VsZWN0aW9uVXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2VsZWN0aW9ucywgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8U2VsZWN0aW9uVXBkYXRlVHlwZT4oc2VsZWN0aW9uVXBkYXRlVHlwZSwgU2VsZWN0aW9uVXBkYXRlVHlwZSwgJ1NlbGVjdGlvblVwZGF0ZVR5cGUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jKHRoaXMudmlzdWFsSWQsIHNlbGVjdGlvbnMsIHNlbGVjdGlvblVwZGF0ZVR5cGUpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlJZEFzeW5jKHNlbGVjdGlvbnM6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiwgc2VsZWN0aW9uVXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2VsZWN0aW9ucywgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8U2VsZWN0aW9uVXBkYXRlVHlwZT4oc2VsZWN0aW9uVXBkYXRlVHlwZSwgU2VsZWN0aW9uVXBkYXRlVHlwZSwgJ1NlbGVjdGlvblVwZGF0ZVR5cGUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdE1hcmtzQnlJZEFzeW5jKHRoaXMudmlzdWFsSWQsIHNlbGVjdGlvbnMsIHNlbGVjdGlvblVwZGF0ZVR5cGUpO1xuICB9XG5cbiAgcHVibGljIGFubm90YXRlTWFya0FzeW5jKG1hcms6IENvbnRyYWN0Lk1hcmtJbmZvLCBhbm5vdGF0aW9uVGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihtYXJrLCAnbWFyaycpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5hbm5vdGF0ZU1hcmtBc3luYyh0aGlzLnZpc3VhbElkLCBtYXJrLCBhbm5vdGF0aW9uVGV4dCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QW5ub3RhdGlvbnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxBbm5vdGF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLkFubm90YXRpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldEFubm90YXRpb25zQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQW5ub3RhdGlvbkFzeW5jKGFubm90YXRpb246IENvbnRyYWN0LkFubm90YXRpb24pIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGFubm90YXRpb24sICdhbm5vdGF0aW9uJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxBbm5vdGF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLkFubm90YXRpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbW92ZUFubm90YXRpb25Bc3luYyh0aGlzLnZpc3VhbElkLCBhbm5vdGF0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBlbmRDb250ZXh0TWVudUFzeW5jKHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBjb25maWc6IENvbnRleHRNZW51T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGVuZENvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIGNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbW92ZUNvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIG1lbnVJdGVtSWQpO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGVDb250ZXh0TWVudUFzeW5jKHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRXh0ZXJuYWxDb250ZXh0TWVudSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZXhlY3V0ZUNvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIG1lbnVJdGVtSWQpO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZUNvbnRleHRNZW51QXN5bmModGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVIZWFkZXI6IHN0cmluZywgbWVudURlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRXh0ZXJuYWxDb250ZXh0TWVudSk7XG4gICAgcmV0dXJuIHNlcnZpY2UucmVuYW1lQ29udGV4dE1lbnVBc3luYyh0aGlzLnZpc3VhbElkLndvcmtzaGVldCwgdGFyZ2V0TWVudSwgbWVudUhlYWRlciwgbWVudURlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBob3ZlclR1cGxlQXN5bmMoaG92ZXJlZFR1cGxlPzogbnVtYmVyLCB0b29sdGlwPzogVG9vbHRpcENvbnRleHQgfCBudWxsLCBhbGxvd0hvdmVyQWN0aW9ucz86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0luc2lkZURhc2hib2FyZEV4dGVuc2lvbigpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgaG92ZXJUdXBsZUFzeW5jIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFzaGJvYXJkIGV4dGVuc2lvbnNgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5ob3ZlclR1cGxlQXN5bmModGhpcy52aXN1YWxJZCwgaG92ZXJlZFR1cGxlLCB0b29sdGlwLCBhbGxvd0hvdmVyQWN0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0VHVwbGVzQXN5bmMoc2VsZWN0ZWRUdXBsZXM6IEFycmF5PG51bWJlcj4sIHNlbGVjdE9wdGlvbjogQ29udHJhY3QuU2VsZWN0T3B0aW9ucywgdG9vbHRpcD86IFRvb2x0aXBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYHNlbGVjdFR1cGxlc0FzeW5jIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFzaGJvYXJkIGV4dGVuc2lvbnNgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RUdXBsZXNBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3RlZFR1cGxlcywgc2VsZWN0T3B0aW9uLCB0b29sdGlwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb29sdGlwVGV4dEFzeW5jKHR1cGxlSWQ6IG51bWJlcik6IFByb21pc2U8U3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYGdldFRvb2x0aXBUZXh0QXN5bmMgaXMgbm90IHN1cHBvcnRlZCBpbiBkYXNoYm9hcmQgZXh0ZW5zaW9uc2ApLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxBY2Nlc3NpYmlsaXR5U2VydmljZT4oU2VydmljZU5hbWVzLkFjY2Vzc2liaWxpdHkpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFRvb2x0aXBUZXh0QXN5bmModGhpcy52aXN1YWxJZCwgdHVwbGVJZCk7XG4gIH1cblxuICBwdWJsaWMgbGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgICBDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsXG4gICAgICAgICAgYGxlYXZlTWFya05hdmlnYXRpb25Bc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QWNjZXNzaWJpbGl0eVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5BY2Nlc3NpYmlsaXR5KTtcbiAgICByZXR1cm4gc2VydmljZS5sZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZWRpdEFsaWFzZXNEaWFsb2dBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuICAgIHJldHVybiBzZXJ2aWNlLmVkaXRBbGlhc2VzRGlhbG9nQXN5bmMoZmllbGROYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGF0YVNvdXJjZUZyb21JbmZvKGRhdGFTb3VyY2VJbmZvOiBEYXRhU291cmNlSW5mbyk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VJbXBsID0gbmV3IERhdGFTb3VyY2VJbXBsKGRhdGFTb3VyY2VJbmZvLCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERhdGFTb3VyY2UoZGF0YVNvdXJjZUltcGwpO1xuICAgIGRhdGFTb3VyY2VJbXBsLmluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcyhkYXRhU291cmNlKTtcbiAgICByZXR1cm4gZGF0YVNvdXJjZTtcbiAgfVxuXG4gIHByaXZhdGUgdmVyaWZ5QWN0aXZlU2hlZXQoKSB7XG4gICAgY29uc3QgaXNSb290QW5kQWN0aXZlV29ya3NoZWV0ID0gdGhpcy5hY3RpdmU7XG4gICAgY29uc3QgaXNJbnNpZGVBY3RpdmVEYXNoYm9hcmQgPSB0aGlzLmlzSW5zaWRlQWN0aXZlRGFzaGJvYXJkKCk7XG4gICAgY29uc3QgaXNJbnNpZGVBY3RpdmVTdG9yeVBvaW50ID0gdGhpcy5pc0luc2lkZUFjdGl2ZVN0b3J5UG9pbnQoKTtcblxuICAgIGlmICghaXNSb290QW5kQWN0aXZlV29ya3NoZWV0ICYmICFpc0luc2lkZUFjdGl2ZURhc2hib2FyZCAmJiAhaXNJbnNpZGVBY3RpdmVTdG9yeVBvaW50KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuTm90QWN0aXZlU2hlZXQsICdPcGVyYXRpb24gbm90IGFsbG93ZWQgb24gbm9uLWFjdGl2ZSBzaGVldCcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNJbnNpZGVBY3RpdmVTdG9yeVBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbCAmJiB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbC5hY3RpdmU7XG4gIH1cblxuICBwcml2YXRlIGlzSW5zaWRlQWN0aXZlRGFzaGJvYXJkKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnREYXNoYm9hcmRJbXBsICYmIHRoaXMuX3BhcmVudERhc2hib2FyZEltcGwuYWN0aXZlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0luc2lkZURhc2hib2FyZEV4dGVuc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbCAhPT0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IExvZ2ljYWxUYWJsZUluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIGEgbG9naWNhbCB0YWJsZS5cbiAqIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXMganVzdCBhIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIExvZ2ljYWxUYWJsZSBpbXBsZW1lbnRzIENvbnRyYWN0LkxvZ2ljYWxUYWJsZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9sb2dpY2FsVGFibGU6IExvZ2ljYWxUYWJsZUluZm8pIHt9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sb2dpY2FsVGFibGUuaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9naWNhbFRhYmxlLmNhcHRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IFRvb2x0aXBUZXh0UmVxdWVzdCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgVG9vbHRpcFRleHRSZXF1ZXN0TW9kZWwgaW1wbGVtZW50cyBUb29sdGlwVGV4dFJlcXVlc3Qge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHZpc3VhbElkUHJlc01vZGVsOiBWaXN1YWxJZCxcbiAgICBwdWJsaWMgdHVwbGVJZDogbnVtYmVyLFxuICApIHt9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlVHlwZSwgRmlsdGVyRG9tYWluVHlwZSwgRmlsdGVyVHlwZSwgUGVyaW9kVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL2xpYi9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcblxuZXhwb3J0IGNsYXNzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgX3dvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkSWQ6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlclR5cGUoKTogRmlsdGVyVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlclR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmllbGRBc3luYygpOiBQcm9taXNlPENvbnRyYWN0LkZpZWxkPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRGaWVsZEFzeW5jKHRoaXMuX2ZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIGdldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIHNldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoYXBwbHlUb1dvcmtzaGVldHM6IEFycmF5PHN0cmluZz4pOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGFwcGx5VG9Xb3Jrc2hlZXRzLCAnYXBwbHlUb1dvcmtzaGVldHMnKTtcbiAgICBjb25zdCB1bmlxdWVXb3Jrc2hlZXRzID0gbmV3IFNldChhcHBseVRvV29ya3NoZWV0cyk7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5zZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkTmFtZSwgdGhpcy5fZmllbGRJZCwgQXJyYXkuZnJvbSh1bmlxdWVXb3Jrc2hlZXRzKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGVnb3JpY2FsRmlsdGVyIGV4dGVuZHMgRmlsdGVyIGltcGxlbWVudHMgQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+LFxuICAgIHByaXZhdGUgX2lzRXhjbHVkZU1vZGU6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNBbGxTZWxlY3RlZD86IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQWxsU2VsZWN0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwcGxpZWRWYWx1ZXMoKTogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwcGxpZWRWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXhjbHVkZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRXhjbHVkZU1vZGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgaWYgKCFkb21haW5UeXBlKSB7XG4gICAgICBkb21haW5UeXBlID0gRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudDtcbiAgICB9XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlckRvbWFpblR5cGU+KGRvbWFpblR5cGUsIEZpbHRlckRvbWFpblR5cGUsICdGaWx0ZXJEb21haW5UeXBlJyk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldENhdGVnb3JpY2FsRG9tYWluQXN5bmModGhpcy5fd29ya3NoZWV0TmFtZSwgdGhpcy5fZmllbGRJZCwgZG9tYWluVHlwZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbERhdGFWYWx1ZSBpbXBsZW1lbnRzIENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF92YWx1ZTogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX2hpZXJhcmNoaWNhbFBhdGg6IHN0cmluZyxcbiAgICBwcml2YXRlIF9sZXZlbDogbnVtYmVyLFxuICApIHt9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGllcmFyY2hpY2FsUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9oaWVyYXJjaGljYWxQYXRoO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwgaW1wbGVtZW50cyBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9uYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfbGV2ZWxTZWxlY3Rpb25TdGF0ZTogSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSxcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbFNlbGVjdGlvblN0YXRlKCk6IEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbFNlbGVjdGlvblN0YXRlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIaWVyYXJjaGljYWxGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9kaW1lbnNpb25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfaGllcmFyY2h5Q2FwdGlvbjogc3RyaW5nLFxuICAgIHByaXZhdGUgX251bWJlck9mTGV2ZWxzOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfbGV2ZWxEZXRhaWxzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbD4sXG4gICAgcHJpdmF0ZSBfYXBwbGllZFZhbHVlczogQXJyYXk8Q29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyRGF0YVZhbHVlPixcbiAgICBwcml2YXRlIF9pc0FsbFNlbGVjdGVkOiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQsIHJlZ2lzdHJ5SWQpO1xuICB9XG4gIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBDb250cmFjdC5GaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGltZW5zaW9uTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaW1lbnNpb25OYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBoaWVyYXJjaHlDYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2hpZXJhcmNoeUNhcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IG51bWJlck9mTGV2ZWxzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX251bWJlck9mTGV2ZWxzO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbERldGFpbHMoKTogQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xldmVsRGV0YWlscztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNBbGxTZWxlY3RlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBwbGllZFZhbHVlcygpOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBwbGllZFZhbHVlcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFuZ2VGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5SYW5nZUZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX21pbjogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX21heDogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX2luY2x1ZGVOdWxsVmFsdWVzOiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQsIHJlZ2lzdHJ5SWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBtaW5WYWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1heFZhbHVlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5jbHVkZU51bGxWYWx1ZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVOdWxsVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5SYW5nZURvbWFpbj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgaWYgKCFkb21haW5UeXBlKSB7XG4gICAgICBkb21haW5UeXBlID0gRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudDtcbiAgICB9XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlckRvbWFpblR5cGU+KGRvbWFpblR5cGUsIEZpbHRlckRvbWFpblR5cGUsICdGaWx0ZXJEb21haW5UeXBlJyk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRSYW5nZURvbWFpbkFzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQsIGRvbWFpblR5cGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWxhdGl2ZURhdGVGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hbmNob3JEYXRlOiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfcGVyaW9kVHlwZTogUGVyaW9kVHlwZSxcbiAgICBwcml2YXRlIF9yYW5nZVR5cGU6IERhdGVSYW5nZVR5cGUsXG4gICAgcHJpdmF0ZSBfcmFuZ2VOOiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFuY2hvckRhdGUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fYW5jaG9yRGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGVyaW9kVHlwZSgpOiBQZXJpb2RUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fcGVyaW9kVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmFuZ2VUeXBlKCk6IERhdGVSYW5nZVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJhbmdlTigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZU47XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGVnb3JpY2FsRG9tYWluIGltcGxlbWVudHMgQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfdmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+LFxuICAgIHByaXZhdGUgX2RvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHZhbHVlcygpOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IEZpbHRlckRvbWFpblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kb21haW5UeXBlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYW5nZURvbWFpbiBpbXBsZW1lbnRzIENvbnRyYWN0LlJhbmdlRG9tYWluIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX21pbjogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX21heDogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX2RvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogRmlsdGVyRG9tYWluVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2RvbWFpblR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1pbigpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1heCgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgTWFya1R5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVRhYmxlIHtcbiAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9kYXRhOiBBcnJheTxBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+PixcbiAgICBwcml2YXRlIF9jb2x1bW5zOiBBcnJheTxDb250cmFjdC5Db2x1bW4+LFxuICAgIHByaXZhdGUgX3RvdGFsUm93Q291bnQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9pc1RvdGFsUm93Q291bnRMaW1pdGVkOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lzU3VtbWFyeURhdGE6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfbWFya3NJbmZvPzogQXJyYXk8TWFya0luZm8+LFxuICApIHtcbiAgICB0aGlzLl9uYW1lID0gX2lzU3VtbWFyeURhdGEgPyAnU3VtbWFyeSBEYXRhIFRhYmxlJyA6ICdVbmRlcmx5aW5nIERhdGEgVGFibGUnO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGEoKTogQXJyYXk8QXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgcHVibGljIGdldCBjb2x1bW5zKCk6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4ge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXJrc0luZm8oKTogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWFya3NJbmZvO1xuICB9XG5cbiAgcHVibGljIGdldCB0b3RhbFJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3RvdGFsUm93Q291bnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzVG90YWxSb3dDb3VudExpbWl0ZWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzVG90YWxSb3dDb3VudExpbWl0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzU3VtbWFyeURhdGEoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3VtbWFyeURhdGE7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hcmtJbmZvIGltcGxlbWVudHMgQ29udHJhY3QuTWFya0luZm8ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfdHlwZTogTWFya1R5cGUsXG4gICAgcHJpdmF0ZSBfY29sb3I6IHN0cmluZyxcbiAgICBwcml2YXRlIF90dXBsZUlkPzogbnVtYmVyLFxuICApIHt9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IE1hcmtUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29sb3I7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR1cGxlSWQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdHVwbGVJZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29sdW1uIGltcGxlbWVudHMgQ29udHJhY3QuQ29sdW1uIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2ZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgX2ZpZWxkSWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIF9kYXRhVHlwZTogRGF0YVR5cGUsXG4gICAgcHJpdmF0ZSBfaXNSZWZlcmVuY2VkOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2luZGV4OiBudW1iZXIsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kYXRhVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNSZWZlcmVuY2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1JlZmVyZW5jZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2luZGV4O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhVmFsdWUgaW1wbGVtZW50cyBDb250cmFjdC5EYXRhVmFsdWUge1xuICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1hbnkgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3ZhbHVlOiBhbnksXG4gICAgcHJpdmF0ZSBfbmF0aXZlVmFsdWU6IGFueSxcbiAgICBwcml2YXRlIF9mb3JtYXR0ZWRWYWx1ZT86IHN0cmluZyxcbiAgICBwcml2YXRlIF9hbGlhc1ZhbHVlPzogc3RyaW5nLFxuICAgIHByaXZhdGUgX2hhc0FsaWFzPzogYm9vbGVhbixcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hdGl2ZVZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX25hdGl2ZVZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0ZWRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxpYXNWYWx1ZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9hbGlhc1ZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNBbGlhcygpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faGFzQWxpYXM7XG4gIH1cbiAgLyogdHNsaW50OmVuYWJsZTpuby1hbnkgKi9cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVSZWFkZXIgaW1wbGVtZW50cyBDb250cmFjdC5EYXRhVGFibGVSZWFkZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIF9pZDogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfdG90YWxSb3dDb3VudDogbnVtYmVyLFxuICAgIHByb3RlY3RlZCBfcGFnZVJvd0NvdW50LFxuICAgIHByaXZhdGUgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgKSB7XG4gICAgdGhpcy5fcGFnZUNvdW50ID0gTWF0aC5jZWlsKF90b3RhbFJvd0NvdW50IC8gX3BhZ2VSb3dDb3VudCk7XG4gIH1cbiAgcHJvdGVjdGVkIF9wYWdlQ291bnQ6IG51bWJlcjtcblxuICBwdWJsaWMgZ2V0IHRvdGFsUm93Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdG90YWxSb3dDb3VudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VDb3VudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYWdlQXN5bmMocGFnZU51bWJlcjogbnVtYmVyKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UmFuZ2UocGFnZU51bWJlciwgMCwgdGhpcy5fcGFnZUNvdW50KTtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0UGFnZUFzeW5jKHRoaXMuX2lkLCBwYWdlTnVtYmVyLCB0aGlzLl9wYWdlUm93Q291bnQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFsbFBhZ2VzQXN5bmMobWF4Um93cz86IG51bWJlcik6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgZmlyc3RQYWdlOiBDb250cmFjdC5EYXRhVGFibGUgPSBhd2FpdCB0aGlzLmdldFBhZ2VBc3luYygwKTtcbiAgICBtYXhSb3dzID0gbWF4Um93cyB8fCB0aGlzLnRvdGFsUm93Q291bnQ7XG4gICAgY29uc3Qgcm93c1JlcXVlc3RlZCA9IE1hdGgubWluKG1heFJvd3MsIHRoaXMudG90YWxSb3dDb3VudCk7XG4gICAgY29uc3QgcGFnZXNSZXF1ZXN0ZWQgPSBNYXRoLmNlaWwocm93c1JlcXVlc3RlZCAvIHRoaXMuX3BhZ2VSb3dDb3VudCk7XG5cbiAgICAvLyBGZXRjaCB1cCB0byA0MDAgcGFnZXMsIHdpdGggYSBkZWZhdWx0IG9mIDEwLDAwMCBwYWdlUm93Q291bnQgdGhhdCBnaXZlcyB1cyA0LDAwMCwwMDAgcm93c1xuICAgIGNvbnN0IHBhZ2VzVG9GZXRjaCA9IE1hdGgubWluKHBhZ2VzUmVxdWVzdGVkLCA0MDApO1xuICAgIGNvbnN0IGlzRGF0YUxpbWl0ZWQgPSBwYWdlc1RvRmV0Y2ggPCBwYWdlc1JlcXVlc3RlZDtcbiAgICBsZXQgcmVtYWluaW5nRGF0YTogQXJyYXk8QXJyYXk8QXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPj4+ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwYWdlc1RvRmV0Y2g7IGkrKykge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHRoaXMuZ2V0UGFnZUFzeW5jKGkpO1xuICAgICAgcmVtYWluaW5nRGF0YS5wdXNoKHBhZ2UuZGF0YSk7XG4gICAgfVxuXG4gICAgbGV0IGZ1bGxEYXRhID0gZmlyc3RQYWdlLmRhdGEuY29uY2F0KC4uLnJlbWFpbmluZ0RhdGEpO1xuICAgIC8vIFRoaXMgc2xpY2VzIHRoZSBhcnJheSBvbmx5IGlmIG1heFJvd3MgaGFzIGJlZW4gc2V0IGFuZCBpcyBsZXNzIHRoYW4gdG90YWxSb3dDb3VudFxuICAgIGZ1bGxEYXRhLmxlbmd0aCA9IHJvd3NSZXF1ZXN0ZWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogZmlyc3RQYWdlLm5hbWUsXG4gICAgICBkYXRhOiBmdWxsRGF0YSxcbiAgICAgIGNvbHVtbnM6IGZpcnN0UGFnZS5jb2x1bW5zLFxuICAgICAgdG90YWxSb3dDb3VudDogaXNEYXRhTGltaXRlZCA/IHBhZ2VzVG9GZXRjaCAqIHRoaXMuX3BhZ2VSb3dDb3VudCA6IHJvd3NSZXF1ZXN0ZWQsXG4gICAgICBpc1RvdGFsUm93Q291bnRMaW1pdGVkOiBpc0RhdGFMaW1pdGVkLFxuICAgICAgaXNTdW1tYXJ5RGF0YTogZmlyc3RQYWdlLmlzU3VtbWFyeURhdGEsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyByZWxlYXNlQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbGVhc2VBc3luYyh0aGlzLl9pZCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFRvb2x0aXBDb250ZXh0IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEhvdmVyVHVwbGVJbnRlcmFjdGlvbiwgU2VsZWN0T3B0aW9ucywgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb24sIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBTZWxlY3Rpb24gTW9kZWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25Nb2RlbCB7XG4gIHB1YmxpYyBxdWFsaWZpZWRGaWVsZENhcHRpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBWYWx1ZSBiYXNlZCBzZWxlY3Rpb24gbW9kZWwuIE1lYW50IGZvciBoaWVyYXJjaGljYWwsIHJhbmdlIGFuZCBjYXRlZ29yaWNhbCBzZWxlY3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgVmFsdWVTZWxlY3Rpb25Nb2RlbCBleHRlbmRzIFNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHNlbGVjdFZhbHVlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xufVxuXG4vKipcbiAqIEhpZXJhcmNoaWNhbCB2YWx1ZSBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgVmFsdWVTZWxlY3Rpb25Nb2RlbCB7fVxuXG4vKipcbiAqIFJhbmdlIGJhc2VkIHZhbHVlIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgUmFuZ2VTZWxlY3Rpb25Nb2RlbCBleHRlbmRzIFNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIG1pblZhbHVlOiBzdHJpbmc7XG4gIHB1YmxpYyBtYXhWYWx1ZTogc3RyaW5nO1xuICBwdWJsaWMgaW5jbHVkZWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEaW1lbnNpb24gdmFsdWUgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBEaW1lbnNpb25TZWxlY3Rpb25Nb2RlbCBleHRlbmRzIFZhbHVlU2VsZWN0aW9uTW9kZWwge31cbi8qKlxuICogVHVwbGUgYmFzZWQgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBUdXBsZVNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHNlbGVjdGlvblR5cGU6IHN0cmluZztcbiAgcHVibGljIG9iamVjdElkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xufVxuXG4vKipcbiAqIENvbnRhaW5lciBjbGFzcyB0byBwb3B1bGF0ZSBhbGwgdGhlIHNlbGVjdGlvbiBtb2RlbHMgd2hlbiBwYXJzaW5nIGlucHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICBwdWJsaWMgaGllck1vZGVsQXJyOiBBcnJheTxIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbD4gPSBbXTtcbiAgcHVibGljIGRpbU1vZGVsQXJyOiBBcnJheTxEaW1lbnNpb25TZWxlY3Rpb25Nb2RlbD4gPSBbXTtcbiAgcHVibGljIHF1YW50TW9kZWxBcnI6IEFycmF5PFJhbmdlU2VsZWN0aW9uTW9kZWw+ID0gW107XG4gIHB1YmxpYyBzZWxlY3Rpb246IFR1cGxlU2VsZWN0aW9uTW9kZWw7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbk1vZGVsIGltcGxlbWVudHMgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb24ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHZpc3VhbElkUHJlc01vZGVsOiBWaXN1YWxJZCxcbiAgICBwdWJsaWMgdHVwbGVJZHM6IEFycmF5PG51bWJlcj4gPSBbXSxcbiAgICBwdWJsaWMgc2VsZWN0T3B0aW9uczogU2VsZWN0T3B0aW9ucyxcbiAgICBwdWJsaWMgdG9vbHRpcENvbnRleHQ/OiBUb29sdGlwQ29udGV4dCxcbiAgKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgSG92ZXJUdXBsZUludGVyYWN0aW9uTW9kZWwgaW1wbGVtZW50cyBIb3ZlclR1cGxlSW50ZXJhY3Rpb24ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHZpc3VhbElkUHJlc01vZGVsOiBWaXN1YWxJZCxcbiAgICBwdWJsaWMgdHVwbGVJZDogbnVtYmVyLFxuICAgIHB1YmxpYyB0b29sdGlwQ29udGV4dD86IFRvb2x0aXBDb250ZXh0IHwgbnVsbCxcbiAgICBwdWJsaWMgYWxsb3dIb3ZlckFjdGlvbnM/OiBib29sZWFuLFxuICApIHt9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgUG9pbnQgaW1wbGVtZW50cyBDb250cmFjdC5Qb2ludCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF94OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfeTogbnVtYmVyLFxuICApIHt9XG5cbiAgcHVibGljIGdldCB4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3g7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHkoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5feTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2VSZWdpc3RyeSc7XG5cbi8qKlxuICogRGVmaW5lcyB3aGljaCB0eXBlIG9mIGdldERhdGEgY2FsbCB0byBtYWtlLlxuICovXG5leHBvcnQgZW51bSBHZXREYXRhVHlwZSB7XG4gIFN1bW1hcnkgPSAnc3VtbWFyeScsXG4gIFVuZGVybHlpbmcgPSAndW5kZXJseWluZycsXG59XG5cbi8qKlxuICogU2VydmljZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBsb2dpYyBmb3IgdmFyaW91cyBnZXREYXRhIGNhbGxzXG4gKlxuICogQGludGVyZmFjZSBHZXREYXRhU2VydmljZVxuICogQGV4dGVuZHMge0FwaVNlcnZpY2V9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RGF0YVNlcnZpY2UgZXh0ZW5kcyBBcGlTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpbWl0IG9mIHJvd3MgZm9yIGdldFVuZGVybHlpbmdEYXRhQXN5bmNcbiAgICovXG4gIGdldE1heFJvd0xpbWl0KCk6IG51bWJlcjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgdW5kZXJseWluZyBkYXRhIGZvciBhIHBhcnRpY3VsYXIgdmlzdWFsXG4gICAqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7R2V0RGF0YVR5cGV9IGdldFR5cGUgIFRoZSB0eXBlIG9mIGdldERhdGEgY2FsbCB0byBtYWtlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBvciBub3QgYWxpYXNlcyBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBvciBub3Qgc2VsZWN0aW9uIHNob3VsZCBiZSBpZ25vcmVkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFNob3VsZCBhbGwgY29sdW1ucyBiZSBpbmNsdWRlZFxuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyAgTWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXR1cm5cbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGdldFR5cGU6IEdldERhdGFUeXBlLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlUm93Q291bnQgVGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlLiBUaGUgZGVmYXVsdCBhbmQgbWF4aW11bSBpcyAxMCwwMDAgcm93cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFNob3VsZCBhbGwgY29sdW1ucyBiZSBpbmNsdWRlZFxuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj59ICBEYXRhIHRhYmxlIHJlYWRlciB0byBhY2Nlc3MgdGhlIHVuZGVybHlpbmcgZGF0YVxuICAgKi9cbiAgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICAgIGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWFya3MgZm9yIGEgZ2l2ZW4gdmlzdWFsXG4gICAqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFjdGl2ZU1hcmtzPn0gIENvbGxlY3Rpb24gb2YgZGF0YSB0YWJsZXMgd2l0aCB0aGUgYWN0aXZlIG1hcmtzXG4gICAqL1xuICBnZXRTZWxlY3RlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgbWFya3MgZm9yIGEgZ2l2ZW4gdmlzdWFsXG4gICAqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFjdGl2ZU1hcmtzPn0gIENvbGxlY3Rpb24gb2YgZGF0YSB0YWJsZXMgd2l0aCB0aGUgYWN0aXZlIG1hcmtzXG4gICAqL1xuICBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNvdXJjZUlkICBUaGUgaWQgb2YgdGhlIGRhdGFzb3VyY2VcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGUgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IGNhcHRpb24uIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IG5hbWUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgIGRhdGFzb3VyY2VJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhc291cmNlSWQgIFRoZSBpZCBvZiB0aGUgZGF0YXNvdXJjZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naWNhbFRhYmxlSWQgIFRoZSBpZCBvZiB0aGUgbG9nY2lhbCB0YWJsZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSb3dzIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZSBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgY2FwdGlvbi4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgbmFtZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhcbiAgICBkYXRhc291cmNlSWQ6IHN0cmluZyxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhc291cmNlSWQgIFRoZSBpZCBvZiB0aGUgZGF0YXNvdXJjZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naWNhbFRhYmxlSWQgIFRoZSBpZCBvZiB0aGUgbG9nY2lhbCB0YWJsZVxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZVJvd0NvdW50IFRoZSBudW1iZXIgb2Ygcm93cyBwZXIgcGFnZS4gVGhlIGRlZmF1bHQgYW5kIG1heGltdW0gaXMgMTAsMDAwIHJvd3MuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgbmFtZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICBkYXRhc291cmNlSWQ6IHN0cmluZyxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVTZWxlY3Rpb24gIFdoZXRoZXIgc2VsZWN0aW9ucyBpbiB0aGlzIHZpeiBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBbGxDb2x1bW5zICBXaGV0aGVyIHRvIGluY2x1ZGUgYWxsIGNvbHVtbnMgb3Igb25seSB0aGUgcmVmZXJlbmNlZCBjb2x1bW5zXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbHVtbnNUb0luY2x1ZGVCeUlkIE92ZXJyaWRlcyBpbmNsdWRlQWxsQ29sdW1ucywgbGlzdHMgdGhlIGNvbHVtbnMgdG8gaW5jbHVkZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSb3dzIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VSb3dDb3VudCBUaGUgbnVtYmVyIG9mIHJvd3MgcGVyIHBhZ2UuIFRoZSBkZWZhdWx0IGFuZCBtYXhpbXVtIGlzIDEwLDAwMCByb3dzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlU2VsZWN0aW9uICBXaGV0aGVyIHNlbGVjdGlvbnMgaW4gdGhpcyB2aXogc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQWxsQ29sdW1ucyAgV2hldGhlciB0byBpbmNsdWRlIGFsbCBjb2x1bW5zIG9yIG9ubHkgdGhlIHJlZmVyZW5jZWQgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmcsXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICovXG4gIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB0YWJsZUlkICAgICBUaGUgdGFibGUgaWQgdXNlZCB0byBmZXRjaCBkYXRhLlxuICAgKiBAcGFyYW0gcGFnZU51bWJlciAgVGhlIHBhZ2UgbnVtYmVyICh6ZXJvLWJhc2VkKS5cbiAgICogQHBhcmFtIHBhZ2VTaXplICAgIFRoZSBwYWdlIHNpemUgb2YgdGhlIG93bmluZyBEYXRhVGFibGVSZWFkZXJcbiAgICogQHJldHVybnMgICAgICAgICAgIEEgRGF0YVRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBwYWdlLiBUaGUgbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWRcbiAgICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSBsZXNzIHRoYW4gcmVxdWVzdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEuXG4gICAqL1xuICBnZXRQYWdlQXN5bmModGFibGVJZDogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB0YWJsZUlkICAgICBUaGUgdGFibGUgaWQgdXNlZCB0byBmZXRjaCBkYXRhLlxuICAgKi9cbiAgcmVsZWFzZUFzeW5jKHRhYmxlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSAnLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0FjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9BbmltYXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBBbm5vdGF0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvQW5ub3RhdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9EYXRhU291cmNlU2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXhwb3J0U2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRXhwb3J0U2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9GaWx0ZXJTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvR2V0RGF0YVNlcnZpY2VJbXBsJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9QYXJhbWV0ZXJzU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvU2VsZWN0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2l6ZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1NpemVTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBWaXN1YWxNb2RlbFNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1Zpc3VhbE1vZGVsU2VydmljZUltcGwnO1xuaW1wb3J0IHsgVml6U2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvVml6U2VydmljZUltcGwnO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1pvbmVTZXJ2aWNlSW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFsbFNoYXJlZFNlcnZpY2VzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgcmVnaXN0cnlJZDogbnVtYmVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBBbmltYXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBEYXRhU291cmNlU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRXhwb3J0U2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgR2V0RGF0YVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEZpbHRlclNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFBhcmFtZXRlcnNTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBTZWxlY3Rpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBBbm5vdGF0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgWm9uZVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFNpemVTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBWaXN1YWxNb2RlbFNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFZpelNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBBY2Nlc3NpYmlsaXR5U2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIEJhc2UgaW50ZXJmYWNlIGZvciBhbiBhcGkgc2VydmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaVNlcnZpY2Uge1xuICAvKipcbiAgICogR2V0cyB0aGUgbmFtZSBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb2xsZWN0aW9uIG9mIHNlcnZpY2UgbmFtZSB3aGljaCB3aWxsIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIGFwaS1zaGFyZWQgcHJvamVjdFxuICovXG5leHBvcnQgY29uc3QgZW51bSBTZXJ2aWNlTmFtZXMge1xuICBBY2Nlc3NpYmlsaXR5ID0gJ2FjY2Vzc2liaWxpdHknLFxuICBBdXRoZW50aWNhdGlvbiA9ICdhdXRoZW50aWNhdGlvbicsXG4gIENsaWVudEluZm8gPSAnY2xpZW50LWluZm8tc2VydmljZScsXG4gIERhdGFTb3VyY2VTZXJ2aWNlID0gJ2RhdGEtc291cmNlLXNlcnZpY2UnLFxuICBHZXREYXRhID0gJ2dldC1kYXRhLXNlcnZpY2UnLFxuICBGaWx0ZXIgPSAnZmlsdGVyLXNlcnZpY2UnLFxuICBOb3RpZmljYXRpb24gPSAnbm90aWZpY2F0aW9uLXNlcnZpY2UnLFxuICBQYXJhbWV0ZXJzID0gJ3BhcmFtZXRlcnMtc2VydmljZScsXG4gIFNlbGVjdGlvbiA9ICdzZWxlY3Rpb24tc2VydmljZScsXG4gIEFubm90YXRpb24gPSAnYW5ub3RhdGlvbi1zZXJ2aWNlJyxcbiAgWm9uZSA9ICd6b25lLXNlcnZpY2UnLFxuICBBbmltYXRpb24gPSAnYW5pbWF0aW9uLXNlcnZpY2UnLFxuICBWaXogPSAndml6LXNlcnZpY2UnLFxuICBFeHRlcm5hbENvbnRleHRNZW51ID0gJ2V4dGVybmFsLWNvbnRleHQtbWVudS1zZXJ2aWNlJyxcbiAgSW5pdGlhbGl6YXRpb24gPSAnaW5pdGlhbGl6YXRpb24tc2VydmljZScsXG4gIFN0b3J5QWN0aXZhdGlvbiA9ICdzdG9yeS1hY3RpdmF0aW9uLXNlcnZpY2UnLFxuICBTaXplID0gJ3NpemUtc2VydmljZScsXG4gIEV4cG9ydCA9ICdleHBvcnQtc2VydmljZScsXG4gIFZpc3VhbE1vZGVsID0gJ3Zpc3VhbC1tb2RlbC1zZXJ2aWNlJyxcbn1cblxuLyoqXG4gKiBEbyBzb21lIGdsb2JhbCBkZWNsYXJhdGlvbnMgc28gd2UgY2FuIGNyZWF0ZSBhIHNpbmdsZXRvbiBvbiB0aGUgd2luZG93IG9iamVjdFxuICovXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIF9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeTogeyBbcmVnaXN0cnlJZDogbnVtYmVyXTogU2VydmljZVJlZ2lzdHJ5IH07XG4gIH1cbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgPSB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5IHx8IHt9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBuZXcgc2VydmljZSBpbnRvIHRoZSBzZXJ2aWNlIHJlZ2lzdHJ5LiBBbnkgZXhpc3Rpbmcgb25lIHdpbGxcbiAgICogYmUgb3ZlcndyaXR0ZW4uIHRoZSBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQgdW5kZXIgc2VydmljZS5zZXJ2aWNlTmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge0FwaVNlcnZpY2V9IHNlcnZpY2UgVGhlIHNlcnZpdmUgdG8gcmVnaXN0ZXJcbiAgICovXG4gIHJlZ2lzdGVyU2VydmljZShzZXJ2aWNlOiBBcGlTZXJ2aWNlKTogdm9pZDtcblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBnaXZlbiBzZXJ2aWNlIGZyb20gdGhlIHJlZ2lzdHJ5LiBJZiB0aGVyZSBpcyBub3QgYVxuICAgKiBzZXJ2aWNlIHJlZ2lzdGVyZWQgdW5kZXIgdGhhdCBuYW1lLCB0aHJvd3MgYW5kIGVycm9yXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHRoZSBzZXJ2aWNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXJ2aWNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZS5cbiAgICogQHJldHVybnMge1R9IFRoZSByZXF1ZXN0ZWQgc2VydmljZVxuICAgKi9cbiAgZ2V0U2VydmljZTxUIGV4dGVuZHMgQXBpU2VydmljZT4oc2VydmljZU5hbWU6IHN0cmluZyk6IFQ7XG59XG5cbmNsYXNzIFNlcnZpY2VSZWdpc3RyeUltcGwgaW1wbGVtZW50cyBTZXJ2aWNlUmVnaXN0cnkge1xuICBwcml2YXRlIF9zZXJ2aWNlczogeyBbc2VydmljZU5hbWU6IHN0cmluZ106IEFwaVNlcnZpY2UgfTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fc2VydmljZXMgPSB7fTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlclNlcnZpY2Uoc2VydmljZTogQXBpU2VydmljZSk6IHZvaWQge1xuICAgIHRoaXMuX3NlcnZpY2VzW3NlcnZpY2Uuc2VydmljZU5hbWVdID0gc2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZXJ2aWNlPFQgZXh0ZW5kcyBBcGlTZXJ2aWNlPihzZXJ2aWNlTmFtZTogc3RyaW5nKTogVCB7XG4gICAgaWYgKCF0aGlzLl9zZXJ2aWNlcy5oYXNPd25Qcm9wZXJ0eShzZXJ2aWNlTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgU2VydmljZSBub3QgcmVnaXN0ZXJlZDogJHtzZXJ2aWNlTmFtZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2VydmljZXNbc2VydmljZU5hbWVdIGFzIFQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTdGF0aWMgY2xhc3MgdXNlZCBmb3IgZ2V0dGluZyBhY2Nlc3MgdG8gdGhlIHNpbmdsZSBpbnN0YW5jZVxuICogb2YgdGhlIEFwaVNlcnZpY2VSZWdpc3RyeSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlZ2lzdHJ5SWQuXG4gKlxuICogRXh0ZW5zaW9ucyBieSBkZXNpZ24gZG9uJ3QgbmVlZCB0byBzdG9yZS9hY2Nlc3MgbXVsdGlwbGUgc2VydmljZSByZWdpc3RyaWVzLiBUaGVpciBzaW5nbGUgaW5zdGFuY2Ugb2YgU2VydmljZVJlZ2lzdHJ5IGlzXG4gKiBzdG9yZWQvYWNjZXNzIHdpdGggcmVnaXN0cnlJZCA9IDAuXG4gKlxuICogV2hlcmVhcyBFbWJlZGRpbmcgbmVlZHMgdG8gYmUgYXdhcmUgb2Ygd2hpY2ggU2VydmljZVJlZ2lzdHJ5IHRvIHVzZSB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSB2aXp6ZXMgZW1iZWRkZWQuXG4gKiBBbiBleGFtcGxlIG9mIGhvdyB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5IHdpbGwgbG9vayB3aGVuIHRoZXJlIGFyZSB0d28gdml6emVzOiB7IDAgOiBTZXJ2aWNlUmVnaXN0cnksIDEgOiBTZXJ2aWNlUmVnaXN0cnl9XG4gKiB3aGVyZSByZWdpc3RyeSBJRCBvZiAwICYgMSByZWZlcnMgdG8gdml6J3MgaW50ZXJuYWwgaWRlbnRpZmllciAod2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IFZpek1hbmFnZXIpLlxuICovXG5leHBvcnQgY2xhc3MgQXBpU2VydmljZVJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgU2VydmljZVJlZ2lzdHJ5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldChyZWdpc3RyeUlkOiBudW1iZXIpOiBTZXJ2aWNlUmVnaXN0cnkge1xuICAgIGlmICghd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB8fCAhd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeVtyZWdpc3RyeUlkXSkge1xuICAgICAgQXBpU2VydmljZVJlZ2lzdHJ5LnNldEluc3RhbmNlKHJlZ2lzdHJ5SWQsIG5ldyBTZXJ2aWNlUmVnaXN0cnlJbXBsKCkpO1xuICAgIH1cblxuICAgIGlmICghd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeVtyZWdpc3RyeUlkXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdTZXJ2aWNlIHJlZ2lzdHJ5IGZhaWxlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5W3JlZ2lzdHJ5SWRdO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdGhhdCBzZXRzIHRoZSBzZXJ2aWNlIHJlZ2lzdHJ5IGluc3RhbmNlIGZvciB0aGUgY29ycmVzcG9uZGluZyByZWdpc3RyeUlkLiBDYW4gYmUgdXNlZCBieSB1bml0IHRlc3RzXG4gICAqXG4gICAqIEBwYXJhbSB7U2VydmljZVJlZ2lzdHJ5fSBzZXJ2aWNlUmVnaXN0cnkgVGhlIG5ldyByZWdpc3RyeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRJbnN0YW5jZShyZWdpc3RyeUlkOiBudW1iZXIsIHNlcnZpY2VSZWdpc3RyeTogU2VydmljZVJlZ2lzdHJ5KTogdm9pZCB7XG4gICAgaWYgKCF3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5KSB7XG4gICAgICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5ID0ge307XG4gICAgfVxuICAgIHdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0gPSBzZXJ2aWNlUmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogT25seSB1c2VkIGJ5IHVuaXQgdGVzdHNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY2xlYXJSZWdpc3RyeSgpOiB2b2lkIHtcbiAgICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5ID0ge307XG4gIH1cblxuICAvLyBQcml2YXRlIHRvIGF2b2lkIGFueW9uZSBjb25zdHJ1Y3RpbmcgdGhpc1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgVmVyYklkLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUb29sdGlwVGV4dFJlcXVlc3RNb2RlbCB9IGZyb20gJy4uLy4uL01vZGVscy9BY2Nlc3NpYmlsaXR5TW9kZWxzJztcbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vQWNjZXNzaWJpbGl0eVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuQWNjZXNzaWJpbGl0eTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb29sdGlwVGV4dEFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgdHVwbGVJZDogbnVtYmVyKTogUHJvbWlzZTxTdHJpbmc+IHtcbiAgICBsZXQgdG9vbHRpcFRleHRSZXF1ZXN0ID0gbmV3IFRvb2x0aXBUZXh0UmVxdWVzdE1vZGVsKHZpc3VhbElkLCB0dXBsZUlkKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRUb29sdGlwVGV4dEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Ub29sdGlwVGV4dFJlcXVlc3RdOiB0b29sdGlwVGV4dFJlcXVlc3QsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFRvb2x0aXBUZXh0LCBwYXJhbWV0ZXJzKS50aGVuPFN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIFN0cmluZztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2xlYXZlTWFya05hdmlnYXRpb25Bc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuUmFpc2VMZWF2ZU1hcmtOYXZOb3RpZmljYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFJlcGxheVNwZWVkVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyBhcyBFeHRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uLy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQW5pbWF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgQW5pbWF0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBBbmltYXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuQW5pbWF0aW9uO1xuICB9XG5cbiAgcHVibGljIHJlcGxheUFzeW5jKHJlcGxheVNwZWVkOiBSZXBsYXlTcGVlZFR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLlJlcGxheVNwZWVkXTogMS4wLFxuICAgIH07XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFJlcGxheVNwZWVkVHlwZT4ocmVwbGF5U3BlZWQsIFJlcGxheVNwZWVkVHlwZSwgJ1JlcGxheVNwZWVkVHlwZScpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUmVwbGF5U3BlZWRdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLnNldFJlcGxheVNwZWVkVHlwZS5jb252ZXJ0KHJlcGxheVNwZWVkKTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlcGxheUFuaW1hdGlvbiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFubm90YXRlRW51bSwgQW5ub3RhdGlvbiwgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyLCBUdXBsZVNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vTW9kZWxzL1NlbGVjdGlvbk1vZGVscyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgQW5ub3RhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Bbm5vdGF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgQW5ub3RhdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQW5ub3RhdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBhbm5vdGF0ZSBhIG1hcmsgb24gdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBtYXJrXG4gICAqIEBwYXJhbSBhbm5vdGF0aW9uVGV4dFxuICAgKi9cbiAgcHVibGljIGFubm90YXRlTWFya0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgbWFyazogQ29udHJhY3QuTWFya0luZm8sIGFubm90YXRpb25UZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gdGhpcy5wYXJzZU1hcmtTZWxlY3Rpb25JZHMoW21hcmtdKTtcbiAgICBjb25zdCBkdW1teVRhcmdldFBvaW50ID0geyB4OiAwLCB5OiAwIH07XG4gICAgY29uc3QgZm9ybWF0dGVkVGV4dCA9IGA8Zm9ybWF0dGVkLXRleHQ+PHJ1bj4ke2Fubm90YXRpb25UZXh0fTwvcnVuPjwvZm9ybWF0dGVkLXRleHQ+YDtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhbm5vdGF0ZU1hcmtBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Bbm5vdGF0ZUVudW1dOiBBbm5vdGF0ZUVudW0uTWFyayxcbiAgICAgIFtQYXJhbWV0ZXJJZC5UYXJnZXRQb2ludF06IGR1bW15VGFyZ2V0UG9pbnQsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uTGlzdF06IFtzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb25dLFxuICAgICAgW1BhcmFtZXRlcklkLkZvcm1hdHRlZFRleHRdOiBmb3JtYXR0ZWRUZXh0LFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuQ3JlYXRlQW5ub3RhdGlvbiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIEV4cGVjdGluZyBhbiBlbXB0eSBtb2RlbCBhbmQgaGVuY2UgdGhlIHZvaWQgcmVzcG9uc2UuXG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHJldHJpZXZlIGFubm90YXRpb25zIGZvciB0aGUgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8QW5ub3RhdGlvbj4+fVxuICAgKi9cbiAgcHVibGljIGdldEFubm90YXRpb25zQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRBbm5vdGF0aW9uc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0QW5ub3RhdGlvbnMsIHBhcmFtZXRlcnMpLnRoZW48QXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgYW5ub3RhdGlvbnNMaXN0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PEFubm90YXRpb24+O1xuICAgICAgcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkZpbHRlck1hcChhbm5vdGF0aW9uc0xpc3QpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byByZW1vdmUgYW4gYW5ub3RhdGlvbiBmcm9tIGEgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHBhcmFtIGFubm90YXRpb25cbiAgICovXG4gIHB1YmxpYyByZW1vdmVBbm5vdGF0aW9uQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VBbm5vdGF0aW9uU2VsZWN0aW9uSWRzKFthbm5vdGF0aW9uXSk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVtb3ZlQW5ub3RhdGlvbkFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvbkxpc3RdOiBbc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uXSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlbW92ZUFubm90YXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBwcmVwYXJlIHRoZSBwcmVzIG1vZGVscyBmb3Igc2VsZWN0aW9uIGJ5IE1hcmtzSW5mb1xuICAgKiBAcGFyYW0gbWFya3NcbiAgICovXG4gIHByaXZhdGUgcGFyc2VNYXJrU2VsZWN0aW9uSWRzKG1hcmtzOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IGlkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG4gICAgbWFya3MuZm9yRWFjaCgobWFyaykgPT4ge1xuICAgICAgY29uc3QgdHVwbGVJZDogbnVtYmVyIHwgdW5kZWZpbmVkID0gbWFyay50dXBsZUlkO1xuICAgICAgaWYgKHR1cGxlSWQgIT09IHVuZGVmaW5lZCAmJiB0dXBsZUlkICE9PSBudWxsICYmIHR1cGxlSWQgPiAwKSB7XG4gICAgICAgIGlkcy5wdXNoKHR1cGxlSWQudG9TdHJpbmcoKSk7IC8vIGNvbGxlY3QgdGhlIHR1cGxlIGlkc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIHR1cGxlSWQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgLy8gdHVwbGUgaWRzIGJhc2VkIHNlbGVjdGlvblxuICAgICAgY29uc3QgdHVwbGVTZWxlY3Rpb25Nb2RlbDogVHVwbGVTZWxlY3Rpb25Nb2RlbCA9IG5ldyBUdXBsZVNlbGVjdGlvbk1vZGVsKCk7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLnNlbGVjdGlvblR5cGUgPSAndHVwbGVzJztcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwub2JqZWN0SWRzID0gaWRzO1xuICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uID0gdHVwbGVTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBwcmVwYXJlIHRoZSBwcmVzIG1vZGVscyBmb3Igc2VsZWN0aW9uIGJ5IE1hcmtBbm5vdGF0aW9uSW5mb1xuICAgKiBAcGFyYW0gbWFya3NcbiAgICovXG4gIHByaXZhdGUgcGFyc2VBbm5vdGF0aW9uU2VsZWN0aW9uSWRzKGFubm90YXRpb25zOiBBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPik6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gICAgY29uc3QgaWRzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IG5ldyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIoKTtcbiAgICBhbm5vdGF0aW9ucy5mb3JFYWNoKChhbm5vdGF0aW9uKSA9PiB7XG4gICAgICBjb25zdCBhbm5vdGF0aW9uSWQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IGFubm90YXRpb24uYW5ub3RhdGlvbklkO1xuICAgICAgaWYgKGFubm90YXRpb25JZCAhPT0gdW5kZWZpbmVkICYmIGFubm90YXRpb25JZCAhPT0gbnVsbCAmJiBhbm5vdGF0aW9uSWQgPj0gMCkge1xuICAgICAgICBpZHMucHVzaChhbm5vdGF0aW9uSWQudG9TdHJpbmcoKSk7IC8vIGNvbGxlY3QgdGhlIGFubm90YXRpb24gaWRzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgYW5ub3RhdGlvbklkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IDApIHtcbiAgICAgIC8vIGFubm90YXRpb24gaWRzIGJhc2VkIHNlbGVjdGlvblxuICAgICAgY29uc3QgdHVwbGVTZWxlY3Rpb25Nb2RlbDogVHVwbGVTZWxlY3Rpb25Nb2RlbCA9IG5ldyBUdXBsZVNlbGVjdGlvbk1vZGVsKCk7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLnNlbGVjdGlvblR5cGUgPSAnYW5ub3RhdGlvbnMnO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5vYmplY3RJZHMgPSBpZHM7XG4gICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb24gPSB0dXBsZVNlbGVjdGlvbk1vZGVsO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZWxDb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIG1hcCBBbm5vdGF0aW9uIHRvIE1hcmtBbm5vdGF0aW9uSW5mb1xuICAgKiBAcGFyYW0gYW5ub3RhdGlvblxuICAgKiBAcmV0dXJucyB7QW5ub3RhdGlvbn1cbiAgICovXG4gIHByaXZhdGUgbWFwQW5ub3RhdGlvbihhbm5vdGF0aW9uOiBBbm5vdGF0aW9uKTogQ29udHJhY3QuQW5ub3RhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFubm90YXRpb25IVE1MOiBhbm5vdGF0aW9uLmFubm90YXRpb25UZXh0LFxuICAgICAgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uLmFubm90YXRpb25JZCxcbiAgICAgIGFubm90YXRpb25UZXh0OiBhbm5vdGF0aW9uLmFubm90YXRpb25QbGFpblRleHQsXG4gICAgICBhbm5vdGF0aW9uVHlwZTogSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmFubm90YXRpb25UeXBlLmNvbnZlcnQoYW5ub3RhdGlvbi5hbm5vdGF0ZUVudW0pLFxuICAgICAgdHVwbGVJZDogYW5ub3RhdGlvbi50dXBsZUlkISxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciB0aGUgQW5ub3RhdGlvbnMgdG8gTWFyayBBbm5vdGF0aW9ucywgYW5kIG1hcCB0aGVtIHRvIE1hcmtBbm5vdGF0aW9uSW5mb1xuICAgKiBAcGFyYW0gYW5ub3RhdGlvbnNcbiAgICogQHJldHVybnMge0FycmF5PEFubm90YXRpb24+fVxuICAgKi9cbiAgcHJpdmF0ZSBhbm5vdGF0aW9uRmlsdGVyTWFwKGFubm90YXRpb25zOiBBcnJheTxBbm5vdGF0aW9uPik6IEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+IHtcbiAgICBjb25zdCBhbm5vdGF0aW9uSW5mb3MgPSBhbm5vdGF0aW9ucy5tYXAoKGFubm90YXRpb24pID0+IHRoaXMubWFwQW5ub3RhdGlvbihhbm5vdGF0aW9uKSk7XG5cbiAgICByZXR1cm4gYW5ub3RhdGlvbkluZm9zO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFbWJlZGRpbmdCb290c3RyYXBJbmZvLCBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDbGllbnRJbmZvU2VydmljZSB9IGZyb20gJy4uL0NsaWVudEluZm9TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBDbGllbnRJbmZvU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBDbGllbnRJbmZvU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkNsaWVudEluZm87XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2xpZW50SW5mb0FzeW5jKCk6IFByb21pc2U8RW1iZWRkaW5nQm9vdHN0cmFwSW5mbz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RW1iZWRkaW5nQ2xpZW50SW5mbztcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q2xpZW50SW5mb0FzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEVtYmVkZGluZ0Jvb3RzdHJhcEluZm8+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY2xpZW50SW5mbyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFbWJlZGRpbmdCb290c3RyYXBJbmZvO1xuICAgICAgcmV0dXJuIGNsaWVudEluZm87XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnksXG4gIERhdGFTY2hlbWEsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXIsXG4gIExvZ2ljYWxUYWJsZUluZm8sXG4gIFBhcmFtZXRlcklkLFxuICBUYWJsZUluZm8sXG4gIFRhYmxlSW5mb3MsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vRGF0YVNvdXJjZSc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4uLy4uL0ZpZWxkJztcbmltcG9ydCB7IERhdGFTb3VyY2VJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0ZpZWxkSW1wbCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRGF0YVNvdXJjZVNlcnZpY2UgfSBmcm9tICcuLi9EYXRhU291cmNlU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuZXhwb3J0IGNsYXNzIERhdGFTb3VyY2VTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIERhdGFTb3VyY2VTZXJ2aWNlIHtcbiAgLy8gU2luY2UgT2JqZWN0IE1vZGVsIGlzIHN1cHBvcnRlZCBzaW5jZSBUYWJsZWF1IDIwMjAuMiwgRGF0YVNvdXJjZVNlcnZpY2VJbXBsIGNhbiBiZSBpbml0aWFsaXplZCB3aXRoIHRoZVxuICAvLyBwbGF0Zm9ybSB2ZXJzaW9uIHdoZW4gT00gd2FzIHN1cHBvcnRlZC4gT25jZSB3ZSBkcm9wIHN1cHBvcnQgZm9yIFRhYmxlYXUgdmVyc2lvbnMgPD0gMjAyMC4xLCBhbGwgYWRkaXRpb25hbFxuICAvLyBjb2RlIGluIGhlcmUgZm9yIE9iamVjdCBNb2RlbCBjYW4gYmUgcmVtb3ZlZC5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgcmVnaXN0cnlJZDogbnVtYmVyKSB7XG4gICAgc3VwZXIoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCk7XG4gIH1cbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKGRhdGFTb3VyY2VJZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZWZyZXNoQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRlbHRhVGltZU1zXTogMCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG91bGRSZWZyZXNoRFNdOiB0cnVlLFxuICAgIH07XG5cbiAgICAvLyBPbiBzZXJ2ZXI6IE5vdCBwYXNzaW5nIHRoZSBkYXRhc291cmNlIGlkIHdpbGwgcmVmcmVzaCBhbGwgZGF0YXNvdXJjZXMuXG4gICAgaWYgKGRhdGFTb3VyY2VJZCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdID0gZGF0YVNvdXJjZUlkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlZnJlc2hEYXRhU291cmNlLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEFjdGl2ZVRhYmxlc0FzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxUYWJsZUluZm8+PiB7XG4gICAgY29uc3Qgam9pblBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRBY3RpdmVUYWJsZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YVNvdXJjZUlkLFxuICAgIH07XG5cbiAgICAvLyBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0YWJsZXMgdXNlZCBieSB0aGlzIGNvbm5lY3Rpb25cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRBY3RpdmVUYWJsZXMsIGpvaW5QYXJhbWV0ZXJzKS50aGVuPEFycmF5PFRhYmxlSW5mbz4+KChqb2luUmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlSW5mb3MgPSBqb2luUmVzcG9uc2UucmVzdWx0IGFzIFRhYmxlSW5mb3M7XG5cbiAgICAgIC8vIGdldEFjdGl2ZVRhYmxlcyBpcyB1bnN1cHBvcnRlZCBmb3IgY3ViZXMgYW5kIEdBLiBXZSBkbyBub3QgaGF2ZSBhIGNvbm5lY3Rpb24gdHlwZSBwcm9wZXJ0eVxuICAgICAgLy8gYXZhaWxhYmxlIGZyb20gdGhlIHBsYXRmb3JtIChpbnRlbnRpb25hbGx5LCB0byByZWR1Y2UgY29kZSBjaHVybiBhcyBuZXcgY29ubmVjdGlvbnMgYXJlIGFkZGVkKS5cbiAgICAgIC8vIEluc3RlYWQsanVzdCBjaGVjayBpZiBhbnkgdGFibGVzIGFyZSByZXR1cm5lZC4gVGhpcyBhcnJheSB3aWxsIGJlIGVtcHR5IGZvciBhbnkgbm9uLXRhYmxlIGJhc2VkIGRhdGFzb3VyY2UuXG4gICAgICBpZiAodGFibGVJbmZvcy50YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5VbnN1cHBvcnRlZE1ldGhvZEZvckRhdGFTb3VyY2VUeXBlLCBgZ2V0QWN0aXZlVGFibGVzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlSW5mb3MudGFibGVzO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxEYXRhU2NoZW1hPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldERhdGFTb3VyY2VzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhU291cmNlcywgcGFyYW1ldGVycykudGhlbjxEYXRhU2NoZW1hPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFTY2hlbWEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVNjaGVtYTtcbiAgICAgIHJldHVybiBkYXRhU2NoZW1hO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEFsbERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxEYXRhU2NoZW1hPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEFsbERhdGFTb3VyY2VzQXN5bmMnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0QWxsRGF0YVNvdXJjZXMsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVNjaGVtYT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFTY2hlbWE7XG4gICAgICByZXR1cm4gZGF0YVNjaGVtYTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoZGF0YVNvdXJjZUlkOiBzdHJpbmcpOiBQcm9taXNlPENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YVNvdXJjZUlkLFxuICAgIH07XG5cbiAgICAvLyBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0YWJsZXMgdXNlZCBieSB0aGlzIGNvbm5lY3Rpb25cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMsIHBhcmFtcykudGhlbjxDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5W10+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRpb25TdW1tYXJpZXMgPSByZXNwb25zZS5yZXN1bHQgYXMgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeVtdO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uU3VtbWFyaWVzO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEZpZWxkQXN5bmMoZ2xvYmFsZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPENvbnRyYWN0LkZpZWxkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRGaWVsZEFuZERhdGFTb3VyY2U7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEZpZWxkQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkZpZWxkSWRdOiBnbG9iYWxmaWVsZE5hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5GaWVsZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkYXRhU291cmNlID0gcmVzcG9uc2UucmVzdWx0W1BhcmFtZXRlcklkLkRhdGFTb3VyY2VdIGFzIEludGVybmFsQ29udHJhY3QuRGF0YVNvdXJjZTtcbiAgICAgIGNvbnN0IGZpZWxkID0gcmVzcG9uc2UucmVzdWx0W1BhcmFtZXRlcklkLkZpZWxkXSBhcyBGaWVsZDtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRGaWVsZChmaWVsZCwgdGhpcy5jb252ZXJ0RGF0YVNvdXJjZShkYXRhU291cmNlKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlc0FzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4ge1xuICAgIGNvbnN0IHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldExvZ2ljYWxUYWJsZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YVNvdXJjZUlkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0TG9naWNhbFRhYmxlcywgcGFyYW1zKS50aGVuPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8TG9naWNhbFRhYmxlSW5mbz47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRVbmRlcmx5aW5nVGFibGVzLCBwYXJhbXMpLnRoZW48QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxMb2dpY2FsVGFibGVJbmZvPjtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEZpZWxkKGZpZWxkOiBJbnRlcm5hbENvbnRyYWN0LkZpZWxkLCBkYXRhU291cmNlOiBDb250cmFjdC5EYXRhU291cmNlKTogQ29udHJhY3QuRmllbGQge1xuICAgIHJldHVybiBuZXcgRmllbGQobmV3IEZpZWxkSW1wbChmaWVsZCwgZGF0YVNvdXJjZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGF0YVNvdXJjZShkYXRhU291cmNlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFTb3VyY2UpOiBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgICByZXR1cm4gbmV3IERhdGFTb3VyY2UobmV3IERhdGFTb3VyY2VJbXBsKGRhdGFTb3VyY2UsIHRoaXMuX3JlZ2lzdHJ5SWQpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ3Jvc3N0YWJGaWxlRm9ybWF0LFxuICBFeHBvcnREYXRhT3B0aW9ucyxcbiAgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIFNoZWV0VHlwZSBhcyBFeHRlcm5hbFNoZWV0VHlwZSxcbiAgU2hhcmVkRXJyb3JDb2Rlcyxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeHBvcnRDcm9zc3RhYlNoZWV0TWFwLFxuICBFeHBvcnRGaWxlLFxuICBFeHBvcnRQREZPcHRpb25zIGFzIEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgUGFyYW1ldGVySWQsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgRXhwb3J0SGVscGVycyB9IGZyb20gJy4uLy4uL1V0aWxzL0V4cG9ydEhlbHBlcnMnO1xuaW1wb3J0IHsgRXhwb3J0U2VydmljZSB9IGZyb20gJy4uL0V4cG9ydFNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEV4cG9ydFNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRXhwb3J0U2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkV4cG9ydDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwQXN5bmMoY3VycmVudFNoZWV0VHlwZTogRXh0ZXJuYWxTaGVldFR5cGUpOiBQcm9taXNlPEV4cG9ydENyb3NzdGFiU2hlZXRNYXA+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldEV4cG9ydENyb3NzdGFiU2hlZXRNYXA7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEV4cG9ydENyb3NzdGFiU2hlZXRNYXBBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VycmVudFNoZWV0VHlwZV06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaGVldFR5cGUuY29udmVydChjdXJyZW50U2hlZXRUeXBlKSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxFeHBvcnRDcm9zc3RhYlNoZWV0TWFwPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHBvcnRDcm9zc3RhYlNoZWV0TWFwO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBleHBvcnRDcm9zc3RhYkFzeW5jKFxuICAgIHNoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZvcm1hdDogQ3Jvc3N0YWJGaWxlRm9ybWF0LFxuICAgIGV4cG9ydGFibGVXb3Jrc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPixcbiAgICBjdXJyZW50U2hlZXRUeXBlOiBFeHRlcm5hbFNoZWV0VHlwZSxcbiAgKTogUHJvbWlzZTxFeHBvcnRGaWxlPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVNoZWV0TmFtZShleHBvcnRhYmxlV29ya3NoZWV0TmFtZXMsIHNoZWV0TmFtZSk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxDcm9zc3RhYkZpbGVGb3JtYXQ+KGZvcm1hdCwgQ3Jvc3N0YWJGaWxlRm9ybWF0LCAnQ3Jvc3N0YWJGaWxlRm9ybWF0Jyk7XG5cbiAgICAvLyBUaGUgcHJlcyBsYXllciBjb21tYW5kIGZvciBleHBvcnRpbmcgQ3Jvc3N0YWIgdXNlcyBTaW1wbGVTaGVldElkZW50aWZpZXJzIGluc3RlYWQgb2Ygc2hlZXQgbmFtZXMuXG4gICAgLy8gVGhlIGV4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkgY3VycmVudCBkb2VzIG5vdCBzdG9yZSByZWZlcmVuY2VzIHRvIHRoZSBTaW1wbGVTaGVldElkZW50aWZpZXJzIG9mIGl0cyBzaGVldHNcbiAgICAvLyBzbyB3ZSBjYWxsIGEgcHJlcyBsYXllciBjb21tYW5kIHRoYXQgZ2l2ZXMgdXMgdGhlIFNpbXBsZVNoZWV0SWRlbnRpZmllciBmb3IgZWFjaCBzaGVldCBuYW1lIHRoYXQgYXBwZWFycyBpbiB0aGVcbiAgICAvLyBleHBvcnQgQ3Jvc3N0YWIgZGlhbG9nIHBvcHVwLlxuICAgIGNvbnN0IHNoZWV0TmFtZVRvSWRNYXAgPSBhd2FpdCB0aGlzLmdldEV4cG9ydENyb3NzdGFiU2hlZXRNYXBBc3luYyhjdXJyZW50U2hlZXRUeXBlKTtcbiAgICBpZiAoIXNoZWV0TmFtZVRvSWRNYXBbc2hlZXROYW1lXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdtaXNzaW5nIHNoZWV0IGRvYyBpZCBmcm9tIHNoZWV0TWFwJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2V4cG9ydENyb3NzdGFiQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlNoZWV0SWRlbnRpZmllcl06IHNoZWV0TmFtZVRvSWRNYXBbc2hlZXROYW1lXSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZW5kTm90aWZpY2F0aW9uc106IHRydWUsIC8vIHNlbmQgbm90aWZpY2F0aW9uIG9uIHByZXMgbGF5ZXIgdGhhdCB0cmlnZ2VycyBmaWxlIGRvd25sb2FkXG4gICAgfTtcblxuICAgIC8vIHByZXMgbGF5ZXIgY29tbWFuZCBpbnZva2VkIGRlcGVuZHMgb24gdGhlIGNyb3NzdGFiIGZpbGUgZm9ybWF0XG4gICAgbGV0IHZlcmI7XG4gICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgIGNhc2UgQ3Jvc3N0YWJGaWxlRm9ybWF0LkNTVjpcbiAgICAgICAgdmVyYiA9IFZlcmJJZC5FeHBvcnRDcm9zc3RhYkNzdkRvd25sb2FkO1xuICAgICAgICAvLyBDU1Ygb25seSBwYXJhbWV0ZXI6IHNlZSBicm93c2VyLWNsaWVudHMvZXhwb3J0LWNyb3NzdGFiLW9wdGlvbnMtZGlhbG9nIHJlcG9cbiAgICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Vc2VUYWJEZWxpbWl0ZXJzXSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDcm9zc3RhYkZpbGVGb3JtYXQuRXhjZWw6XG4gICAgICAgIHZlcmIgPSBWZXJiSWQuRXhwb3J0Q3Jvc3N0YWJFeGNlbERvd25sb2FkO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAndW5zdXBwb3J0ZWQgQ3Jvc3N0YWIgZmlsZSBmb3JtYXQuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKVxuICAgICAgLnRoZW48RXhwb3J0RmlsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHBvcnRGaWxlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5Dcm9zc3RhYkNyZWF0aW9uRXJyb3IsICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGRvY3VtZW50LicpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZXhwb3J0RGF0YUFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgb3B0aW9uczogRXhwb3J0RGF0YU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RXhwb3J0RGF0YU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICAvLyBSZW1vdmUgYW55IGR1cGxpY2F0ZXMgZnJvbSB0aGUgaW5wdXQgYXJyYXlcbiAgICBjb25zdCBjb2x1bW5zQXNTZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldChvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkKTtcbiAgICBjb25zdCBjb2x1bW5zVG9JbmNsdWRlQnlJZCA9IEFycmF5LmZyb20oY29sdW1uc0FzU2V0KTtcblxuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuRXhwb3J0RGF0YURvd25sb2FkO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleHBvcnREYXRhQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IG9wdGlvbnMuaWdub3JlQWxpYXNlcyA/PyBmYWxzZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IGNvbHVtbnNUb0luY2x1ZGVCeUlkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpXG4gICAgICAudGhlbjx2b2lkPigoKSA9PiB7fSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5EYXRhQ3JlYXRpb25FcnJvciwgJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgZ2VuZXJhdGluZyB0aGUgZG9jdW1lbnQuJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBleHBvcnRQb3dlclBvaW50QXN5bmMoc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPiwgZXhwb3J0U2NlbmFyaW9zOiBFeHBvcnRTY2VuYXJpb3NGb3JQREZBbmRQb3dlclBvaW50KTogUHJvbWlzZTxFeHBvcnRGaWxlPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVNoZWV0TmFtZXNGb3JQREZBbmRQUFQoc2hlZXROYW1lcywgZXhwb3J0U2NlbmFyaW9zKTtcblxuICAgIC8vIE5vdGU6IHRoZSBFeHBvcnRPcmlnaW5VcmwgcGFyYW0gaXMgbGlzdGVkIGFzIG9wdGlvbmFsIGZvciB0aGUgcHJlcyBsYXllciBjb21tYW5kIHdlIGFyZSBpbnZva2luZzsgaG93ZXZlcixcbiAgICAvLyByZWNlbnQgY2hhbmdlcyB3ZXJlIG1hZGUgdGhhdCBlbmZvcmNlZCB0aGUgdXNlIG9mIHRoZSBlbXB0eSBzdHJpbmcgd2hlbiBpbnZva2luZyB0aGlzIGNvbW1hbmQgd2l0aCBubyBFeHBvcnRPcmlnaW5VcmwuXG4gICAgLy8gc2VlIGJyb3dzZXItY2xpZW50cy9leHBvcnQtcG93ZXJwb2ludC1vcHRpb25zLWRpYWxvZyByZXBvLlxuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuRXhwb3J0UG93ZXJwb2ludERvd25sb2FkO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleHBvcnRQb3dlclBvaW50QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4cG9ydE9yaWdpblVybF06ICcnLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGVkU2hlZXROYW1lc106IHNoZWV0TmFtZXMsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycylcbiAgICAgIC50aGVuPEV4cG9ydEZpbGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXhwb3J0RmlsZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICAgIFNoYXJlZEVycm9yQ29kZXMuUG93ZXJQb2ludENyZWF0aW9uRXJyb3IsXG4gICAgICAgICAgJ0FuIGVycm9yIG9jY3VyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBnZW5lcmF0ZSB0aGUgUG93ZXJQb2ludCBmaWxlLicsXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBleHBvcnRQREZBc3luYyhcbiAgICBzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIGV4dGVybmFsRXhwb3J0UGRmT3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICAgIGV4cG9ydFNjZW5hcmlvczogRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCxcbiAgKTogUHJvbWlzZTxFeHBvcnRGaWxlPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUV4cG9ydFBERk9wdGlvbnMoZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U2hlZXROYW1lc0ZvclBERkFuZFBQVChzaGVldE5hbWVzLCBleHBvcnRTY2VuYXJpb3MpO1xuXG4gICAgY29uc3QgaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zOiBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMgPSBhd2FpdCB0aGlzLmdldEV4cG9ydFBERk9wdGlvbnNBc3luYygpO1xuICAgIEV4cG9ydEhlbHBlcnMudXBkYXRlSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zKGludGVybmFsRXhwb3J0UGRmT3B0aW9ucywgZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zLCBzaGVldE5hbWVzKTtcblxuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuRXhwb3J0UGRmRG93bmxvYWQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2V4cG9ydFBERkFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHBvcnRQZGZPcHRpb25zXTogaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpXG4gICAgICAudGhlbjxFeHBvcnRGaWxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4cG9ydEZpbGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLlBERkNyZWF0aW9uRXJyb3IsICdVbmFibGUgdG8gY3JlYXRlIFBERiBiZWNhdXNlIHNvbWV0aGluZyB3ZW50IHdyb25nLiBUcnkgYWdhaW4uJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRFeHBvcnRQREZPcHRpb25zQXN5bmMoKTogUHJvbWlzZTxJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnM+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldEV4cG9ydFBkZk9wdGlvbnM7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEV4cG9ydFBkZk9wdGlvbnNBc3luYycsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48SW50ZXJuYWxFeHBvcnRQREZPcHRpb25zPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnM7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlcG9ydEV4dGVuc2lvblJlbmRlckNvbXBsZXRlKG1lZGlhQmxvYj86IEFycmF5QnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiBWZXJiSWQuUmVwb3J0RXh0ZW5zaW9uUmVuZGVyQ29tcGxldGUsXG4gICAgICBbUGFyYW1ldGVySWQuSGFzRXh0ZW5zaW9uUmVuZGVyaW5nVGltZWRPdXRdOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgaWYgKG1lZGlhQmxvYikge1xuICAgICAgcGFyYW1zW1BhcmFtZXRlcklkLkV4dGVuc2lvbk1lZGlhQmxvYl0gPSBtZWRpYUJsb2I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuUmVwb3J0RXh0ZW5zaW9uUmVuZGVyQ29tcGxldGUsIHBhcmFtcykudGhlbjx2b2lkPigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEFwaU1lbnVUeXBlLCBDb250ZXh0TWVudU9wdGlvbnMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2UgfSBmcm9tICcuLi9FeHRlcm5hbENvbnRleHRNZW51U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51O1xuICB9XG5cbiAgcHVibGljIGFwcGVuZENvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBjb25maWc6IENvbnRleHRNZW51T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBlbmRFeHRlcm5hbE1lbnVJdGVtO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBlbmRDb250ZXh0TWVudUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogc2hlZXROYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVybmFsTWVudUl0ZW1EaXNwbGF5TmFtZV06IGNvbmZpZy5kaXNwbGF5TmFtZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBuZXdNZW51SXRlbUlkID0gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICAgIHJldHVybiBuZXdNZW51SXRlbUlkO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUNvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLlJlbW92ZUV4dGVybmFsTWVudUl0ZW07XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbW92ZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SXRlbUlkXTogbWVudUl0ZW1JZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGVDb250ZXh0TWVudUFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCB0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeGVjdXRlRXh0ZXJuYWxNZW51SXRlbTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhlY3V0ZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SXRlbUlkXTogbWVudUl0ZW1JZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZUNvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SGVhZGVyOiBzdHJpbmcsIG1lbnVEZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5SZW5hbWVFeHRlcm5hbE1lbnU7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbmFtZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SGVhZGVyXTogbWVudUhlYWRlcixcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVEZXNjcmlwdGlvbl06IG1lbnVEZXNjcmlwdGlvbixcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRW1iZWRkaW5nRXJyb3JDb2RlcyxcbiAgRXJyb3JDb2RlcyxcbiAgRmlsdGVyVHlwZSBhcyBFeHRlcm5hbEZpbHRlclR5cGUsXG4gIEZpbHRlckRvbWFpblR5cGUsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRmlsdGVyVHlwZSwgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vLi4vQXBpU2hhcmVkJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyBhcyBFeHRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBJbnRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7XG4gIENhdGVnb3JpY2FsRG9tYWluLFxuICBDYXRlZ29yaWNhbEZpbHRlcixcbiAgSGllcmFyY2hpY2FsRGF0YVZhbHVlLFxuICBIaWVyYXJjaGljYWxGaWx0ZXIsXG4gIEhpZXJhcmNoaWNhbExldmVsRGV0YWlsLFxuICBSYW5nZURvbWFpbixcbiAgUmFuZ2VGaWx0ZXIsXG4gIFJlbGF0aXZlRGF0ZUZpbHRlcixcbn0gZnJvbSAnLi4vLi4vTW9kZWxzL0ZpbHRlck1vZGVscyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi8uLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBEYXRhVmFsdWVGYWN0b3J5IH0gZnJvbSAnLi4vLi4vVXRpbHMvRGF0YVZhbHVlRmFjdG9yeSc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uLy4uL1V0aWxzL1BhcmFtJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9GaWx0ZXJTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEZpbHRlclNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5GaWx0ZXI7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFwcGx5Q2F0ZWdvcmljYWxGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5RmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAndmFsdWVzIHBhcmFtZXRlciBmb3IgYXBwbHlGaWx0ZXJBc3luYyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVmFsdWVzXSA9IHZhbHVlcztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclVwZGF0ZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlclVwZGF0ZVR5cGUuY29udmVydCh1cGRhdGVUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklzRXhjbHVkZU1vZGVdID1cbiAgICAgIGZpbHRlck9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmFuZ2VGaWx0ZXJBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlSYW5nZUZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlSYW5nZUZpbHRlckFzeW5jJyxcbiAgICB9O1xuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubWluICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyT3B0aW9ucy5taW4gIT09IG51bGwpIHtcbiAgICAgIGxldCBtaW46IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGlmIChmaWx0ZXJPcHRpb25zLm1pbiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgbWluID0gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGZpbHRlck9wdGlvbnMubWluKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbiA9IGZpbHRlck9wdGlvbnMubWluO1xuICAgICAgfVxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU1pbl0gPSBtaW47XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubWF4ICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyT3B0aW9ucy5tYXggIT09IG51bGwpIHtcbiAgICAgIGxldCBtYXg6IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGlmIChmaWx0ZXJPcHRpb25zLm1heCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgbWF4ID0gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGZpbHRlck9wdGlvbnMubWF4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1heCA9IGZpbHRlck9wdGlvbnMubWF4O1xuICAgICAgfVxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU1heF0gPSBtYXg7XG4gICAgfVxuXG4gICAgLy8gVGhlIG51bGwgb3B0aW9uIGlzIHVzZWQgd2l0aCBtaW4rbWF4IGZvciAnaW5jbHVkZS1yYW5nZScgb3IgJ2luY2x1ZGUtcmFuZ2Utb3ItbnVsbCdcbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTnVsbE9wdGlvbl0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIubnVsbE9wdGlvbnMuY29udmVydChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLmFwaUZpbHRlckhhbmRsZXJDaGVja0ZvckNvbW1hbmRFcnJvcihyZXNwb25zZS5yZXN1bHQgYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPiB8IENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscyxcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5IaWVyYXJjaGljYWxGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG5cbiAgICBjb25zdCBoaWVyYXJjaGljYWxMZXZlbHMgPSAodmFsdWVzIGFzIENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscykubGV2ZWxzO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaGllcmFyY2hpY2FsTGV2ZWxzKSAmJiBoaWVyYXJjaGljYWxMZXZlbHMubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJMZXZlbHNdID0gaGllcmFyY2hpY2FsTGV2ZWxzO1xuICAgIH0gZWxzZSBpZiAoKHZhbHVlcyBhcyBBcnJheTxTdHJpbmc+KS5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclZhbHVlc10gPSB2YWx1ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZSBzZXJ2ZXIgY29tbWFuZCBleHBlY3RzIGVtcHR5IGxpc3QgZm9yIGNsZWFyaW5nIHRoZSBmaWx0ZXJcbiAgICAgIC8vIGl0IGFsc28gZXhwZWN0cyBlaXRoZXJzIEZpbHRlckxldmVscyBvciBGaWx0ZXJWYWx1ZXMgdG8gYmUgc2V0XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlckxldmVsc10gPSBbXTtcbiAgICB9XG5cbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclVwZGF0ZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlclVwZGF0ZVR5cGUuY29udmVydCh1cGRhdGVUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklzRXhjbHVkZU1vZGVdID0gZmlsdGVyT3B0aW9ucyAmJiAhIWZpbHRlck9wdGlvbnMuaXNFeGNsdWRlTW9kZTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkTmFtZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckZpbHRlckFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQ2xlYXJGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NsZWFyRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3Bvc25lKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBmaWVsZE5hbWU6IHN0cmluZywgb3B0aW9uczogQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyT3B0aW9ucykge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5QZXJpb2RUeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5wZXJpb2RUeXBlLmNvbnZlcnQob3B0aW9ucy5wZXJpb2RUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRhdGVSYW5nZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVSYW5nZVR5cGUuY29udmVydChvcHRpb25zLnJhbmdlVHlwZSk7XG4gICAgaWYgKG9wdGlvbnMucmFuZ2VUeXBlID09PSBEYXRlUmFuZ2VUeXBlLkxhc3ROIHx8IG9wdGlvbnMucmFuZ2VUeXBlID09PSBEYXRlUmFuZ2VUeXBlLk5leHROKSB7XG4gICAgICBpZiAob3B0aW9ucy5yYW5nZU4gPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnJhbmdlTiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICAgIEVtYmVkZGluZ0Vycm9yQ29kZXMuTWlzc2luZ1JhbmdlTkZvclJlbGF0aXZlRGF0ZUZpbHRlcnMsXG4gICAgICAgICAgJ01pc3NpbmcgcmFuZ2VOIGZpZWxkIGZvciBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyIG9mIExBU1ROIG9yIE5FWFROLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlJhbmdlTl0gPSBvcHRpb25zLnJhbmdlTjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hbmNob3JEYXRlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5hbmNob3JEYXRlICE9PSBudWxsKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkFuY2hvckRhdGVdID0gdGhpcy5jb252ZXJ0QW5jaG9yRGF0ZShvcHRpb25zLmFuY2hvckRhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RmlsdGVycztcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RmlsdGVyc0FzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVycyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxJbnRlcm5hbENvbnRyYWN0LkZpbHRlcj47XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RG9tYWluRmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDYXRlZ29yaWNhbERvbWFpbkFzeW5jKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSxcbiAgKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0Q2F0ZWdvcmljYWxEb21haW47XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldENhdGVnb3JpY2FsRG9tYWluQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgfTtcblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRG9tYWluVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyRG9tYWluVHlwZS5jb252ZXJ0KGRvbWFpblR5cGUpO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkb21haW4gPSByZXNwb25zZS5yZXN1bHQgYXMgSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRDYXRlZ29yaWNhbERvbWFpbihkb21haW4sIGRvbWFpblR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFJhbmdlRG9tYWluQXN5bmMod29ya3NoZWV0TmFtZTogc3RyaW5nLCBmaWVsZElkOiBzdHJpbmcsIGRvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LlJhbmdlRG9tYWluPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRSYW5nZURvbWFpbjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0UmFuZ2VEb21haW5Bc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Eb21haW5UeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJEb21haW5UeXBlLmNvbnZlcnQoZG9tYWluVHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LlJhbmdlRG9tYWluPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IHJlc3BvbnNlLnJlc3VsdCBhcyBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRG9tYWluO1xuXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0UmFuZ2VEb21haW4oZG9tYWluLCBkb21haW5UeXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXNoYm9hcmRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXREYXNoYm9hcmRGaWx0ZXJzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXNoYm9hcmRGaWx0ZXJzQXN5bmMnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVycyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxJbnRlcm5hbENvbnRyYWN0LkZpbHRlcj47XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RG9tYWluRmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseURhc2hib2FyZEZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5EYXNoYm9hcmRDYXRlZ29yaWNhbEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlEYXNoYm9hcmRGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJWYWx1ZXNdID0gdmFsdWVzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVXBkYXRlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyVXBkYXRlVHlwZS5jb252ZXJ0KHVwZGF0ZVR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSXNFeGNsdWRlTW9kZV0gPSBmaWx0ZXJPcHRpb25zICYmICEhZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHdvcmtzaGVldE5hbWU6IHN0cmluZywgZmllbGRJZDogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2hhcmVkRmlsdGVyTW9kZWwgPSBhd2FpdCB0aGlzLmV4ZWN1dGVHZXRBcHBsaWVkV29ya3NoZWV0cyh3b3Jrc2hlZXROYW1lLCBmaWVsZElkLCAnZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luYycpO1xuICAgIGNvbnN0IHdvcmtzaGVldE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHNoYXJlZEZpbHRlck1vZGVsLndvcmtzaGVldHM/Lm1hcCgod29ya3NoZWV0SW5mbzogSW50ZXJuYWxDb250cmFjdC5TaGFyZWRGaWx0ZXJXb3Jrc2hlZXRNb2RlbCkgPT4ge1xuICAgICAgaWYgKHdvcmtzaGVldEluZm8uaXNTZWxlY3RlZCkge1xuICAgICAgICB3b3Jrc2hlZXROYW1lcy5wdXNoKHdvcmtzaGVldEluZm8ud29ya3NoZWV0TmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHdvcmtzaGVldE5hbWVzO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBhcHBseVRvV29ya3NoZWV0czogQXJyYXk8c3RyaW5nPixcbiAgKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2hhcmVkRmlsdGVyTW9kZWwgPSBhd2FpdCB0aGlzLmV4ZWN1dGVHZXRBcHBsaWVkV29ya3NoZWV0cyh3b3Jrc2hlZXROYW1lLCBmaWVsZElkLCAnZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luY0ludGVybmFsJyk7XG4gICAgaWYgKCFzaGFyZWRGaWx0ZXJNb2RlbCB8fCAhc2hhcmVkRmlsdGVyTW9kZWwud29ya3NoZWV0cykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdUaGlzIGZpbHRlciBkb2VzIG5vdCBhcHBseSB0byBtdWx0aXBsZSB3b3Jrc2hlZXRzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsb3dlZFdvcmtzaGVldHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGFjdGl2ZVdvcmtzaGVldCA9ICcnO1xuICAgIHNoYXJlZEZpbHRlck1vZGVsLndvcmtzaGVldHMuZm9yRWFjaCgod29ya3NoZWV0KSA9PiB7XG4gICAgICAvLyBHZXQgYWN0aXZlIHdvcmtzaGVldFxuICAgICAgaWYgKHdvcmtzaGVldC5pc0FjdGl2ZSkge1xuICAgICAgICBhY3RpdmVXb3Jrc2hlZXQgPSB3b3Jrc2hlZXQud29ya3NoZWV0TmFtZTtcbiAgICAgIH1cblxuICAgICAgLy8gUG9wdWxhdGUgYWxsb3dlZCB3b3Jrc2hlZXRzXG4gICAgICBpZiAod29ya3NoZWV0LmlzU2VsZWN0ZWQgfHwgd29ya3NoZWV0LmlzRW5hYmxlZCkge1xuICAgICAgICBhbGxvd2VkV29ya3NoZWV0cy5wdXNoKHdvcmtzaGVldC53b3Jrc2hlZXROYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChhY3RpdmVXb3Jrc2hlZXQgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ05vIGFjdGl2ZSB3b3Jrc2hlZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWFwcGx5VG9Xb3Jrc2hlZXRzLmluY2x1ZGVzKGFjdGl2ZVdvcmtzaGVldCkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJHthY3RpdmVXb3Jrc2hlZXR9IG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGFwcGxpZWQgd29ya3NoZWV0c2ApO1xuICAgIH1cblxuICAgIGFwcGx5VG9Xb3Jrc2hlZXRzLmZvckVhY2goKHNoZWV0KSA9PiB7XG4gICAgICAvLyBjaGVjayBpZiBpdCdzIHByZXNlbnQgd2l0aGluIGNvbXBhdGlibGUgc2hlZXRzXG4gICAgICBpZiAoIWFsbG93ZWRXb3Jrc2hlZXRzLmluY2x1ZGVzKHNoZWV0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFRoZSBmaWVsZCAke2ZpZWxkTmFtZX0gaXNuJ3QgYXBwbGljYWJsZSB0byB0aGUgd29ya3NoZWV0ICR7c2hlZXR9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkNoYW5nZVNoYXJlZEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHt9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXSA9ICdzZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jJztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuU2hhcmVkRmlsdGVyU2hlZXRzXSA9IGFwcGx5VG9Xb3Jrc2hlZXRzO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZ1tdPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiBhcHBseVRvV29ya3NoZWV0cztcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEhlbHBlciBNZXRob2RzXG5cbiAgcHJpdmF0ZSBleGVjdXRlR2V0QXBwbGllZFdvcmtzaGVldHMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICB0ZWxlbWV0cnlGdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlck1vZGVsPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRTaGFyZWRGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7fTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV0gPSB0ZWxlbWV0cnlGdW5jdGlvbk5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkSWRdID0gZmllbGRJZDtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlck1vZGVsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHNoYXJlZEZpbHRlck1vZGVsID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsQ29udHJhY3QuU2hhcmVkRmlsdGVyTW9kZWw7XG4gICAgICByZXR1cm4gc2hhcmVkRmlsdGVyTW9kZWw7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREb21haW5GaWx0ZXJzKGRvbWFpbkZpbHRlcnM6IEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPik6IEFycmF5PENvbnRyYWN0LkZpbHRlcj4ge1xuICAgIGNvbnN0IGZpbHRlcnM6IEFycmF5PENvbnRyYWN0LkZpbHRlcj4gPSBbXTtcbiAgICBkb21haW5GaWx0ZXJzLmZvckVhY2goKGRvbWFpbkZpbHRlcikgPT4ge1xuICAgICAgc3dpdGNoIChkb21haW5GaWx0ZXIuZmlsdGVyVHlwZSkge1xuICAgICAgICBjYXNlIEZpbHRlclR5cGUuQ2F0ZWdvcmljYWw6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbEZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0Q2F0ZWdvcmljYWxGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBDYXRlZ29yaWNhbCBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuSGllcmFyY2hpY2FsOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRIaWVyYXJjaGljYWxGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBIaWVyYXJjaGljYWwgRmlsdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLlJhbmdlOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuUmFuZ2VGaWx0ZXI7XG4gICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHRoaXMuY29udmVydFJhbmdlRmlsdGVyKGZpbHRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUmFuZ2UgRmlsdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZToge1xuICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGRvbWFpbkZpbHRlciBhcyBJbnRlcm5hbENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0UmVsYXRpdmVEYXRlRmlsdGVyKGZpbHRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUmVsYXRpdmUgRGF0ZSBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVycztcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydENhdGVnb3JpY2FsRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbEZpbHRlcik6IENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyIHtcbiAgICBjb25zdCBhcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+ID0gZG9tYWluRmlsdGVyLnZhbHVlcy5tYXAoKGR2KSA9PiB7XG4gICAgICByZXR1cm4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGR2KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgQ2F0ZWdvcmljYWxGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBFeHRlcm5hbEZpbHRlclR5cGUuQ2F0ZWdvcmljYWwsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgYXBwbGllZFZhbHVlcyxcbiAgICAgIGRvbWFpbkZpbHRlci5pc0V4Y2x1ZGUsXG4gICAgICBkb21haW5GaWx0ZXIuaXNBbGxTZWxlY3RlZCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0SGllcmFyY2hpY2FsRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIpOiBDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIge1xuICAgIGNvbnN0IGFwcGxpZWRWYWx1ZXM6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZT4gPSBkb21haW5GaWx0ZXIudmFsdWVzLm1hcCgoaGllcmFyY2hpY2FsRGF0YVZhbHVlKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEhpZXJhcmNoaWNhbERhdGFWYWx1ZShcbiAgICAgICAgRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGhpZXJhcmNoaWNhbERhdGFWYWx1ZS52YWx1ZSksXG4gICAgICAgIGhpZXJhcmNoaWNhbERhdGFWYWx1ZS5oaWVyYXJjaGljYWxQYXRoLFxuICAgICAgICBoaWVyYXJjaGljYWxEYXRhVmFsdWUubGV2ZWwsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbGV2ZWxEZXRhaWxzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbD4gPSBkb21haW5GaWx0ZXIubGV2ZWxJbmZvLm1hcCgoYUxldmVsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEhpZXJhcmNoaWNhbExldmVsRGV0YWlsKFxuICAgICAgICBhTGV2ZWwubmFtZSxcbiAgICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuY29udmVydChhTGV2ZWwubGV2ZWxTZWxlY3Rpb25TdGF0ZSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBIaWVyYXJjaGljYWxGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBFeHRlcm5hbEZpbHRlclR5cGUuSGllcmFyY2hpY2FsLFxuICAgICAgdGhpcy5fcmVnaXN0cnlJZCxcbiAgICAgIGRvbWFpbkZpbHRlci5kaW1lbnNpb25OYW1lLFxuICAgICAgZG9tYWluRmlsdGVyLmhpZXJhcmNoeUNhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIubGV2ZWxzLFxuICAgICAgbGV2ZWxEZXRhaWxzLFxuICAgICAgYXBwbGllZFZhbHVlcyxcbiAgICAgIGRvbWFpbkZpbHRlci5pc0FsbFNlbGVjdGVkLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRSYW5nZUZpbHRlcihkb21haW5GaWx0ZXI6IEludGVybmFsQ29udHJhY3QuUmFuZ2VGaWx0ZXIpOiBDb250cmFjdC5SYW5nZUZpbHRlciB7XG4gICAgY29uc3QgbWluVmFsdWU6IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW5GaWx0ZXIubWluKTtcbiAgICBjb25zdCBtYXhWYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5tYXgpO1xuICAgIHJldHVybiBuZXcgUmFuZ2VGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBFeHRlcm5hbEZpbHRlclR5cGUuUmFuZ2UsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZSxcbiAgICAgIGRvbWFpbkZpbHRlci5pbmNsdWRlTnVsbFZhbHVlcyxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmVsYXRpdmVEYXRlRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIpOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIge1xuICAgIGNvbnN0IGFuY2hvckRhdGVWYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5hbmNob3JEYXRlKTtcbiAgICByZXR1cm4gbmV3IFJlbGF0aXZlRGF0ZUZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEV4dGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGUsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgYW5jaG9yRGF0ZVZhbHVlLFxuICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVTdGVwUGVyaW9kLmNvbnZlcnQoZG9tYWluRmlsdGVyLnBlcmlvZFR5cGUpLFxuICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVSYW5nZVR5cGUuY29udmVydChkb21haW5GaWx0ZXIucmFuZ2VUeXBlKSxcbiAgICAgIGRvbWFpbkZpbHRlci5yYW5nZU4sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydENhdGVnb3JpY2FsRG9tYWluKGRvbWFpbjogSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbiwgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSk6IENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluIHtcbiAgICBjb25zdCB2YWx1ZXM6IEFycmF5PERhdGFWYWx1ZT4gPSBkb21haW4udmFsdWVzLm1hcCgoZG9tYWluRHYpID0+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+IG5ldyBNYXJrSW5mbyhoLnR5cGUsIGguY29sb3IsIGgudHVwbGVJZCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlID0gcmVzcG9uc2VEYXRhLmRhdGFUYWJsZS5tYXAoKHJvdykgPT4ge1xuICAgICAgcmV0dXJuIHJvdy5tYXAoKGNlbGwsIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VUYWJsZURhdGFWYWx1ZShjZWxsLCBoZWFkZXJzW2luZGV4XS5kYXRhVHlwZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmIChtYXJrcykge1xuICAgICAgcmV0dXJuIG5ldyBEYXRhVGFibGUodGFibGUsIGhlYWRlcnMsIHRhYmxlLmxlbmd0aCwgZmFsc2UsIGlzU3VtbWFyeSwgbWFya3MpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGFUYWJsZSh0YWJsZSwgaGVhZGVycywgdGFibGUubGVuZ3RoLCBmYWxzZSwgaXNTdW1tYXJ5KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uL05vdGlmaWNhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgTm90aWZpY2F0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLCBNb2RlbCwgTm90aWZpY2F0aW9uLCBOb3RpZmljYXRpb25JZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBVbnJlZ2lzdGVyRm4gfSBmcm9tICcuLi9Ob3RpZmljYXRpb25TZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9maWx0ZXJGbjogKG5vdGlmaWNhdGlvbk1vZGVsOiBNb2RlbCkgPT4gYm9vbGVhbixcbiAgICBwcml2YXRlIF9jYWxsYmFja0ZuOiAobm90aWZpY2F0aW9uTW9kZWw6IE1vZGVsKSA9PiB2b2lkLFxuICApIHtcbiAgICAvLyBOb3RoaW5nIEhlcmVcbiAgfVxuXG4gIHB1YmxpYyBvbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb25Nb2RlbDogTW9kZWwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZmlsdGVyRm4obm90aWZpY2F0aW9uTW9kZWwpKSB7XG4gICAgICB0aGlzLl9jYWxsYmFja0ZuKG5vdGlmaWNhdGlvbk1vZGVsKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSB7XG4gIHByaXZhdGUgX2hhbmRsZXJzOiB7IFtub3RpZmljYXRpb25JZDogc3RyaW5nXTogQXJyYXk8UmVnaXN0cmF0aW9uPiB9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcikge1xuICAgIHRoaXMuX2hhbmRsZXJzID0ge307XG4gICAgdGhpcy5kaXNwYXRjaGVyLnJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcih0aGlzLm9uTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVySGFuZGxlcihpZDogTm90aWZpY2F0aW9uSWQsIGZpbHRlckZuOiAobW9kZWw6IE1vZGVsKSA9PiBib29sZWFuLCBoYW5kbGVyOiAobW9kZWw6IE1vZGVsKSA9PiB2b2lkKTogVW5yZWdpc3RlckZuIHtcbiAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuX2hhbmRsZXJzW2lkXSB8fCBuZXcgQXJyYXk8UmVnaXN0cmF0aW9uPigpO1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IG5ldyBSZWdpc3RyYXRpb24oZmlsdGVyRm4sIGhhbmRsZXIpO1xuICAgIGhhbmRsZXJzLnB1c2gocmVnaXN0cmF0aW9uKTtcbiAgICB0aGlzLl9oYW5kbGVyc1tpZF0gPSBoYW5kbGVycztcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5yZW1vdmVSZWdpc3RyYXRpb24oaWQsIHJlZ2lzdHJhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGhhc0hhbmRsZXJzRm9yTm90aWZpY2F0aW9uVHlwZShpZDogTm90aWZpY2F0aW9uSWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faGFuZGxlcnMuaGFzT3duUHJvcGVydHkoaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNIYW5kbGVyc0Zvck5vdGlmaWNhdGlvblR5cGUobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdvIHRocm91Z2ggYW5kIGNoZWNrIGZvciBhbGwgdGhlIGhhbmRsZXJzIG9mIHRoaXMgcGFydGljdWxhciBub3RpZmljYXRpb25cbiAgICB0aGlzLl9oYW5kbGVyc1tub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWRdLmZvckVhY2goKGgpID0+IGgub25Ob3RpZmljYXRpb24obm90aWZpY2F0aW9uLmRhdGEpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUmVnaXN0cmF0aW9uKGlkOiBOb3RpZmljYXRpb25JZCwgcmVnaXN0cmF0aW9uOiBSZWdpc3RyYXRpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzSGFuZGxlcnNGb3JOb3RpZmljYXRpb25UeXBlKGlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2hhbmRsZXJzW2lkXSA9IHRoaXMuX2hhbmRsZXJzW2lkXS5maWx0ZXIoKHJlZykgPT4gcmVnICE9PSByZWdpc3RyYXRpb24pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBNb2RlbCwgUGFyYW1ldGVySWQsIFBhcmFtZXRlckluZm8sIFNoZWV0UGF0aCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlckltcGwgfSBmcm9tICcuLi8uLi9JbXBsL1BhcmFtZXRlckltcGwnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vUGFyYW1ldGVyc1NlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlcnNTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFBhcmFtZXRlcnNTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuUGFyYW1ldGVycztcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzRm9yU2hlZXRBc3luYyhzaGVldFBhdGg6IFNoZWV0UGF0aCk6IFByb21pc2U8QXJyYXk8UGFyYW1ldGVySW1wbD4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRQYXJhbWV0ZXJzRm9yU2hlZXRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2hlZXRQYXRoXTogc2hlZXRQYXRoLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXJzQXN5bmMocGFyYW1ldGVycyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxsUGFyYW1ldGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8UGFyYW1ldGVySW1wbD4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRQYXJhbWV0ZXJzRm9yU2hlZXRBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcnNBc3luYyhwYXJhbWV0ZXJzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyYW1ldGVyc0FzeW5jKGlucHV0UGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEFycmF5PFBhcmFtZXRlckltcGw+PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0UGFyYW1ldGVyc0ZvclNoZWV0LCBpbnB1dFBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8UGFyYW1ldGVySW5mbz47XG4gICAgICByZXR1cm4gcmVzdWx0Lm1hcCgocGFyYW1ldGVySW5mbykgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlckltcGwocGFyYW1ldGVySW5mbywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VQYXJhbWV0ZXJWYWx1ZUFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbmZvPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY2hhbmdlUGFyYW1ldGVyVmFsdWVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuUGFyYW1ldGVyRmllbGROYW1lXTogZmllbGROYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLlBhcmFtZXRlclZhbHVlXTogbmV3VmFsdWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNoYW5nZVBhcmFtZXRlclZhbHVlLCBwYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIFBhcmFtZXRlckluZm87XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGZpbmRQYXJhbWV0ZXJCeU5hbWVBc3luYyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFBhcmFtZXRlckltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5maW5kUGFyYW1ldGVyQXN5bmMobmFtZSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQnlHbG9iYWxGaWVsZE5hbWVBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8UGFyYW1ldGVySW1wbCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmZpbmRQYXJhbWV0ZXJBc3luYyh1bmRlZmluZWQsIGZpZWxkTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRQYXJhbWV0ZXJBc3luYyhuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZpZWxkTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2ZpbmRQYXJhbWV0ZXJBc3luYycsXG4gICAgfTtcbiAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlBhcmFtZXRlckNhcHRpb25dID0gbmFtZTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlBhcmFtZXRlckZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnbmFtZSBvciBmaWVsZE5hbWUgbXVzdCBiZSBwcm92aWRlZCB0byBmaW5kIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkZpbmRQYXJhbWV0ZXIsIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZU9mUGFyYW1ldGVySW5mbyA9IChvYmplY3Q6IE1vZGVsKTogb2JqZWN0IGlzIFBhcmFtZXRlckluZm8gPT4ge1xuICAgICAgICByZXR1cm4gJ2ZpZWxkTmFtZScgaW4gb2JqZWN0O1xuICAgICAgfTtcblxuICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayB0byBzZWUgaWYgd2UgZ290IGEgdmFsaWQgcmVzcG9uc2UgYmFjayBhZ2FpblxuICAgICAgaWYgKGluc3RhbmNlT2ZQYXJhbWV0ZXJJbmZvKHJlc3BvbnNlLnJlc3VsdCkpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0O1xuICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlckltcGwocmVzdWx0LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgUGFyYW1ldGVySWQsXG4gIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlIGFzIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbCxcbiAgVmVyYklkLFxuICBWaXN1YWxJZCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIERpbWVuc2lvblNlbGVjdGlvbk1vZGVsLFxuICBIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbCxcbiAgSG92ZXJUdXBsZUludGVyYWN0aW9uTW9kZWwsXG4gIFJhbmdlU2VsZWN0aW9uTW9kZWwsXG4gIFNlbGVjdFR1cGxlc0ludGVyYWN0aW9uTW9kZWwsXG4gIFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lcixcbiAgVHVwbGVTZWxlY3Rpb25Nb2RlbCxcbiAgVmFsdWVTZWxlY3Rpb25Nb2RlbCxcbn0gZnJvbSAnLi4vLi4vTW9kZWxzL1NlbGVjdGlvbk1vZGVscyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuLi8uLi9VdGlscy9QYXJhbSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VsZWN0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTZWxlY3Rpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBjbGVhciBhbGwgdGhlIHNlbGVjdGVkIG1hcmtzIGZvciB0aGUgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICovXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DbGVhclNlbGVjdGVkTWFya3MsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47IC8vIEV4cGVjdGluZyBhbiBlbXB0eSBtb2RlbCBhbmQgaGVuY2UgdGhlIHZvaWQgcmVzcG9uc2UuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHNlbGVjdCBtYXJrcyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25Dcml0ZXJpYVxuICAgKiBAcGFyYW0gc2VsZWN0aW9uVXBkYXRlVHlwZVxuICAgKi9cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBzZWxlY3Rpb25Dcml0ZXJpYXM6IEFycmF5PENvbnRyYWN0LlNlbGVjdGlvbkNyaXRlcmlhPixcbiAgICBzZWxlY3Rpb25VcGRhdGVUeXBlOiBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoc2VsZWN0aW9uQ3JpdGVyaWFzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdTZWxlY3Rpb24gY3JpdGVyaWEgbWlzc2luZyBmb3Igc2VsZWN0aW5nIG1hcmtzIGJ5IHZhbHVlJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0aW9uVHlwZTogc3RyaW5nID0gdGhpcy52YWxpZGF0ZVNlbGVjdGlvblVwZGF0ZVR5cGUoc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VTZWxlY3Rpb25NYXJrcyhzZWxlY3Rpb25Dcml0ZXJpYXMpO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvblVwZGF0ZVR5cGVdOiBzZWxlY3Rpb25UeXBlLFxuICAgIH07XG5cbiAgICBpZiAoc2VsZWN0aW9uTW9kZWxDb250YWluZXIuaGllck1vZGVsQXJyICYmIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmhpZXJNb2RlbEFyci5sZW5ndGgpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSGllclZhbFNlbGVjdGlvbk1vZGVsc10gPSBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5oaWVyTW9kZWxBcnI7XG4gICAgfVxuICAgIGlmIChzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5xdWFudE1vZGVsQXJyICYmIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnF1YW50TW9kZWxBcnIubGVuZ3RoKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlF1YW50UmFuZ2VTZWxlY3Rpb25Nb2RlbHNdID0gc2VsZWN0aW9uTW9kZWxDb250YWluZXIucXVhbnRNb2RlbEFycjtcbiAgICB9XG4gICAgaWYgKHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmRpbU1vZGVsQXJyICYmIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmRpbU1vZGVsQXJyLmxlbmd0aCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5EaW1WYWxTZWxlY3Rpb25Nb2RlbHNdID0gc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2VsZWN0QnlWYWx1ZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMuYXBpRmlsdGVySGFuZGxlckNoZWNrRm9yQ29tbWFuZEVycm9yKHJlc3BvbnNlLnJlc3VsdCBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gZXhlY3V0ZSBob3ZlciBhY3Rpb25zIGFuZCByZW5kZXIgdG9vbHRpcCBmb3IgYSBnaXZlbiB0dXBsZSByZXByZXNlbnRpbmcgYSBtYXJrIGluIHRoZSB2aXN1YWxpemF0aW9uLlxuICAgKiBJZiB0aGUgdG9vbHRpcCBwYXJhbWV0ZXIgaXMgaW5jbHVkZWQgaXQgd2lsbCBzaG93IHRoZSB0b29sdGlwIG9uIGhvdmVyLiBJZiBub3QsIG5vIHRvb2x0aXAgaXMgc2hvd24uXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gaG92ZXJlZFR1cGxlXG4gICAqIEBwYXJhbSB0b29sdGlwXG4gICAqIEByZXR1cm5zIGVtcHR5IHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBleHRlbnNpb24gaG9zdCBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gaW5mb3JtZWQgb2YgdGhlIHJlcXVlc3QgYW5kIHJlamVjdHMgb24gZXJyb3JcbiAgICovXG4gIHB1YmxpYyBob3ZlclR1cGxlQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGhvdmVyZWRUdXBsZT86IG51bWJlcixcbiAgICB0b29sdGlwPzogQ29udHJhY3QuVG9vbHRpcENvbnRleHQgfCBudWxsLFxuICAgIGFsbG93SG92ZXJBY3Rpb25zPzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGludGVyYWN0aW9uTW9kZWwgPSBuZXcgSG92ZXJUdXBsZUludGVyYWN0aW9uTW9kZWwoXG4gICAgICB2aXN1YWxJZCxcbiAgICAgIHRoaXMuZW5zdXJlVHVwbGVJRElzTm9uTmVnYXRpdmUoaG92ZXJlZFR1cGxlKSxcbiAgICAgIHRvb2x0aXAsXG4gICAgICBhbGxvd0hvdmVyQWN0aW9ucyxcbiAgICApO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2hvdmVyVHVwbGVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuSG92ZXJUdXBsZUludGVyYWN0aW9uXTogaW50ZXJhY3Rpb25Nb2RlbCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuUmFpc2VIb3ZlclR1cGxlTm90aWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBtb2RpZnkgc2VsZWN0aW9uLCBleGVjdXRlIHNlbGVjdCBhY3Rpb25zIGFuZCByZW5kZXIgdG9vbHRpcCBmb3IgYSBnaXZlbiBsaXN0IG9mIHR1cGxlcyByZXByZXNlbnRpbmcgYSBtYXJrIG9yIG1hcmtzIGluIHRoZSB2aXN1YWxpemF0aW9uLlxuICAgKiBJZiB0aGUgdG9vbHRpcCBwYXJhbWV0ZXIgaXMgaW5jbHVkZWQgaXQgd2lsbCBzaG93IHRoZSB0b29sdGlwIG9uIHNlbGVjdC4gSWYgbm90LCBubyB0b29sdGlwIGlzIHNob3duLlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHBhcmFtIHNlbGVjdGVkVHVwbGVzXG4gICAqIEBwYXJhbSBzZWxlY3RPcHRpb25cbiAgICogQHBhcmFtIHRvb2x0aXBcbiAgICogQHJldHVybnMgZW1wdHkgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGV4dGVuc2lvbiBob3N0IGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBpbmZvcm1lZCBvZiB0aGUgcmVxdWVzdCBhbmQgcmVqZWN0cyBvbiBlcnJvclxuICAgKi9cbiAgcHVibGljIHNlbGVjdFR1cGxlc0FzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBzZWxlY3RlZFR1cGxlczogQXJyYXk8bnVtYmVyPixcbiAgICBzZWxlY3RPcHRpb246IENvbnRyYWN0LlNlbGVjdE9wdGlvbnMsXG4gICAgdG9vbHRpcD86IENvbnRyYWN0LlRvb2x0aXBDb250ZXh0LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgaW50ZXJhY3Rpb25Nb2RlbCA9IG5ldyBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbk1vZGVsKHZpc3VhbElkLCBzZWxlY3RlZFR1cGxlcywgc2VsZWN0T3B0aW9uLCB0b29sdGlwKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzZWxlY3RUdXBsZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb25dOiBpbnRlcmFjdGlvbk1vZGVsLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SYWlzZVNlbGVjdFR1cGxlc05vdGlmaWNhdGlvbiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBpRmlsdGVySGFuZGxlckNoZWNrRm9yQ29tbWFuZEVycm9yKHNlcnZlclBtOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgaWYgKCFzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5QYXJhbWV0ZXJFcnJvcl0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW1BhcmFtZXRlcklkLkludmFsaWRGaWVsZHNdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFNlbGVjdGlvbkZpZWxkTmFtZSwgc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZEZpZWxkc10pO1xuICAgIH1cbiAgICBpZiAoc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZFZhbHVlc10pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uVmFsdWUsIHNlcnZlclBtW1BhcmFtZXRlcklkLkludmFsaWRWYWx1ZXNdKTtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW1BhcmFtZXRlcklkLkludmFsaWREYXRlc10pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uRGF0ZSwgc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZERhdGVzXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBzZWxlY3QgbWFya3MgZm9yIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gTWFya0luZm9cbiAgICogQHBhcmFtIHNlbGVjdGlvblVwZGF0ZVR5cGVcbiAgICovXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SWRBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbWFya3M6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPixcbiAgICBzZWxlY3Rpb25VcGRhdGVUeXBlOiBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAobWFya3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ01hcmtzIGluZm8gbWlzc2luZyBmb3Igc2VsZWN0aW5nIG1hcmtzIGJ5IElkJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0aW9uVHlwZTogc3RyaW5nID0gdGhpcy52YWxpZGF0ZVNlbGVjdGlvblVwZGF0ZVR5cGUoc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VTZWxlY3Rpb25JZHMobWFya3MpO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NlbGVjdE1hcmtzQnlJZEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvblVwZGF0ZVR5cGVdOiBzZWxlY3Rpb25UeXBlLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvbl06IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbixcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNlbGVjdEJ5VmFsdWUsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgICAgLy8gVE9ETyBJbnZlc3RpZ2F0ZSB0aGUgZXJyb3IgcmVzcG9uc2Ugd2l0aCBtdWx0aXBsZSBvdXRwdXQgcGFyYW1zIGFuZCB0aHJvdyBlcnJvciBhY2NvcmRpbmdseS5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrc0luZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlU2VsZWN0aW9uSWRzKG1hcmtzOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IGlkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdHVwbGVJZDogbnVtYmVyIHwgdW5kZWZpbmVkID0gbWFya3NbaV0udHVwbGVJZDtcbiAgICAgIGlmICh0dXBsZUlkICE9PSB1bmRlZmluZWQgJiYgdHVwbGVJZCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0dXBsZSBpZCBpcyBwcm92aWRlZCB1c2UgdGhhdCBpbnN0ZWFkIG9mIHBhaXJcbiAgICAgICAgaWRzLnB1c2godHVwbGVJZC50b1N0cmluZygpKTsgLy8gY29sbGVjdCB0aGUgdHVwbGUgaWRzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3R1cGxlSWQgcGFyc2luZyBlcnJvcicpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgLy8gdHVwbGUgaWRzIGJhc2VkIHNlbGVjdGlvblxuICAgICAgY29uc3QgdHVwbGVTZWxlY3Rpb25Nb2RlbDogVHVwbGVTZWxlY3Rpb25Nb2RlbCA9IG5ldyBUdXBsZVNlbGVjdGlvbk1vZGVsKCk7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLnNlbGVjdGlvblR5cGUgPSAndHVwbGVzJztcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwub2JqZWN0SWRzID0gaWRzO1xuICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uID0gdHVwbGVTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBwcmVwYXJlIHRoZSBwcmVzIG1vZGVscyBmb3Igc2VsZWN0aW9uIGJ5IHZhbHVlcy5cbiAgICpcbiAgICogU3VwcG9ydHMgMyB0eXBlcyBmb3Igc2VsZWN0aW9uOlxuICAgKiAxKSBIaWVyYXJjaGljYWwgdmFsdWUgYmFzZWQgc2VsZWN0aW9uXG4gICAqIDIpIFJhbmdlIHZhbHVlIGJhc2VkIHNlbGVjdGlvblxuICAgKiAzKSBEaW1lbnNpb24gdmFsdWUgYmFzZWQgc2VsZWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBtYXJrc1xuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVNlbGVjdGlvbk1hcmtzKHNlbGVjdGlvbkNyaXRlcmlhczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+KTogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gbmV3IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lcigpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb25Dcml0ZXJpYXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN0ID0gc2VsZWN0aW9uQ3JpdGVyaWFzW2ldO1xuICAgICAgaWYgKCEoc3QuZmllbGROYW1lICYmIHN0LnZhbHVlICE9PSB1bmRlZmluZWQgJiYgc3QudmFsdWUgIT09IG51bGwpKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnU2VsZWN0aW9uIENyaXRlcmlhIHBhcnNpbmcgZXJyb3InKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2F0UmVnZXggPSBuZXcgUmVnRXhwKCcoW1tBLVphLXowLTldK10pLionLCAnZycpO1xuICAgICAgY29uc3QgcmFuZ2VPcHRpb24gPSBzdC52YWx1ZSBhcyBDb250cmFjdC5SYW5nZVZhbHVlO1xuICAgICAgaWYgKGNhdFJlZ2V4LnRlc3Qoc3QuZmllbGROYW1lKSkge1xuICAgICAgICAvLyBIaWVyYXJjaGljYWwgdmFsdWUgc2VsZWN0aW9uXG4gICAgICAgIGNvbnN0IGhpZXJNb2RlbDogSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWwgPSB0aGlzLmFkZFRvUGFyYW1zTGlzdChzdC5maWVsZE5hbWUsIHN0LnZhbHVlKSBhcyBIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbDtcbiAgICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuaGllck1vZGVsQXJyLnB1c2goaGllck1vZGVsKTtcbiAgICAgIH0gZWxzZSBpZiAocmFuZ2VPcHRpb24ubWluICE9PSB1bmRlZmluZWQgJiYgcmFuZ2VPcHRpb24ubWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gUmFuZ2UgdmFsdWUgc2VsZWN0aW9uXG4gICAgICAgIGNvbnN0IHF1YW50TW9kZWw6IFJhbmdlU2VsZWN0aW9uTW9kZWwgPSB0aGlzLmFkZFRvUmFuZ2VQYXJhbXNMaXN0KHN0LmZpZWxkTmFtZSwgcmFuZ2VPcHRpb24pO1xuICAgICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5xdWFudE1vZGVsQXJyLnB1c2gocXVhbnRNb2RlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEaW1lbnNpb24gdmFsdWUgc2VsZWN0aW9uXG4gICAgICAgIGNvbnN0IGRpbU1vZGVsOiBEaW1lbnNpb25TZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYWRkVG9QYXJhbXNMaXN0KHN0LmZpZWxkTmFtZSwgc3QudmFsdWUpIGFzIERpbWVuc2lvblNlbGVjdGlvbk1vZGVsO1xuICAgICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5kaW1Nb2RlbEFyci5wdXNoKGRpbU1vZGVsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZWxDb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHRyYW5zZm9ybSB0aGUga2V5IHZhbHVlIHBhaXIgaW50byB2YWx1ZSBiYXNlZCBwcmVzIG1vZGVsIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlU2VsZWN0aW9uTW9kZWxcbiAgICogQHBhcmFtIGZpZWxkTmFtZVxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHByaXZhdGUgYWRkVG9QYXJhbXNMaXN0KGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogQ29udHJhY3QuQ2F0ZWdvcmljYWxWYWx1ZSB8IENvbnRyYWN0LlJhbmdlVmFsdWUpOiBWYWx1ZVNlbGVjdGlvbk1vZGVsIHtcbiAgICBjb25zdCB2YWx1ZVNlbGVjdGlvbk1vZGVsOiBWYWx1ZVNlbGVjdGlvbk1vZGVsID0gbmV3IFZhbHVlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICBjb25zdCBtYXJrVmFsdWVzOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgY29uc3QgdmFsdWVBcnI6IEFycmF5PHN0cmluZz4gPSB2YWx1ZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbWFya1ZhbHVlcy5wdXNoKFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlQXJyW2ldKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcmtWYWx1ZXMucHVzaChQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIHZhbHVlU2VsZWN0aW9uTW9kZWwucXVhbGlmaWVkRmllbGRDYXB0aW9uID0gZmllbGROYW1lO1xuICAgIHZhbHVlU2VsZWN0aW9uTW9kZWwuc2VsZWN0VmFsdWVzID0gbWFya1ZhbHVlcztcbiAgICByZXR1cm4gdmFsdWVTZWxlY3Rpb25Nb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdHJhbnNmb3JtIHRoZSBrZXkgdmFsdWUgcGFpciBpbnRvIHJhbmdlIGJhc2VkIHNlbGVjdGlvbiBwcmVzIG1vZGVsLlxuICAgKlxuICAgKiBUT0RPOiBOZWVkIHRvIGhhbmRsZSB0aGUgcGFyc2luZyBvZiBkYXRlIHR5cGUgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVTZWxlY3Rpb25Nb2RlbFxuICAgKiBAcGFyYW0gZmllbGROYW1lXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRUb1JhbmdlUGFyYW1zTGlzdChmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IENvbnRyYWN0LlJhbmdlVmFsdWUpOiBSYW5nZVNlbGVjdGlvbk1vZGVsIHtcbiAgICBjb25zdCByYW5nZVNlbGVjdGlvbk1vZGVsOiBSYW5nZVNlbGVjdGlvbk1vZGVsID0gbmV3IFJhbmdlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICByYW5nZVNlbGVjdGlvbk1vZGVsLnF1YWxpZmllZEZpZWxkQ2FwdGlvbiA9IGZpZWxkTmFtZTtcbiAgICBpZiAodmFsdWUubWF4ICE9PSB1bmRlZmluZWQgJiYgdmFsdWUubWF4ICE9PSBudWxsKSB7XG4gICAgICByYW5nZVNlbGVjdGlvbk1vZGVsLm1heFZhbHVlID0gUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWUubWF4KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLm1pbiAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLm1pbiAhPT0gbnVsbCkge1xuICAgICAgcmFuZ2VTZWxlY3Rpb25Nb2RlbC5taW5WYWx1ZSA9IFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlLm1pbik7XG4gICAgfVxuICAgIHJhbmdlU2VsZWN0aW9uTW9kZWwuaW5jbHVkZWQgPSB0aGlzLnZhbGlkYXRlTnVsbE9wdGlvblR5cGUodmFsdWUubnVsbE9wdGlvbik7XG4gICAgcmV0dXJuIHJhbmdlU2VsZWN0aW9uTW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHZhbGlkYXRlIHRoZSBzZWxlY3Rpb24gdXBkYXRlIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25VcGRhdGVUeXBlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlOiBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlKTogc3RyaW5nIHtcbiAgICBpZiAoc2VsZWN0aW9uVXBkYXRlVHlwZSA9PT0gQ29udHJhY3QuU2VsZWN0aW9uVXBkYXRlVHlwZS5SZXBsYWNlKSB7XG4gICAgICByZXR1cm4gU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLlJlcGxhY2U7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rpb25VcGRhdGVUeXBlID09PSBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlLkFkZCkge1xuICAgICAgcmV0dXJuIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbC5BZGQ7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rpb25VcGRhdGVUeXBlID09PSBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlLlJlbW92ZSkge1xuICAgICAgcmV0dXJuIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbC5SZW1vdmU7XG4gICAgfVxuICAgIHJldHVybiBTZWxlY3Rpb25VcGRhdGVUeXBlSW50ZXJuYWwuUmVwbGFjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdmFsaWRhdGUgdGhlIGluY2x1ZGUgdHlwZSBmb3IgcmFuZ2Ugc2VsZWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbnVsbE9wdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZU51bGxPcHRpb25UeXBlKG51bGxPcHRpb246IENvbnRyYWN0LkZpbHRlck51bGxPcHRpb24gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmIChudWxsT3B0aW9uKSB7XG4gICAgICBpZiAobnVsbE9wdGlvbiA9PT0gQ29udHJhY3QuRmlsdGVyTnVsbE9wdGlvbi5OdWxsVmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcy5JbmNsdWRlTnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobnVsbE9wdGlvbiA9PT0gQ29udHJhY3QuRmlsdGVyTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcy5JbmNsdWRlTm9uTnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobnVsbE9wdGlvbiA9PT0gQ29udHJhY3QuRmlsdGVyTnVsbE9wdGlvbi5BbGxWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVBbGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVBbGw7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVR1cGxlSURJc05vbk5lZ2F0aXZlKHR1cGxlSWQ/OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0dXBsZUlkICYmIHR1cGxlSWQgPiAwKSB7XG4gICAgICByZXR1cm4gdHVwbGVJZDtcbiAgICB9XG5cbiAgICAvLyAwIHdpbGwgbm90IHJlZmVyIHRvIGEgdmFsaWQgdHVwbGUgKHNpbmNlIHR1cGxlIGlkcyBhcmUgMS1iYXNlZCksXG4gICAgLy8gYnV0IGNhbiBiZSB1c2VkIGZvciBjbGVhcmluZyB0aGUgY3VycmVudCBob3ZlciBvciBzZWxlY3Rpb25cbiAgICByZXR1cm4gMDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIEludGVybmFsVGFibGVhdUVycm9yLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgU2hvdWxkVGhyb3cgfSBmcm9tICcuLi8uLi9VdGlscy9FbnVtQ29udmVydGVyJztcblxuLyoqXG4gKiBFYWNoIFNlcnZjZUltcGwgc2hvdWxkIGV4dGVuZCB0aGlzIGJhc2UgY2xhc3MgZm9yIHRoZSBzYWtlIG9mXG4gKiBwcm9wZXIgZXJyb3IgaGFuZGxpbmcuICBUaGlzIGJhc2UgaGFuZGxlcyB0aGUgY29udmVyc2lvblxuICogZnJvbSBpbnRlcm5hbCBlcnJvcnMgdG8gZXh0ZXJuYWwgZXJyb3JzIHRoYXQgd2UgdGhyb3cgdG8gZGV2ZWxvcGVyc1xuICovXG5leHBvcnQgY2xhc3MgU2VydmljZUltcGxCYXNlIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2Rpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgICBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgKSB7fVxuXG4gIHByb3RlY3RlZCBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoZXIuZXhlY3V0ZSh2ZXJiLCBwYXJhbXMpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgLy8gQW55IGludGVybmFsIGVycm9yIHRoYXQgY29tZXMgZnJvbSB0aGUgZGlzcGF0Y2hlciBzaG91bGQgYmUgY29udmVydGVkXG4gICAgICAvLyB0byBhbiBleHRlcm5hbCBlcnJvciB1c2luZyB0aGUgZW51bSBtYXBwZXIgZm9yIGVycm9yIGNvZGVzLlxuICAgICAgY29uc3QgaW50ZXJuYWxFcnJvciA9IGVycm9yIGFzIEludGVybmFsVGFibGVhdUVycm9yO1xuICAgICAgY29uc3QgZXh0ZXJuYWxFcnJvckNvZGU6IEVycm9yQ29kZXMgPSBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZXJyb3JDb2RlLmNvbnZlcnQoaW50ZXJuYWxFcnJvci5lcnJvckNvZGUsIFNob3VsZFRocm93Lk5vKTtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoZXh0ZXJuYWxFcnJvckNvZGUsIGludGVybmFsRXJyb3IubWVzc2FnZSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNoZWV0U2l6ZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuLi9TaXplU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBTaXplU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTaXplU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlNpemU7XG4gIH1cblxuICBjaGFuZ2VTaXplQXN5bmMobmFtZTogc3RyaW5nLCBuZXdTaXplOiBTaGVldFNpemUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY2hhbmdlU2l6ZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaGVldE5hbWVdOiBuYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLk1pbkhlaWdodF06IG5ld1NpemUubWluU2l6ZT8uaGVpZ2h0IHx8IDAsXG4gICAgICBbUGFyYW1ldGVySWQuTWluV2lkdGhdOiBuZXdTaXplLm1pblNpemU/LndpZHRoIHx8IDAsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4SGVpZ2h0XTogbmV3U2l6ZS5tYXhTaXplPy5oZWlnaHQgfHwgMCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhXaWR0aF06IG5ld1NpemUubWF4U2l6ZT8ud2lkdGggfHwgMCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0U2hlZXRTaXplLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChfcmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBTdG9yeVBvaW50TW9kZWwsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU3RvcnlBY3RpdmF0aW9uU2VydmljZSB9IGZyb20gJy4uL1N0b3J5QWN0aXZhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuU3RvcnlBY3RpdmF0aW9uO1xuICB9XG5cbiAgYWN0aXZhdGVOZXh0U3RvcnlQb2ludEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQWN0aXZhdGVOZXh0U3RvcnlQb2ludDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVOZXh0U3RvcnlQb2ludEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFjdGl2YXRlUHJldmlvdXNTdG9yeVBvaW50O1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgYWN0aXZhdGVTdG9yeVBvaW50QXN5bmMoaW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQWN0aXZhdGVTdG9yeVBvaW50O1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhY3RpdmF0ZVN0b3J5UG9pbnRBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlN0b3J5UG9pbnRJbmRleF0gPSBpbmRleDtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHJldmVydFN0b3J5UG9pbnRBc3luYyhpbmRleDogbnVtYmVyKTogUHJvbWlzZTxTdG9yeVBvaW50TW9kZWw+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLlJldmVydFN0b3J5UG9pbnQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JldmVydFN0b3J5UG9pbnRBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlN0b3J5UG9pbnRJbmRleF0gPSBpbmRleDtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxTdG9yeVBvaW50TW9kZWw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBTdG9yeVBvaW50TW9kZWw7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQsIFZpc3VhbFNwZWNpZmljYXRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFZpc3VhbE1vZGVsU2VydmljZSB9IGZyb20gJy4uL1Zpc3VhbE1vZGVsU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBWaXN1YWxNb2RlbFNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgVmlzdWFsTW9kZWxTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFZpc3VhbFNwZWNpZmljYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgVmlzdWFsU3BlY2lmaWNhdGlvbjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWRkTWFya3NDYXJkRmllbGRzQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIG1hcmtzQ2FyZEluZGV4OiBudW1iZXIsXG4gICAgZW5jb2RpbmdUeXBlOiBDb250cmFjdC5FbmNvZGluZ1R5cGUsXG4gICAgY29sdW1uczogc3RyaW5nW10sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWRkTWFya3NDYXJkRmllbGRzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBbUGFyYW1ldGVySWQuTWFya3NDYXJkSW5kZXhdOiBtYXJrc0NhcmRJbmRleCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FbmNvZGluZ1R5cGVdOiBlbmNvZGluZ1R5cGUsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc106IGNvbHVtbnMsXG4gICAgICBbUGFyYW1ldGVySWQuU3RhcnRJbmRleF06IHN0YXJ0SW5kZXgsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5BZGRNYXJrc0NhcmRGaWVsZHMsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1vdmVNYXJrc0NhcmRGaWVsZEFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGZyb21JbmRleDogbnVtYmVyLFxuICAgIHRvSW5kZXg6IG51bWJlcixcbiAgICBmaWVsZENvdW50ID0gMSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogdmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgW1BhcmFtZXRlcklkLk1hcmtzQ2FyZEluZGV4XTogbWFya3NDYXJkSW5kZXgsXG4gICAgICBbUGFyYW1ldGVySWQuRnJvbUluZGV4XTogZnJvbUluZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLlRvSW5kZXhdOiB0b0luZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLkZpZWxkQ291bnRdOiBmaWVsZENvdW50LFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuTW92ZU1hcmtzQ2FyZEZpZWxkLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbWFya3NDYXJkSW5kZXg6IG51bWJlcixcbiAgICBlbmNvZGluZ1R5cGU6IENvbnRyYWN0LkVuY29kaW5nVHlwZSxcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgZGVsZXRlQ291bnQ6IG51bWJlcixcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NwbGljZU1hcmtzQ2FyZEZpZWxkc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogdmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgW1BhcmFtZXRlcklkLk1hcmtzQ2FyZEluZGV4XTogbWFya3NDYXJkSW5kZXgsXG4gICAgICBbUGFyYW1ldGVySWQuRW5jb2RpbmdUeXBlXTogZW5jb2RpbmdUeXBlLFxuICAgICAgW1BhcmFtZXRlcklkLlN0YXJ0SW5kZXhdOiBzdGFydEluZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLkRlbGV0ZUNvdW50XTogZGVsZXRlQ291bnQsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc106IGNvbHVtbnMsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TcGxpY2VNYXJrc0NhcmRGaWVsZHMsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgZWRpdEFsaWFzZXNEaWFsb2dBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdlZGl0QWxpYXNlc0RpYWxvZ0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5GaWVsZElkXTogZmllbGROYW1lLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuRWRpdEFsaWFzZXNEaWFsb2csIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDdXN0b21WaWV3TW9kZWwsIEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEN1c3RvbVZpZXdJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9DdXN0b21WaWV3SW1wbCc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgVml6U2VydmljZSB9IGZyb20gJy4uL1ZpelNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgVml6U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBWaXpTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuVml6O1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVZpekltYWdlQXN5bmMoaW5wdXRTcGVjOiBvYmplY3QpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjcmVhdGVWaXpJbWFnZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXpBUElJbnB1dEpzb25dOiBKU09OLnN0cmluZ2lmeShpbnB1dFNwZWMpLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5WaXpBUEksIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmF0ZVNoZWV0QXN5bmMobmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FjdGl2YXRlU2hlZXRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU3dpdGNoVG9TaGVldE5hbWVdOiBuYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5BY3RpdmF0ZVNoZWV0LCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXN0b21WaWV3c0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q3VzdG9tVmlld0ltcGw+PiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEN1c3RvbVZpZXdzQXN5bmMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRDdXN0b21WaWV3cywgcGFyYW1ldGVycykudGhlbjxBcnJheTxDdXN0b21WaWV3SW1wbD4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlld3MgPSByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8Q3VzdG9tVmlld01vZGVsPjtcbiAgICAgIHJldHVybiBjdXN0b21WaWV3cy5tYXAoKGN1c3RvbVZpZXc6IEN1c3RvbVZpZXdNb2RlbCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2hvd0N1c3RvbVZpZXdBc3luYyhjdXN0b21WaWV3TmFtZT86IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPEN1c3RvbVZpZXdJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3Nob3dDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUgfHwgJycsIC8vIGEgZmFsc2V5IHZhbHVlIG1lYW5zIFwic2hvdyBvcmlnaW5hbCB2aWV3XCJcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2hvd0N1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGwgfCB1bmRlZmluZWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gY3VzdG9tVmlldz8ubHVpZCA/IG5ldyBDdXN0b21WaWV3SW1wbChjdXN0b21WaWV3LCB0aGlzLl9yZWdpc3RyeUlkKSA6IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVDdXN0b21WaWV3QXN5bmMoY3VzdG9tVmlld05hbWU6IHN0cmluZyk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVtb3ZlQ3VzdG9tVmlld0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3TmFtZV06IGN1c3RvbVZpZXdOYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZW1vdmVDdXN0b21WaWV3LCBwYXJhbWV0ZXJzKS50aGVuPEN1c3RvbVZpZXdJbXBsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbVZpZXcgPSByZXNwb25zZS5yZXN1bHQgYXMgQ3VzdG9tVmlld01vZGVsO1xuICAgICAgcmV0dXJuIG5ldyBDdXN0b21WaWV3SW1wbChjdXN0b21WaWV3LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQ3VzdG9tVmlld0FzeW5jKGN1c3RvbVZpZXdOYW1lOiBzdHJpbmcpOiBQcm9taXNlPEN1c3RvbVZpZXdJbXBsPiB7XG4gICAgLy8gQ3VzdG9tVmlld0lzRGVmYXVsdCBpcyBhIHJlcXVpcmVkIHBhcmFtZXRlciwgYnV0IG91ciBBUEkgaGFzIG5vdCBiZWVuIHVwZGF0ZWQgdG8gYWxsb3cgaXQgdG8gYmUgc3BlY2lmaWVkIHlldC5cbiAgICAvLyBXZSBzaG91bGQgYWRkIGEgJ2RlZmF1bHQnIHBhcmFtZXRlciB0byB0aGUgaW50ZXJmYWNlLlxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzYXZlQ3VzdG9tVmlld0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3TmFtZV06IGN1c3RvbVZpZXdOYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdJc0RlZmF1bHRdOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2F2ZVdvcmtib29rQXNDdXN0b21WaWV3LCBwYXJhbWV0ZXJzKS50aGVuPEN1c3RvbVZpZXdJbXBsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbVZpZXcgPSByZXNwb25zZS5yZXN1bHQgYXMgQ3VzdG9tVmlld01vZGVsO1xuICAgICAgcmV0dXJuIG5ldyBDdXN0b21WaWV3SW1wbChjdXN0b21WaWV3LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBY3RpdmVDdXN0b21WaWV3QXNEZWZhdWx0QXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NldEFjdGl2ZUN1c3RvbVZpZXdBc0RlZmF1bHRBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNldEFjdGl2ZUN1c3RvbVZpZXdBc0RlZmF1bHQsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYyhjdXN0b21WaWV3OiBDdXN0b21WaWV3SW1wbCk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2F2ZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3THVpZF06IGN1c3RvbVZpZXcubHVpZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3TmFtZV06IGN1c3RvbVZpZXcubmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3SXNEZWZhdWx0XTogY3VzdG9tVmlldy5pc0RlZmF1bHQsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld0lzUHVibGljXTogY3VzdG9tVmlldy5zaGFyZWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlVwZGF0ZUN1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEN1cnJlbnRTcmNBc3luYygpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRDdXJyZW50U3JjQXN5bmMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRDdXJyZW50U3JjLCBwYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyBhcyBFeHRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdEltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0Rhc2hib2FyZE9iamVjdEltcGwnO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFpvbmVTZXJ2aWNlIH0gZnJvbSAnLi4vWm9uZVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgWm9uZVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgWm9uZVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5ab25lO1xuICB9XG5cbiAgcHVibGljIHNldFZpc2liaWxpdHlBc3luYyhcbiAgICBkYXNoYm9hcmQ6IHN0cmluZyxcbiAgICBkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPixcbiAgICB6b25lVmlzaWJpbGl0eU1hcDogQ29udHJhY3QuWm9uZVZpc2liaWxpdHlNYXAsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NldFZpc2liaWxpdHlBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGFzaGJvYXJkXTogZGFzaGJvYXJkLFxuICAgICAgW1BhcmFtZXRlcklkLlpvbmVJZHNWaXNpYmlsaXR5TWFwXToge30sXG4gICAgfTtcblxuICAgIC8vIHpvbmVWaXNpYmlsaXR5TWFwIGNhbiBiZSBlaXRoZXIgYW4gb2JqZWN0IG9yIGEgTWFwIC0gY29udmVydCBpdCB0byBhIE1hcFxuICAgIGNvbnN0IHBhcmFtZXRlckFzTWFwID0gUGFyYW0uY29udmVydFBhcmFtZXRlclRvTWFwKHpvbmVWaXNpYmlsaXR5TWFwLCAnem9uZVZpc2liaWxpdHlNYXAnKTtcblxuICAgIHBhcmFtZXRlckFzTWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlab25lSXNWYWxpZChkYXNoYm9hcmRab25lTWFwLCBOdW1iZXIucGFyc2VJbnQoa2V5LCAxMCkpO1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZT4odmFsdWUsIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLCAnRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUnKTtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuWm9uZUlkc1Zpc2liaWxpdHlNYXBdW2tleV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuc2V0VmlzaWJpbGl0eVR5cGUuY29udmVydCh2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZXRab25lVmlzaWJpbGl0eSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlQW5kUmVzaXplQXN5bmMoXG4gICAgZGFzaGJvYXJkOiBzdHJpbmcsXG4gICAgZGFzaGJvYXJkWm9uZU1hcDogTWFwPG51bWJlciwgRGFzaGJvYXJkT2JqZWN0SW1wbD4sXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkRhc2hib2FyZF06IGRhc2hib2FyZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVMaXN0XTogZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXksXG4gICAgfTtcblxuICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LmZvckVhY2goKGRhc2hib2FyZE9iamVjdDogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlKSA9PiB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5Wm9uZUlzVmFsaWRBbmRGbG9hdGluZyhkYXNoYm9hcmRab25lTWFwLCBkYXNoYm9hcmRPYmplY3QuZGFzaGJvYXJkT2JqZWN0SUQpO1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVdpZHRoQW5kSGVpZ2h0T2ZEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUoZGFzaGJvYXJkT2JqZWN0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLk1vdmVBbmRSZXNpemVab25lcywgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSB0YWJsZSBzdW1tYXJ5LlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgVGFibGVTdW1tYXJ5IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVTdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3RhYmxlSW5mbzogVGFibGVJbmZvKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBjb25uZWN0aW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLmNvbm5lY3Rpb25JZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VzdG9tU1FMKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5jdXN0b21TUUw7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVtYmVkZGluZ0Vycm9yQ29kZXMsIEVycm9yQ29kZXMsIFNoYXJlZEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEN1c3RvbSBlcnJvciBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIGRlZmF1bHQgSmF2YVNjcmlwdCBFcnJvciBvYmplY3QuXG4gKiBUaGlzIGFsbG93cyB1cyB0byBwcm92aWRlIGEgZmllbGQgd2l0aCBhIHNwZWNpZmljIGVycm9yIGNvZGVcbiAqIHNvIHRoYXQgZGV2ZWxvcGVycyBjYW4gbW9yZSBlYXNpbHkgcHJvZ3JhbW1hdGljYWxseSByZXNwb25kXG4gKiB0byBlcnJvciBzY2VuYXJpb3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZWF1RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9lcnJvckNvZGU6IEVycm9yQ29kZXMgfCBFbWJlZGRpbmdFcnJvckNvZGVzIHwgU2hhcmVkRXJyb3JDb2RlcyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKGAke19lcnJvckNvZGV9OiAke21lc3NhZ2V9YCk7XG5cbiAgICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC13aWtpL2Jsb2IvbWFzdGVyL0JyZWFraW5nLUNoYW5nZXMubWQjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrXG4gICAgLy8gRXJyb3IgaW5oZXJpdGFuY2UgZG9lcyBub3Qgd29yayBwcm9wZXJ0bHkgd2hlbiBjb21waWxpbmcgdG8gRVM1LCB0aGlzIGlzIGEgd29ya2Fyb3VuZCB0byBmb3JjZVxuICAgIC8vIHRoZSBwcm90byBjaGFpbiB0byBiZSBidWlsdCBjb3JyZWN0bHkuICBTZWUgdGhlIGdpdGh1YiBsaW5rIGFib3ZlIGZvciBkZXRhaWxzLlxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBUYWJsZWF1RXJyb3IucHJvdG90eXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXJyb3JDb2RlKCk6IEVycm9yQ29kZXMgfCBFbWJlZGRpbmdFcnJvckNvZGVzIHwgU2hhcmVkRXJyb3JDb2RlcyB7XG4gICAgcmV0dXJuIHRoaXMuX2Vycm9yQ29kZTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgSW50ZXJuYWxDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVZhbHVlIH0gZnJvbSAnLi4vTW9kZWxzL0dldERhdGFNb2RlbHMnO1xuXG4vKipcbiAqIEluIHZlcnNpb24gMiBvZiB0aGUgaW50ZXJmYWNlLCB3ZSBzaG91bGQgY29sbGFwc2UgdmFsdWUgaW50byBuYXRpdmVWYWx1ZSwgYW5kIGRvIGFsbCB0aGlzIHdvcmsgb3ZlclxuICogaW4gdGhlIHBsYXRmb3JtLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YVZhbHVlRmFjdG9yeSB7XG4gIHB1YmxpYyBzdGF0aWMgTWFrZVBhcmFtZXRlckRhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVmFsdWUsIGRhdGFUeXBlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlKTogRGF0YVZhbHVlIHtcbiAgICAvLyBQYXJhbWV0ZXIgdmFsdWVzIGFyZSBhbGwgc3RyaW5ncywgY29udmVydCBmcm9tIHN0cmluZyB0byB2YWx1ZVxuICAgIHJldHVybiBuZXcgRGF0YVZhbHVlKFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsXG4gICAgICBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlQ29udmVydGVyLmNvbnZlcnRTdHJpbmdWYWx1ZVRvTmF0aXZlVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGRhdGFUeXBlKSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmZvcm1hdHRlZFZhbHVlLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUuYWxpYXNlZFZhbHVlLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUuaGFzQWxpYXMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgTWFrZUZpbHRlckRhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVmFsdWUpOiBEYXRhVmFsdWUge1xuICAgIC8vIEZpbHRlcnMgYWxyZWFkeSBoYXZlIG5hdGl2ZSB0eXBlIGluIHZhbHVlLCBqdXN0IHVzZSB0aGF0IGZvciBuYXRpdmVWYWx1ZSBhbHNvXG4gICAgcmV0dXJuIG5ldyBEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBpbnRlcm5hbERhdGFWYWx1ZS5mb3JtYXR0ZWRWYWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIE1ha2VUYWJsZURhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVmFsdWUsIGRhdGFUeXBlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlKTogRGF0YVZhbHVlIHtcbiAgICAvLyBEYXRhVGFibGVzIGNvbnRhaW4gYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IGRhdGUgYXMgc3RyaW5nIHwgJyVudWxsJVxuICAgIC8vIGNvbnZlcnRWYWx1ZVRvTmF0aXZlVmFsdWUgY29udmVydHMgZGF0ZXMgYXMgc3RyaW5nIHRvIGRhdGVzLCBhbmQgYW55IHNwZWNpYWwgdG8gbnVsbFxuICAgIC8vIChib29sZWFuLCBudW1iZXJzLCBzdHJpbmdzIGFyZSBwYXNzZWQgdGhyb3VnaClcbiAgICAvLyBCZWNhdXNlIG9mIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIC0gd2UgY2FuIGhhdmUgdW5kZWZpbmVkIHZhbHVlcywgd2hpY2ggYXJlIGRpZmZlcmVudCB0aGFuIGFueSBzcGVjaWFsXG4gICAgcmV0dXJuIG5ldyBEYXRhVmFsdWUoXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlQ29udmVydGVyLmNvbnZlcnRWYWx1ZVRvTmF0aXZlVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGRhdGFUeXBlKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmZvcm1hdHRlZFZhbHVlLFxuICAgICk7XG4gIH1cbn1cbiIsIi8qKlxuICogQSBQcm9taXNlIHdyYXBwZXIgY2xhc3MgYWxsb3dpbmcgZm9yIHJlc29sdmluZy9yZWplY3RpbmcgdGhlIFByb21pc2Ugb3V0c2lkZSB0aGUgY29udGV4dCBvZiBpdHMgY29uc3RydWN0b3IuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIERlZmVycmVkXG4gKiBAdGVtcGxhdGUgVFJlc29sdmUgVGhlIHR5cGUgdXNlZCB0byByZXNvbHZlIHRoZSBwcm9taXNlLlxuICogQHRlbXBsYXRlIFRSZWplY3QgVGhlIHR5cGUgdXNlZCB0byByZWplY3QgdGhlIHByb21pc2UuIERlZmF1bHRzIHRvIGFueS5cbiAqIEBsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNDYzNzQzNlxuICovXG5leHBvcnQgY2xhc3MgRGVmZXJyZWQ8VFJlc29sdmUsIFRSZWplY3QgPSBhbnk+IHtcbiAgcHJpdmF0ZSBfcHJvbWlzZTogUHJvbWlzZTxUUmVzb2x2ZT47XG4gIHByaXZhdGUgX3Jlc29sdmU6IChyZXNwb25zZTogVFJlc29sdmUgfCBQcm9taXNlTGlrZTxUUmVzb2x2ZT4pID0+IHZvaWQ7XG4gIHByaXZhdGUgX3JlamVjdDogKHJlYXNvbj86IFRSZWplY3QpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRGVmZXJyZWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2U8VFJlc29sdmU+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIFByb21pc2UuXG4gICAqXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7UHJvbWlzZTxUUmVzb2x2ZT59XG4gICAqL1xuICBnZXQgcHJvbWlzZSgpOiBQcm9taXNlPFRSZXNvbHZlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHdyYXBwZWQgUHJvbWlzZS5cbiAgICpcbiAgICogQHBhcmFtIHsoVFJlc29sdmUgfCBQcm9taXNlTGlrZTxUUmVzb2x2ZT4pfSByZXNwb25zZSBUaGUgYXJndW1lbnQgdG8gYmUgcmVzb2x2ZWQgYnkgdGhlIFByb21pc2UuXG4gICAqIEByZXR1cm5zIHsqfSAge3ZvaWR9XG4gICAqL1xuICByZXNvbHZlKHJlc3BvbnNlOiBUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcmVzb2x2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Jlc29sdmUocmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSB7VFJlamVjdH0gW3JlYXNvbl0gVGhlIHJlYXNvbiB3aHkgdGhlIFByb21pc2UgcmVqZWN0ZWQuXG4gICAqIEByZXR1cm5zIHsqfSAge3ZvaWR9XG4gICAqL1xuICByZWplY3QocmVhc29uPzogVFJlamVjdCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcmVqZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVqZWN0KHJlYXNvbik7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFVucmVnaXN0ZXJUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSAzMDAwMDtcbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGNvbnZlcnRzIGZyb20gYSBzb3VyY2UgZW51bSB2YWx1ZSB0byBkZXN0aW5hdGlvbiBlbnVtXG4gKiB2YWx1ZSBnaXZlbiBhIG1hcHBpbmcgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24gd2hlbiBjb25zdHJ1Y3RlZC5cbiAqXG4gKiBOb3RlOiBUaGlzIGV4YWN0IHNhbWUgY2xhc3MgaXMgZGVmaW5lZCBpbiBhcGktY29yZS4gIEdpdmVuIGl0cyBzbWFsbFxuICogbmF0dXJlLCBpdCBpcyBub3Qgd29ydGggaGF2aW5nIGluIGEgc2VwYXJhdGUgcHJvamVjdCB0byBzaGFyZSB0aGlzIGJldHdlZW5cbiAqIGFwaS1jb3JlIGFuZCBhcGktc2hhcmVkLiAgSWYgbW9yZSB1dGlsaXR5IGZ1bmN0aW9uYWxpdHkgaXMgYWRkZWQgdGhhdCBpcyB1c2VkIGJ5IGFwaS1jb3JlXG4gKiBhbmQgYXBpLXNoYXJlZCBidXQgaGFzIG5vIG90aGVyIGRlcGVuZGVjaWVzLCBhIHV0aWx0aXR5IHByb2plY3QgbWlnaHQgYmUgbWVyaXRlZCxcbiAqIGFuZCB0aGlzIGNsYXNzIGNvdWxkIGJlIG1vdmVkLlxuICovXG5leHBvcnQgY2xhc3MgRW51bUNvbnZlcnRlcjxUU291cmNlVHlwZSBleHRlbmRzIHN0cmluZywgVERlc3RpbmF0aW9uVHlwZT4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfbWFwcGluZ3M6IHsgW2VudW1WYWw6IHN0cmluZ106IFREZXN0aW5hdGlvblR5cGUgfSxcbiAgICBwcml2YXRlIF9kZWZhdWx0VmFsPzogVERlc3RpbmF0aW9uVHlwZSxcbiAgKSB7fVxuXG4gIHB1YmxpYyBjb252ZXJ0KGVudW1WYWw6IFRTb3VyY2VUeXBlLCB0aHJvd0lmTWlzc2luZzogU2hvdWxkVGhyb3cgPSBTaG91bGRUaHJvdy5ZZXMpOiBURGVzdGluYXRpb25UeXBlIHtcbiAgICBpZiAodGhpcy5fbWFwcGluZ3MuaGFzT3duUHJvcGVydHkoZW51bVZhbCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXBwaW5nc1tlbnVtVmFsIGFzIHN0cmluZ107XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RlZmF1bHRWYWwgIT09IHVuZGVmaW5lZCAmJiB0aHJvd0lmTWlzc2luZyAhPT0gU2hvdWxkVGhyb3cuWWVzKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbDtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYEVudW0gTWFwcGluZyBub3QgZm91bmQgZm9yOiAke2VudW1WYWx9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGVudW0gU2hvdWxkVGhyb3cge1xuICBZZXMgPSAneWVzJyxcbiAgTm8gPSAnbm8nLFxufVxuIiwiaW1wb3J0IHtcbiAgRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlLFxuICBFeHBvcnREYXRhT3B0aW9ucyxcbiAgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIFByaW50T3JpZW50YXRpb24sXG4gIFByaW50UGFnZVNpemUsXG4gIFByaW50U2NhbGluZyxcbiAgUmFuZ2VGaWx0ZXJPcHRpb25zLFxuICBTaGFyZWRFcnJvckNvZGVzLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4uL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuL1BhcmFtJztcblxuaW50ZXJmYWNlIEVudW1MaWtlIHtcbiAgdG9TdHJpbmcoKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb25zdHJ1Y3QgY29tbW9uIGVycm9ycyB0aHJvdWdob3V0IHRoZSBleHRlcm5hbFxuICogcHJvamVjdHMgKGFwaS1zaGFyZWQsIGV4dGVuc2lvbnMtYXBpLCBldGMuKS4gIEl0IGhhcyBzb21lIGR1cGxpY2F0aW9uIHdpdGhcbiAqIHRoZSBFcnJvckhlbHBlcnMgY2xhc3MgaW4gYXBpLWNvcmUsIGJ1dCBpcyBzZXBhcmF0ZSBkdWUgdG8gdGhlIG5lZWQgdG8gdGhyb3dcbiAqIGFuIGV4dGVybmFsIFRhYmxlYXVFcnJvciB2cy4gYW4gSW50ZXJuYWxUYWJsZWF1RXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBFcnJvckhlbHBlcnMge1xuICAvKipcbiAgICogVGhyb3dzIHdpdGggY29kZSBJbnRlcm5hbEVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gYXBpTmFtZSBuYW1lIG9mIGFwaSB0aGF0IHdhcyBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFwaU5vdEltcGxlbWVudGVkKGFwaU5hbWU6IHN0cmluZyk6IFRhYmxlYXVFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJHthcGlOYW1lfSBBUEkgbm90IHlldCBpbXBsZW1lbnRlZC5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gaW50ZXJuYWwgZXJyb3IgaWYgYXJndW1lbnQgaXMgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUludGVybmFsVmFsdWUoYXJndW1lbnRWYWx1ZTogYW55LCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVBhcmFtZXRlcihhcmd1bWVudFZhbHVlOiBhbnksIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgbm90IHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICogRm9yIG9iamVjdHMsIGl0IGp1c3QgdGVzdHMgdGhhdCBpdCBpcyBhbiBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBleHBlY3RlZFR5cGUgZXhwZWN0ZWQgcmVzdWx0IG9mIHR5cGVvZlxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVBhcmFtZXRlclR5cGUoYXJndW1lbnRWYWx1ZTogYW55LCBleHBlY3RlZFR5cGU6IHN0cmluZywgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50VmFsdWUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2FyZ3VtZW50VmFsdWV9IGhhcyBpbnZhbGlkIHR5cGUgZm9yIHBhcmFtZXRlcjogJHthcmd1bWVudE5hbWV9LmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiBhcmd1bWVudCBpcyBlbXB0eSBzdHJpbmcsIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGFyZ3VtZW50TmFtZSBuYW1lIG9mIGFyZ3VtZW50IHRvIHZlcmlmeVxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlTdHJpbmdQYXJhbWV0ZXIoYXJndW1lbnRWYWx1ZTogc3RyaW5nLCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBhcmd1bWVudFZhbHVlID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yIHBhcmFtdGVyOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgcGFzc2VkIHZhbHVlIGlzIGEgdmFsaWQgdmFsdWUgZm9yIHRoYXQgZW51bS5cbiAgICpcbiAgICogU3RyaW5nIGVudW1zIGFyZSB7c3RyaW5nIDogc3RyaW5nfSBkaWN0aW9uYXJpZXMgd2hpY2ggYXJlIG5vdCByZXZlcnNlIG1hcHBhYmxlXG4gICAqIFRoaXMgaXMgYW4gdWdseSB3b3JrYXJvdW5kXG4gICAqXG4gICAqIEBwYXJhbSBlbnVtVmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBlbnVtVHlwZSBlbnVtIHRvIHZlcmlmeSBhZ2FpbnN0XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVmFsaWRFbnVtVmFsdWU8RW51bVR5cGUgZXh0ZW5kcyBFbnVtTGlrZT4oZW51bVZhbHVlOiBFbnVtVHlwZSwgZW51bVR5cGU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGxldCBpc1ZhbGlkID0gZmFsc2U7XG4gICAgT2JqZWN0LmtleXMoZW51bVR5cGUpLmZvckVhY2goKGVudW1LZXkpID0+IHtcbiAgICAgIGlmIChlbnVtVHlwZVtlbnVtS2V5XSA9PT0gZW51bVZhbHVlLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXNWYWxpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBwYXNzZWQgdmFsdWUgaXMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtLlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgZW51bSB2YWx1ZSBpcyBub3QgdmFsaWQuXG4gICAqXG4gICAqIFN0cmluZyBlbnVtcyBhcmUge3N0cmluZyA6IHN0cmluZ30gZGljdGlvbmFyaWVzIHdoaWNoIGFyZSBub3QgcmV2ZXJzZSBtYXBwYWJsZVxuICAgKiBUaGlzIGlzIGFuIHVnbHkgd29ya2Fyb3VuZFxuICAgKlxuICAgKiBAcGFyYW0gZW51bVZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gZW51bVR5cGUgZW51bSB0byB2ZXJpZnkgYWdhaW5zdFxuICAgKiBAcGFyYW0gZW51bU5hbWUgZW51bSBuYW1lIGZvciBjbGVhciBlcnJvciBtZXNzYWdlXG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUVudW1WYWx1ZTxFbnVtVHlwZSBleHRlbmRzIEVudW1MaWtlPihlbnVtVmFsdWU6IEVudW1UeXBlLCBlbnVtVHlwZTogYW55LCBlbnVtTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCFFcnJvckhlbHBlcnMuaXNWYWxpZEVudW1WYWx1ZShlbnVtVmFsdWUsIGVudW1UeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2VudW1WYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgZW51bTogJHtlbnVtTmFtZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHBhc3NlZCB2YWx1ZSBpcyBiZXR3ZWVuIFttaW4sIG1heCkgLi4uIG1pbiA8PSB2YWx1ZSA8IG1heFxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHZhbGlkLlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBtaW4gICB2YWx1ZSBtdXN0IGJlID49IG1pblxuICAgKiBAcGFyYW0gbWF4ICAgdmFsdWUgbXVzdCBiZSA8IG1heFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgICBsZXQgaXNWYWxpZCA9IG1pbiA8PSB2YWx1ZSAmJiB2YWx1ZSA8IG1heDtcblxuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke3ZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvciByYW5nZTogWyR7bWlufS4uJHttYXh9KWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgcGFyYW1zIG1pbiBhbmQgbWF4IGZvciBhcHBseWluZyByYW5nZSBmaWx0ZXIuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiByYW5nZSBpcyBpbnZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0gbWluIHJhbmdlIG1pblxuICAgKiBAcGFyYW0gbWF4IHJhbmdlIG1heFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZVBhcmFtVHlwZShtaW46IFJhbmdlRmlsdGVyT3B0aW9uc1snbWluJ10sIG1heDogUmFuZ2VGaWx0ZXJPcHRpb25zWydtYXgnXSk6IHZvaWQge1xuICAgIGNvbnN0IGlzTWluRGVmaW5lZCA9IG1pbiAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlzTWF4RGVmaW5lZCA9IG1heCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFpc01pbkRlZmluZWQgJiYgIWlzTWF4RGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIGF0IGxlYXN0IG9uZSBvZiBtaW4gb3IgbWF4IGlzIHJlcXVpcmVkLicpO1xuICAgIH1cblxuICAgIGlmIChpc01pbkRlZmluZWQgJiYgIVBhcmFtLmlzVHlwZU51bWJlcihtaW4pICYmICFQYXJhbS5pc1R5cGVEYXRlKG1pbikpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgb25seSBEYXRlIGFuZCBudW1iZXIgYXJlIGFsbG93ZWQgZm9yIHBhcmFtZXRlciBtaW4uJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzTWF4RGVmaW5lZCAmJiAhUGFyYW0uaXNUeXBlTnVtYmVyKG1heCkgJiYgIVBhcmFtLmlzVHlwZURhdGUobWF4KSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAnVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBvbmx5IERhdGUgYW5kIG51bWJlciBhcmUgYWxsb3dlZCBmb3IgcGFyYW1ldGVyIG1heC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNaW5EZWZpbmVkICYmIGlzTWF4RGVmaW5lZCAmJiB0eXBlb2YgbWluICE9PSB0eXBlb2YgbWF4KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIHBhcmFtZXRlcnMgbWluIGFuZCBtYXggc2hvdWxkIGJlIG9mIHRoZSBzYW1lIHR5cGUuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHpvbmVJZCBpcyBwcmVzZW50IGluIHRoZSBjdXJyZW50IGRhc2hib2FyZC5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIGVpdGhlciBjb25kaXRpb24gaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBkYXNoYm9hcmRab25lTWFwIEEgbWFwIG9mIHpvbmVJZCdzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBwYXJhbSB6b25lSUQgWm9uZUlkIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlab25lSXNWYWxpZChkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPiwgem9uZUlEOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZGFzaGJvYXJkWm9uZU1hcC5oYXMoem9uZUlEKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICBgVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBEYXNoYm9hcmQgT2JqZWN0IElkOiAke3pvbmVJRH0gaXMgbm90IHByZXNlbnQgaW4gZGFzaGJvYXJkLmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSB6b25lIGlzIHByZXNlbnQgYW5kIGZsb2F0aW5nIGluIHRoZSBjdXJyZW50IGRhc2hib2FyZC5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIGVpdGhlciBjb25kaXRpb24gaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBkYXNoYm9hcmRab25lTWFwIEEgbWFwIG9mIHpvbmVJZCdzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBwYXJhbSB6b25lSUQgWm9uZUlkIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlab25lSXNWYWxpZEFuZEZsb2F0aW5nKGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+LCB6b25lSUQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChkYXNoYm9hcmRab25lTWFwLmhhcyh6b25lSUQpICYmIGRhc2hib2FyZFpvbmVNYXAuZ2V0KHpvbmVJRCkhLmlzRmxvYXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgYFVuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgRGFzaGJvYXJkIE9iamVjdCBJZDogJHt6b25lSUR9IGlzIG5vdCBwcmVzZW50IG9yIGlzIGEgZml4ZWQgem9uZSBpbiB0aGUgZGFzaGJvYXJkLmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHdpZHRoIGFuZCBoZWlnaHQgYXJlID4gMCBmb3IgZWFjaCBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgb2JqZWN0LlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgZWl0aGVyIGNvbmRpdGlvbiBpcyBmYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgb2JqZWN0IGZvciB3aGljaCB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwgYmUgdmFsaWRhdGVkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVdpZHRoQW5kSGVpZ2h0T2ZEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlOiBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUsXG4gICk6IHZvaWQge1xuICAgIGlmIChkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUud2lkdGggPCAwIHx8IGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZS5oZWlnaHQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgIGBVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUgZm9yIGRhc2hib2FyZCBvYmplY3QgSUQgJHtkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUuZGFzaGJvYXJkT2JqZWN0SUR9OmAgK1xuICAgICAgICAgIGAgbmVnYXRpdmUgd2lkdGhzIGFuZCBoZWlnaHRzIGFyZSBub3QgYWxsb3dlZC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgaXMgdGhlIGdpdmVuIHNoZWV0IG5hbWUgaXMgaW4gdGhlIGxpc3Qgb2Ygc2hlZXRzIG5hbWVzIGFsbG93ZWQgZm9yIGV4cG9ydGluZy5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHRoZSBjb25kaXRpb24gYWJvdmUgaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBleHBvcnRhYmxlU2hlZXROYW1lcyBBIGxpc3Qgb2Ygc2hlZXQgbmFtZXMgYWxsb3dlZCBmb3IgZXhwb3J0aW5nXG4gICAqIEBwYXJhbSBzaGVldE5hbWUgdGhlIG5hbWUgb2YgdGhlIHNoZWV0IHNlbGVjdGVkIGZvciBleHBvcnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5U2hlZXROYW1lKGV4cG9ydGFibGVTaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LCBzaGVldE5hbWU6IHN0cmluZykge1xuICAgIGlmICghZXhwb3J0YWJsZVNoZWV0TmFtZXMuaW5jbHVkZXMoc2hlZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uU2hlZXQsXG4gICAgICAgICdzaGVldE5hbWUgcGFyYW1ldGVyIG11c3QgYmVsb25nIHRvIGEgd29ya3NoZWV0IHdpdGhpbiB0aGUgY3VycmVudCB2aWV3JyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBFeHBvcnREYXRhT3B0aW9ucyBvYmplY3RcbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IG9mIEV4cG9ydERhdGFPcHRpb25zIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBFeHBvcnREYXRhT3B0aW9ucyBvYmplY3QgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBDU1YgZmlsZSBmb3IgZXhwb3J0RGF0YUFzeW5jLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlFeHBvcnREYXRhT3B0aW9ucyhvcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICghUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQob3B0aW9ucy5pZ25vcmVBbGlhc2VzKSAmJiAhUGFyYW0uaXNUeXBlQm9vbChvcHRpb25zLmlnbm9yZUFsaWFzZXMpKSB8fFxuICAgICAgKCFQYXJhbS5pc051bGxPclVuZGVmaW5lZChvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkKSAmJiAhQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkKSlcbiAgICApXG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ29wdGlvbnMgcGFyYW1hdGVyIG11c3QgYmUgb2YgdHlwZSBFeHBvcnREYXRhT3B0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGlmIHRoZSBzaGVldCBuYW1lcyBhcmUgaW5jbHVkZWQgaW4gYW55IG9mIHRoZSBleHBvcnQgc2NlbmFyaW9zLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgYW4gYXJyYXkuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFNlbGVjdGlvblNoZWV0IGlmIHRoZXJlIGFyZSBhcnJheSBlbnRyaWVzIHRoYXQgZG9udCBleGlzdCBvciBpZiB0aGVyZSBpcyBtaXhpbmcgYmV0d2VlbiBzaGVldHMgZnJvbSB0aGUgZGFzaGJvYXJkIGFuZCBzaGVldCBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICpcbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgTGlzdCBvZiBzaGVldCBuYW1lcyBzZWxlY3RlZCBmb3IgZXhwb3J0aW5nLlxuICAgKiBAcGFyYW0gZXhwb3J0U2NlbmFyaW9zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHNoZWV0IG5hbWUsIGV4cG9ydGFibGUgc2hlZXRzIGZyb20gdGhlIGRhc2hib2FyZCwgYW5kIGV4cG9ydGFibGUgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlTaGVldE5hbWVzRm9yUERGQW5kUFBUKHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sIGV4cG9ydFNjZW5hcmlvczogRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCk6IHZvaWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzaGVldE5hbWVzKSkgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdzaGVldE5hbWVzIHBhcmFtZXRlciBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgaWYgKHNoZWV0TmFtZXMubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3NoZWV0TmFtZXMgc2hvdWxkIG5vdCBiZSBlbXB0eScpO1xuXG4gICAgY29uc3QgaXNJbmNsdWRlZEluRGFzaGJvYXJkID0gc2hlZXROYW1lcy5ldmVyeSgoc2hlZXROYW1lOiBzdHJpbmcpID0+XG4gICAgICBleHBvcnRTY2VuYXJpb3MuZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tRGFzaGJvYXJkLmluY2x1ZGVzKHNoZWV0TmFtZSksXG4gICAgKTtcbiAgICBpZiAoaXNJbmNsdWRlZEluRGFzaGJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzSW5jbHVkZWRJbldvcmtib29rID0gc2hlZXROYW1lcy5ldmVyeSgoc2hlZXROYW1lOiBzdHJpbmcpID0+XG4gICAgICBleHBvcnRTY2VuYXJpb3MuZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tV29ya2Jvb2suaW5jbHVkZXMoc2hlZXROYW1lKSxcbiAgICApO1xuICAgIGlmIChpc0luY2x1ZGVkSW5Xb3JrYm9vaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc0N1cnJlbnRTaGVldCA9IHNoZWV0TmFtZXMubGVuZ3RoID09PSAxICYmIHNoZWV0TmFtZXNbMF0gPT09IGV4cG9ydFNjZW5hcmlvcy5jdXJyZW50U2hlZXROYW1lO1xuICAgIGlmIChpc0N1cnJlbnRTaGVldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEV4cG9ydCByZXF1aXJlbWVudDogYWxsIHNoZWV0IG5hbWVzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3Qgb2YgZXhwb3J0YWJsZSBzaGVldHMgaW4gdGhlIGRhc2hib2FyZCBvclxuICAgIC8vIGFsbCBzaGVldCBuYW1lcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIGV4cG9ydGFibGUgc2hlZXRzIGluIHRoZSB3b3JrYm9vaywgb3IgdGhlIHNoZWV0IG5hbWUgaXMgdGhlIGN1cnJlbnQgc2hlZXRcbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uU2hlZXQsXG4gICAgICAnc2hlZXROYW1lcyBwYXJhbWV0ZXIgbXVzdCBoYXZlIGFsbCBpdHMgZW50cmllcyBiZSBleHBvcnRhYmxlIHNoZWV0IG5hbWVzIGZyb20gdGhlIGRhc2hib2FyZCBvciBhbGwgaXRzIGVudHJpZXMgYmUgZXhwb3J0YWJsZSBzaGVldCBuYW1lcyBmcm9tIHRoZSB3b3JrYm9vaycsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBvYmplY3QncyBwcm9wZXJ0aWVzLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgb2YgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgZXh0ZXJuYWwgdXNlci1mYWNpbmcgRXhwb3J0UERGT3B0aW9ucyBvYmplY3QgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBQREYgZmlsZSBmb3IgZXhwb3J0UERGQXN5bmMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUV4cG9ydFBERk9wdGlvbnMob3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmVyaWZ5RW51bVZhbHVlPFByaW50T3JpZW50YXRpb24+KG9wdGlvbnMub3JpZW50YXRpb24sIFByaW50T3JpZW50YXRpb24sICdQcmludE9yaWVudGF0aW9uJyk7XG4gICAgICB0aGlzLnZlcmlmeUVudW1WYWx1ZTxQcmludFBhZ2VTaXplPihvcHRpb25zLnBhZ2VTaXplLCBQcmludFBhZ2VTaXplLCAnUHJpbnRQYWdlU2l6ZScpO1xuICAgICAgdGhpcy52ZXJpZnlFbnVtVmFsdWU8UHJpbnRTY2FsaW5nPihvcHRpb25zLnNjYWxpbmcsIFByaW50U2NhbGluZywgJ1ByaW50U2NhbGluZycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdvcHRpb25zIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgRXhwb3J0UERGT3B0aW9ucycpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgRXhwb3J0TGF5b3V0T3B0aW9ucyxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIEZpdFBhZ2VzLFxuICBQYWdlT3JpZW50YXRpb24sXG4gIFBhZ2VTY2FsaW5nT3B0aW9uLFxuICBQYWdlU2l6ZU9wdGlvbixcbiAgU2NhbGVNb2RlLFxuICBTY2FsaW5nU2VsZWN0aW9uLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRXhwb3J0RGF0YU9wdGlvbnMsXG4gIEV4cG9ydFBERk9wdGlvbnMgYXMgRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIEhlbHBlciBtZXRob2RzIGZvciBFeHBvcnQgQVBJcy5cbiAqXG4gKiBAY2xhc3MgRXhwb3J0SGVscGVyc1xuICovXG5leHBvcnQgY2xhc3MgRXhwb3J0SGVscGVycyB7XG4gIHB1YmxpYyBzdGF0aWMgRGVmYXVsdERhdGFPcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyA9IHtcbiAgICBpZ25vcmVBbGlhc2VzOiBmYWxzZSxcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogW10sXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBEZWZhdWx0UERGT3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zID0ge1xuICAgIHNjYWxpbmc6IFByaW50U2NhbGluZy5BdXRvbWF0aWMsXG4gICAgcGFnZVNpemU6IFByaW50UGFnZVNpemUuTGV0dGVyLFxuICAgIG9yaWVudGF0aW9uOiBQcmludE9yaWVudGF0aW9uLlBvcnRyYWl0LFxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIERlZmF1bHRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zID0ge1xuICAgIGltYWdlSGVpZ2h0OiAwLFxuICAgIGltYWdlV2lkdGg6IDAsXG4gICAgcGFnZUZpdEhvcml6b250YWw6IDEsXG4gICAgcGFnZUZpdFZlcnRpY2FsOiAxLFxuICAgIHBhZ2VPcmllbnRhdGlvbk9wdGlvbjogUGFnZU9yaWVudGF0aW9uLlBvcnRyYWl0LFxuICAgIHBhZ2VTY2FsZU1vZGU6IFNjYWxlTW9kZS5TY2FsZUF1dG8sXG4gICAgcGFnZVNjYWxlUGVyY2VudDogMTAwLFxuICAgIHBhZ2VTaXplT3B0aW9uOiBQYWdlU2l6ZU9wdGlvbi5MZXR0ZXIsXG4gIH07XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIHRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zJyBwcm9wZXJ0aWVzIGJhc2VkIG9uIHRoZSBnaXZlbiBQREYgZXhwb3J0IGNvbmZpZ3VyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgY29uc3RydWN0IHRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIGlkZW50aWNhbGx5IHRvIGhvdyB0aGUgJ0V4cG9ydCBQREYnIGRpYWxvZyBjb25zdHJ1Y3RzIHRoZSBFeHBvcnRQZGZPcHRpb25zUHJlc01vZGVsLlxuICAgKiBTZWUgdGhlIGhhbmRsZUV4cG9ydENsaWNrIG1ldGhvZCBpbiBAYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wZGYtb3B0aW9ucy1kaWFsb2cgZm9yIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyBUaGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsIHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRwdXQgUERGIGZpbGUuXG4gICAqIEBwYXJhbSBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMgVGhlIGV4dGVybmFsIEV4cG9ydFBERk9wdGlvbnMgdXNlci1mYWNpbmcgb2JqZWN0IHBhc3NlZCB0byBleHBvcnRQREZBc3luYy5cbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgVGhlIGxpc3Qgb2Ygc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucyhcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICApOiB2b2lkIHtcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMuY3VycmVudFNoZWV0ID0gc2hlZXROYW1lc1swXTtcbiAgICB0aGlzLnVwZGF0ZUV4cG9ydExheW91dE9wdGlvbnMoaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zLCBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMpO1xuICAgIHRoaXMudXBkYXRlU2hlZXRPcHRpb25zKGludGVybmFsRXhwb3J0UGRmT3B0aW9ucywgc2hlZXROYW1lcyk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCBmb3IgdXBkYXRlSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zLlxuICAgKiBNb2RpZmllcyB0aGUgZXhwb3J0TGF5b3V0T3B0aW9ucyBwcm9wZXJ0eSBvZiB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBiYXNlZCBvbiB0aGUgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucy5cbiAgICogU2VlIHRoZSBnZXRFeHBvcnRMYXlvdXRPcHRpb25zIG1ldGhvZCBpbiBAYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wZGYtb3B0aW9ucy1kaWFsb2cgZm9yIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyBUaGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsIHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRwdXQgUERGIGZpbGUuXG4gICAqIEBwYXJhbSBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMgVGhlIGV4dGVybmFsIEV4cG9ydFBERk9wdGlvbnMgdXNlci1mYWNpbmcgb2JqZWN0IHBhc3NlZCB0byBleHBvcnRQREZBc3luYy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlRXhwb3J0TGF5b3V0T3B0aW9ucyhcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXhwb3J0TGF5b3V0T3B0aW9ucyA9IGludGVybmFsRXhwb3J0UGRmT3B0aW9ucy5leHBvcnRMYXlvdXRPcHRpb25zO1xuXG4gICAgLy8gc2V0dGluZyB0aGUgaW1hZ2UgaGVpZ2h0IGFuZCB3aWR0aCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzXG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5pbWFnZUhlaWdodCA9IHRoaXMuRGVmYXVsdExheW91dE9wdGlvbnMuaW1hZ2VIZWlnaHQ7XG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5pbWFnZVdpZHRoID0gdGhpcy5EZWZhdWx0TGF5b3V0T3B0aW9ucy5pbWFnZVdpZHRoO1xuXG4gICAgLy8gIHNldHRpbmcgdGhlIG9yaWVudGF0aW9uIHZhbHVlIGZvciB0aGUgZXhwb3J0TGF5b3V0T3B0aW9uc1xuICAgIHN3aXRjaCAoZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zLm9yaWVudGF0aW9uKSB7XG4gICAgICBjYXNlIFByaW50T3JpZW50YXRpb24uTGFuZHNjYXBlOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VPcmllbnRhdGlvbk9wdGlvbiA9IFBhZ2VPcmllbnRhdGlvbi5MYW5kc2NhcGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludE9yaWVudGF0aW9uLlBvcnRyYWl0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VPcmllbnRhdGlvbk9wdGlvbiA9IFBhZ2VPcmllbnRhdGlvbi5Qb3J0cmFpdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgb3JpZW50YXRpb24gZm9yIEV4cG9ydFBERk9wdGlvbicpO1xuICAgIH1cblxuICAgIC8vIHNldHRpbmcgdGhlIHBhZ2Ugc2l6ZSB2YWx1ZSBmb3IgdGhlIGV4cG9ydExheW91dE9wdGlvbnNcbiAgICBzd2l0Y2ggKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucy5wYWdlU2l6ZSkge1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkEzOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkE0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkE1OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkI0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQjQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkI1OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQjU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkV4ZWN1dGl2ZTpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkV4ZWN1dGl2ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuRm9saW86XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5Gb2xpbztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuTGVkZ2VyOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uTGVkZ2VyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5MZWdhbDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkxlZ2FsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5MZXR0ZXI6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5MZXR0ZXI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLk5vdGU6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5Ob3RlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5RdWFydG86XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5RdWFydG87XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLlN0YXRlbWVudDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLlN0YXRlbWVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuVGFibG9pZDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLlRhYmxvaWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLlVuc3BlY2lmaWVkOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uVW5zcGVjaWZpZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIHBhZ2VTaXplIGZvciBFeHBvcnRQREZPcHRpb24nKTtcbiAgICB9XG5cbiAgICAvLyBzZXR0aW5nIHRoZSBzY2FsaW5nIHZhbHVlcyBmb3IgdGhlIGV4cG9ydExheW91dE9wdGlvbnNcbiAgICBzd2l0Y2ggKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucy5zY2FsaW5nKSB7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5BdE1vc3QxUGFnZUhpZ2g6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgRml0UGFnZXMuRml0T25lSGlnaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuQXRNb3N0MVBhZ2VXaWRlOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIEZpdFBhZ2VzLkZpdE9uZVdpZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLkF0TW9zdDJQYWdlc0hpZ2g6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgRml0UGFnZXMuRml0VHdvSGlnaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuQXRNb3N0MlBhZ2VzV2lkZTpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBGaXRQYWdlcy5GaXRUd29XaWRlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5BdXRvbWF0aWM6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3RBdXRvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMTAwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0MTAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMjAwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0MjAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMjU6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3QyNSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzQwMDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDQwMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzUwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0NTApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM2MDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDYwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjNzU6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3Q3NSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzgwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0ODApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM5MDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDkwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgc2NhbGluZyBmb3IgRXhwb3J0UERGT3B0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgZm9yIHVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucy5cbiAgICogTW9kaWZpZXMgdGhlIHNoZWV0T3B0aW9ucyBwcm9wZXJ0eSBvZiB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBiYXNlZCBvbiB0aGUgc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqIFNlZSB0aGUgaGFuZGxlRXhwb3J0Q2xpY2sgbWV0aG9kIGluIEBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBkZi1vcHRpb25zLWRpYWxvZyBmb3IgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zIFRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIHByZXMgbW9kZWwgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBQREYgZmlsZS5cbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgVGhlIGxpc3Qgb2Ygc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVwZGF0ZVNoZWV0T3B0aW9ucyhpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucywgc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xuICAgIGNvbnN0IHsgZXhwb3J0TGF5b3V0T3B0aW9ucywgc2hlZXRPcHRpb25zIH0gPSBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM7XG4gICAgLy8gdXBkYXRpbmcgdGhlIGV4cG9ydCBsYXlvdXRzIG9wdGlvbnMgZm9yIGVhY2ggc2hlZXQgYW5kIHNlbGVjdGluZyBzaGVldCBmb3IgZXhwb3J0IGlmIGluY2x1ZGVkIGluIGxpc3RcbiAgICBmb3IgKGNvbnN0IHNoZWV0T3B0aW9uIG9mIHNoZWV0T3B0aW9ucykge1xuICAgICAgc2hlZXRPcHRpb24uZXhwb3J0TGF5b3V0T3B0aW9ucyA9IGV4cG9ydExheW91dE9wdGlvbnM7XG4gICAgICBzaGVldE9wdGlvbi5pc1NlbGVjdGVkID0gc2hlZXROYW1lcy5pbmNsdWRlcyhzaGVldE9wdGlvbi5zaGVldCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgZm9yIHVwZGF0ZUV4cG9ydExheW91dE9wdG9ucy5cbiAgICogVGhpcyBtZXRob2QgaXMgYSBzcG9vZiBvZiB0aGUgZ2V0Rml0QW5kU2NhbGVWYWx1ZXMgbWV0aG9kIHVzZWQgaW4gQGJyb3dzZXItY2xpZW50cy9leHBvcnQtcGRmLW9wdGlvbnMgdG8gc2V0IHRoZSBleHBvcnRMYXlvdXRPcHRpb25zJyBzY2FsaW5nIHByb3BlcnRpZXMuXG4gICAqIEluIHRoZSBmdXR1cmUsIHRoaXMgZmlsZSBzaG91bGQgYmUgcmVmYWN0b3JlZCB0byBpbXBvcnQgdGhlIG1ldGhvZCBkaXJlY3RseSBmcm9tIEBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBkZi1vcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gc2NhbGluZ1NlbGVjdGlvbiBzdHJpbmcgdXNlZCBmb3Igc2V0dGluZyB0aGUgZXhwb3J0TGF5b3V0T3B0aW9ucyBiYXNlZCBvbiB0aGUgUHJpbnRTY2FsaW5nIHByb3BlcnR5IGZyb20gdGhlIEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucy5cbiAgICogQHBhcmFtIGV4cG9ydExheW91dE9wdGlvbnMgdGhlIEV4cG9ydExheW91dE9wdGlvbnMgdXNlZCBieSB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zLCBzY2FsaW5nU2VsZWN0aW9uOiBTY2FsaW5nU2VsZWN0aW9uKTogdm9pZCB7XG4gICAgbGV0IHsgcGFnZUZpdEhvcml6b250YWwsIHBhZ2VGaXRWZXJ0aWNhbCwgcGFnZVNjYWxlTW9kZSwgcGFnZVNjYWxlUGVyY2VudCB9ID0gdGhpcy5EZWZhdWx0TGF5b3V0T3B0aW9ucztcblxuICAgIGNvbnN0IGZpdE1hdGNoID0gdGhpcy5maXRSZWdleC5leGVjKHNjYWxpbmdTZWxlY3Rpb24pO1xuICAgIGNvbnN0IHBlcmNlbnRNYXRjaCA9IHRoaXMucGN0UmVnZXguZXhlYyhzY2FsaW5nU2VsZWN0aW9uKTtcblxuICAgIGlmIChmaXRNYXRjaCkge1xuICAgICAgW3BhZ2VGaXRIb3Jpem9udGFsLCBwYWdlRml0VmVydGljYWxdID0gZml0TWF0Y2guc2xpY2UoMSkubWFwKCh2YWx1ZSkgPT4gTnVtYmVyKHZhbHVlKSk7XG4gICAgICBwYWdlU2NhbGVNb2RlID0gU2NhbGVNb2RlLlNjYWxlRml0UGFnZXM7XG4gICAgfSBlbHNlIGlmIChwZXJjZW50TWF0Y2gpIHtcbiAgICAgIFtwYWdlU2NhbGVQZXJjZW50XSA9IHBlcmNlbnRNYXRjaC5zbGljZSgxKS5tYXAoKHZhbHVlKSA9PiBOdW1iZXIodmFsdWUpKTtcbiAgICAgIHBhZ2VTY2FsZU1vZGUgPSBTY2FsZU1vZGUuU2NhbGVQZXJjZW50YWdlO1xuICAgIH1cblxuICAgIC8vIGdldEZpdEFuZFNjYWxlVmFsdWVzIHJldHVybnMgdGhlIHByb3BlcnRpZXMgYmVsb3csIGJ1dCBpbnN0ZWFkIHRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZW0uXG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlRml0SG9yaXpvbnRhbCA9IHBhZ2VGaXRIb3Jpem9udGFsO1xuICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZUZpdFZlcnRpY2FsID0gcGFnZUZpdFZlcnRpY2FsO1xuICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNjYWxlTW9kZSA9IHBhZ2VTY2FsZU1vZGU7XG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2NhbGVQZXJjZW50ID0gcGFnZVNjYWxlUGVyY2VudDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGZpdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnZml0KFswLTldKyl4KFswLTldKyknKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcGN0UmVnZXggPSBuZXcgUmVnRXhwKCdwY3QoWzAtOV0rKScpO1xufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgUGFyYW0ge1xuICAvKipcbiAgICogc2VyaWFsaXplcyB0aGUgZGF0ZSBpbnRvIHRoZSBmb3JtYXQgdGhhdCB0aGUgc2VydmVyIGV4cGVjdHMuXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlIHRvIHNlcmlhbGl6ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgeWVhcjogbnVtYmVyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoOiBudW1iZXIgPSBkYXRlLmdldFVUQ01vbnRoKCkgKyAxO1xuICAgIGNvbnN0IGRheTogbnVtYmVyID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgY29uc3QgaGg6IG51bWJlciA9IGRhdGUuZ2V0VVRDSG91cnMoKTtcbiAgICBjb25zdCBtbTogbnVtYmVyID0gZGF0ZS5nZXRVVENNaW51dGVzKCk7XG4gICAgY29uc3Qgc2VjOiBudW1iZXIgPSBkYXRlLmdldFVUQ1NlY29uZHMoKTtcbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9ICR7aGh9OiR7bW19OiR7c2VjfWA7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZUJvb2xlYW5Gb3JQbGF0Zm9ybShib29sOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYm9vbCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZU51bWJlckZvclBsYXRmb3JtKG51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbnVtLnRvU3RyaW5nKDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgaW5wdXQgaXMgYSBudW1iZXJcbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVOdW1iZXIoaW5wdXQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInIHx8IGlucHV0IGluc3RhbmNlb2YgTnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBpbnB1dCBpcyBhIERhdGVcbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVEYXRlKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBEYXRlO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVHlwZVN0cmluZyhpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmc7XG4gIH1cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgaXNUeXBlQm9vbChpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ2Jvb2xlYW4nIHx8IGlucHV0IGluc3RhbmNlb2YgQm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBpbnB1dCBpcyBudWxsIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzTnVsbE9yVW5kZWZpbmVkKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoUGFyYW0uaXNUeXBlTnVtYmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFBhcmFtLnNlcmlhbGl6ZU51bWJlckZvclBsYXRmb3JtKHZhbHVlIGFzIG51bWJlcik7XG4gICAgfSBlbHNlIGlmIChQYXJhbS5pc1R5cGVEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFBhcmFtLnNlcmlhbGl6ZURhdGVGb3JQbGF0Zm9ybSh2YWx1ZSBhcyBEYXRlKTtcbiAgICB9IGVsc2UgaWYgKFBhcmFtLmlzVHlwZUJvb2wodmFsdWUpKSB7XG4gICAgICByZXR1cm4gUGFyYW0uc2VyaWFsaXplQm9vbGVhbkZvclBsYXRmb3JtKHZhbHVlIGFzIGJvb2xlYW4pO1xuICAgIH0gZWxzZSBpZiAoUGFyYW0uaXNUeXBlU3RyaW5nKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFVuZXhwZWN0ZWQgaW52YWxpZCB2YWx1ZSBmb3I6ICR7dmFsdWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHBhcmFtZXRlciBpcyBhbHJlYWR5IGEgTWFwLCBvciBjb252ZXJ0cyBhbiBvYmplY3QgdG8gYSBNYXAuXG4gICAqIElmIHRoZSBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IGl0IHRvIGEgTWFwIHVzaW5nIE9iamVjdC5lbnRyaWVzLlxuICAgKiBAdGhyb3dzIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCBvciBNYXBcbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0UGFyYW1ldGVyVG9NYXAocGFyYW06IG9iamVjdCwgcGFyYW1OYW1lOiBzdHJpbmcpOiBNYXA8YW55LCBhbnk+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShwYXJhbSwgJ29iamVjdCcsIHBhcmFtTmFtZSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW0pKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYEV4cGVjdGluZyBvYmplY3Qgb3IgTWFwIGZvcjogJHtwYXJhbU5hbWV9LmApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbSBpbnN0YW5jZW9mIE1hcCA/IHBhcmFtIDogbmV3IE1hcChPYmplY3QuZW50cmllcyhwYXJhbSkpO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIHRyeVBhcnNlTnVtYmVyKHZhbHVlOiBhbnkpOiB7IHBhcnNlZD86IG51bWJlcjsgc3VjY2VzczogYm9vbGVhbiB9IHtcbiAgICBpZiAoUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChQYXJhbS5pc1R5cGVOdW1iZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBwYXJzZWQ6IHZhbHVlIGFzIG51bWJlciwgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICBpZiAodmFsdWVTdHJpbmcgPT09ICdOYU4nKSB7XG4gICAgICAvLyAnTmFOJyBwYXJzZXMgYXMgTmFOIHdoaWNoIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBmYWlsZWQgcGFyc2UuXG4gICAgICByZXR1cm4geyBwYXJzZWQ6IE5hTiwgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQodmFsdWVTdHJpbmcpO1xuICAgIGlmIChpc05hTihwYXJzZWQpKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHBhcnNlZCwgc3VjY2VzczogdHJ1ZSB9O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2hlZXRJbmZvLCBTaGVldFR5cGUsIFNpemVDb25zdHJhaW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbmV4cG9ydCBjbGFzcyBTaGVldFV0aWxzIHtcbiAgLy8gVGhpcyBpcyBhIGRpcmVjdCBwb3J0IGZyb20gU2hlZXRTaXplLmNzIC0gU2hlZXRTaXplRmFjdG9yeVxuICBwdWJsaWMgc3RhdGljIGdldFNoZWV0U2l6ZUZyb21TaXplQ29uc3RyYWludHMoc2l6ZUNvbnN0cmFpbnQ6IFNpemVDb25zdHJhaW50KTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBjb25zdCB7IG1pbldpZHRoLCBtaW5IZWlnaHQsIG1heFdpZHRoLCBtYXhIZWlnaHQgfSA9IHNpemVDb25zdHJhaW50O1xuXG4gICAgaWYgKG1pbkhlaWdodCA9PT0gMCAmJiBtaW5XaWR0aCA9PT0gMCkge1xuICAgICAgaWYgKG1heEhlaWdodCA9PT0gMCAmJiBtYXhXaWR0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWMsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdE1vc3QsXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG1heFdpZHRoLCBoZWlnaHQ6IG1heEhlaWdodCB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAobWF4SGVpZ2h0ID09PSAwICYmIG1heFdpZHRoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXRMZWFzdCxcbiAgICAgICAgbWluU2l6ZTogeyB3aWR0aDogbWluV2lkdGgsIGhlaWdodDogbWluSGVpZ2h0IH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChtYXhIZWlnaHQgPT09IG1pbkhlaWdodCAmJiBtYXhXaWR0aCA9PT0gbWluV2lkdGggJiYgbWluV2lkdGggPiAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuRXhhY3RseSxcbiAgICAgICAgbWluU2l6ZTogeyB3aWR0aDogbWluV2lkdGgsIGhlaWdodDogbWluSGVpZ2h0IH0sXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG1pbldpZHRoLCBoZWlnaHQ6IG1pbkhlaWdodCB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAnRml0IFdpZHRoJyBmb3IgYSBEU0QgbGF5b3V0XG4gICAgY29uc3QgaXNEc2RMYXlvdXQgPSBtaW5XaWR0aCA9PT0gMCAmJiBtYXhXaWR0aCA9PT0gMDtcblxuICAgIHJldHVybiB7XG4gICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UsXG4gICAgICBtaW5TaXplOiB7IHdpZHRoOiBtaW5XaWR0aCwgaGVpZ2h0OiBtaW5IZWlnaHQgfSxcbiAgICAgIG1heFNpemU6IHsgd2lkdGg6IGlzRHNkTGF5b3V0ID8gMjE0NzQ4MzY0NyA6IG1heFdpZHRoLCBoZWlnaHQ6IG1heEhlaWdodCB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUF1dG9tYXRpY1NpemUoKTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBsZXQgYmVoYXZpb3IgPSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWM7XG4gICAgbGV0IG1pblNpemUgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbiAgICBsZXQgbWF4U2l6ZSA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFB1Ymxpc2hlZFNoZWV0SW5mb0J5TmFtZShuYW1lOiBzdHJpbmcsIHNoZWV0SW5mb3M6IEFycmF5PFNoZWV0SW5mbz4pOiBTaGVldEluZm8gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNoZWV0SW5mbyA9IHNoZWV0SW5mb3MuZmluZCgoc2hlZXQpID0+IHNoZWV0Lm5hbWUgPT09IG5hbWUpO1xuICAgIHJldHVybiBzaGVldEluZm87XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFNoZWV0VHlwZUVudW0oaW50ZXJuYWxTaGVldFR5cGU6IFNoZWV0VHlwZSk6IENvbnRyYWN0LlNoZWV0VHlwZSB7XG4gICAgbGV0IHNoZWV0VHlwZTogQ29udHJhY3QuU2hlZXRUeXBlO1xuICAgIHN3aXRjaCAoaW50ZXJuYWxTaGVldFR5cGUpIHtcbiAgICAgIGNhc2UgU2hlZXRUeXBlLldvcmtzaGVldDoge1xuICAgICAgICBzaGVldFR5cGUgPSBDb250cmFjdC5TaGVldFR5cGUuV29ya3NoZWV0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgU2hlZXRUeXBlLkRhc2hib2FyZDoge1xuICAgICAgICBzaGVldFR5cGUgPSBDb250cmFjdC5TaGVldFR5cGUuRGFzaGJvYXJkO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgU2hlZXRUeXBlLlN0b3J5OiB7XG4gICAgICAgIHNoZWV0VHlwZSA9IENvbnRyYWN0LlNoZWV0VHlwZS5TdG9yeTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5TZXJ2ZXJFcnJvciwgJ0ludmFsaWQgU2hlZXRUeXBlJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzVmFsaWRTaGVldFNpemUoc2l6ZU9iamVjdDogQ29udHJhY3QuU2l6ZSB8IENvbnRyYWN0LlNoZWV0U2l6ZSk6IHNpemVPYmplY3QgaXMgQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICByZXR1cm4gKDxDb250cmFjdC5TaGVldFNpemU+c2l6ZU9iamVjdCkuYmVoYXZpb3IgIT09IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBEZWZlcnJlZCwgVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9IGZyb20gJy4vRGVmZXJyZWQnO1xuXG4vKipcbiAqIEEgRGVmZXJyZWQgd3JhcHBlciBjbGFzcyBhZGRpbmcgZnVuY3Rpb25hbGl0eSB0byByZWplY3QgdW5yZXNwb25zaXZlIHByb21pc2VzIGFmdGVyIHRpbWVvdXRcbiAqXG4gKiB0aGlzIGNsYXNzIGhhbmRsZXMgdHdvIHRoaW5nczpcblxuICogICAgMS4gQWRkcyB0aW1lb3V0IGxvZ2ljIGZvciBkZWZlcnJlZFxuICogICAgMi4gSXQgYmxvY2tzIG11bHRpcGxlIGNhbGxzIGZyb20gZXhlY3V0aW5nIGF0IHRoZSBzYW1lIHRpbWUuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFNob3J0TGl2ZWREZWZlcnJlZFxuICogQHRlbXBsYXRlIFRSZXNvbHZlIFRoZSB0eXBlIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZS5cbiAqIEB0ZW1wbGF0ZSBUUmVqZWN0IFRoZSB0eXBlIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlLiBEZWZhdWx0cyB0byBhbnkuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgU2hvcnRMaXZlZERlZmVycmVkPFRSZXNvbHZlLCBUUmVqZWN0ID0gYW55PiB7XG4gIHByaXZhdGUgX2RlZmVycmVkOiBEZWZlcnJlZDxUUmVzb2x2ZSwgVFJlamVjdD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3RpbWVvdXRJZDtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfdGltZW91dEluTWlsbGlzZWNvbmRzID0gVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcykge31cblxuICBwdWJsaWMgZ2V0TmV3UHJvbWlzZU9yVGhyb3dJZkJ1c3koKTogUHJvbWlzZTxUUmVzb2x2ZT4ge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkFwaUV4ZWN1dGlvbkVycm9yLCAnVGhpcyBhcGkgY2Fubm90IGJlIGV4ZWN1dGVkIHRpbGwgcHJldmlvdXMgY2FsbCBpcyByZXNvbHZlZC4nKTtcbiAgICB9XG4gICAgdGhpcy5fZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcblxuICAgIHRoaXMuX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLlRpbWVvdXQsXG4gICAgICAgIGBBcGkgZmFpbGVkIHRvIGNvbXBsZXRlIGluICR7dGhpcy5fdGltZW91dEluTWlsbGlzZWNvbmRzIC8gMTAwMH0gc2Vjb25kc2AsXG4gICAgICApO1xuICAgICAgdGhpcy5yZWplY3QoZXJyb3IpO1xuICAgIH0sIHRoaXMuX3RpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG5cbiAgICByZXR1cm4gdGhpcy5fZGVmZXJyZWQucHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKHJlc3BvbnNlOiBUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgIHRoaXMuX2RlZmVycmVkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWplY3QoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xuICAgICAgdGhpcy5fZGVmZXJyZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXJDb250cmFjdCB9IGZyb20gJy4vVmVyc2lvbk51bWJlckNvbnRyYWN0JztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGV4dGVuc2lvbnMsIGVtYmVkZGluZ1xuICogYW5kIGV4dGVuc2lvbnMtYXBpLXR5cGVzIGxpYnJhcnlcbiAqL1xuZXhwb3J0IGNsYXNzIFZlcnNpb25OdW1iZXIgaW1wbGVtZW50cyBWZXJzaW9uTnVtYmVyQ29udHJhY3Qge1xuICBwdWJsaWMgbWFqb3I6IG51bWJlcjtcbiAgcHVibGljIG1pbm9yOiBudW1iZXI7XG4gIHB1YmxpYyBmaXg6IG51bWJlcjtcbiAgcHVibGljIGJ1aWxkOiBudW1iZXI7XG4gIHB1YmxpYyBpc0FscGhhOiBib29sZWFuO1xuXG4gIC8vIHByaXZhdGUgY29uc3RydWN0b3Igc28gZXZlcnlvbmUgdXNlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gIC8vIGJ1aWxkIG51bWJlcnMgaGF2ZSB0aGlzIGZvcm06IE0ubS5mLXByZS5OXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih2ZXJzaW9uU3RyaW5nOiBzdHJpbmcsIGlzQWxwaGE6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBwYXJ0U3RyID0gdmVyc2lvblN0cmluZy5zcGxpdCgnLScpO1xuICAgIHRoaXMuYnVpbGQgPSB0aGlzLmdldEJ1aWxkTnVtYmVyKHBhcnRTdHJbMV0pO1xuICAgIHZlcnNpb25TdHJpbmcgPSBwYXJ0U3RyWzBdO1xuXG4gICAgY29uc3QgcGFydHMgPSB2ZXJzaW9uU3RyaW5nLnNwbGl0KCcuJykubWFwKChwKSA9PiBwYXJzZUludChwLCAxMCkpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgSW52YWxpZCB2ZXJzaW9uIG51bWJlcjogJHt2ZXJzaW9uU3RyaW5nfWApO1xuICAgIH1cblxuICAgIHRoaXMubWFqb3IgPSBwYXJ0c1swXTtcbiAgICB0aGlzLm1pbm9yID0gcGFydHNbMV07XG4gICAgdGhpcy5maXggPSBwYXJ0c1syXTtcbiAgICB0aGlzLmlzQWxwaGEgPSBpc0FscGhhO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCdWlsZE51bWJlcihwcmVSZWxlYXNlU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IG5vQnVpbGROdW1iZXIgPSAtMTtcbiAgICBpZiAoIXByZVJlbGVhc2VTdHJpbmcpIHtcbiAgICAgIHJldHVybiBub0J1aWxkTnVtYmVyO1xuICAgIH1cblxuICAgIC8vIFRoZSBwcmVSZWxlYXNlIHN0cmluZyBoYXMgdGhpcyBmb3JtOiBwcmUuTiwgYnV0IHdlIGRvbid0IGRlcGVuZCBvbiB0aGUgYWN0dWFsIHN0cmluZyBiZWluZyAncHJlJ1xuICAgIGNvbnN0IHBhcnRTdHIgPSBwcmVSZWxlYXNlU3RyaW5nLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHBhcnRTdHJbMV0gPyBwYXJzZUludChwYXJ0U3RyWzFdLCAxMCkgOiBub0J1aWxkTnVtYmVyO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLm1ham9yfS4ke3RoaXMubWlub3J9LiR7dGhpcy5maXh9YDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZnVsbEZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLmZpeH0tcHJlLiR7dGhpcy5idWlsZH1gO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhlY3V0ZVJlc3BvbnNlLFxuICBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcixcbiAgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTixcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBOb3RpZmljYXRpb24sXG4gIE5vdGlmaWNhdGlvbkhhbmRsZXIsXG4gIFZlcmJJZCxcbiAgVmVyc2lvbkxlc3NUaGFuLFxuICBWZXJzaW9uTnVtYmVyLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgd2hpY2ggc3VwcG9ydHMgdXBncmFkaW5nIGFuZCBkb3duZ3JhZGluZyB0aGUgaW5wdXRcbiAqIGludGVybmFsIGNvbnRyYWN0IHRvIHRoZSB2ZXJzaW9uIHRoYXQgdGhpcyBtb2R1bGUgaXMgYnVpbHQgYWdhaW5zdFxuICpcbiAqIEBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAqIEBpbXBsZW1lbnRzIHtJbnRlcm5hbEFwaURpc3BhdGNoZXJ9XG4gKi9cbmV4cG9ydCBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgaW1wbGVtZW50cyBJbnRlcm5hbEFwaURpc3BhdGNoZXIge1xuICBwcml2YXRlIF92ZXJzaW9uQ29udmVydGVyOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcjtcbiAgcHJpdmF0ZSBfbm90aWZpY2F0aW9uSGFuZGxlcnM6IEFycmF5PE5vdGlmaWNhdGlvbkhhbmRsZXI+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAgICogV2UgaGF2ZSBtdWx0aXBsZSB2ZXJzaW9uIGNvbnZlcnRpbmcgZGlzcGF0Y2hlcnMgdGhhdCB3b3JrIHRvZ2V0aGVyLlxuICAgKiBJZiBuZWVkZWQsIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgd3JhcHMgZWl0aGVyIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgKGRlc2t0b3ApXG4gICAqIG9yIHRoZSBDcm9zc0ZyYW1lRGlzcGF0Y2hlciAoc2VydmVyKS5cbiAgICogVGhlIEludGVybmFsL0Nyb3NzRnJhbWUgZGlzcGF0Y2hlcnMgaGFuZGxlIGFuIHVwZGF0ZWQgcGxhdGZvcm0gd2l0aCBhbiBvbGRlciBleHRlcm5hbCBsaWJyYXJ5LlxuICAgKiAoVGhlIENyb3NzRnJhbWVEaXNwYXRjaGVyIHNlbmRzIG1lc3NhZ2VzIGFjcm9zcyB0aGUgZnJhbWUsIGFuZCBpdCBpcyBoYW5kbGVkIGJ5IHRoZSBQcmVzTGF5ZXJIYW5kbGVyLilcbiAgICogTWVhbndoaWxlLCB0aGUgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyIGhhbmRsZXMgYW4gdXBkYXRlZCBleHRlcm5hbCBsaWJyYXJ5IHdpdGggYW4gb2xkZXIgcGxhdGZvcm0uXG5cbiAgICogQHBhcmFtIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIgVGhlIGRlbGVnYXRlIHRoYXQgZG9lcyB0aGUgYWN0dWFsIHdvcmsuXG4gICAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb25OdW1iZXIgVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHdoaWNoIHRoZSBwbGF0Zm9ybSBtb2R1bGUgaXMgdXNpbmcuXG4gICAqIFRoaXMgbnVtYmVyIHdpbGwgYmUgdXNlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBkb3duZ3JhZGUgaW5jb21pbmcgY29tbWFuZHMgYW5kIHVwZ3JhZGUgdGhlIHJlc3VsdHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgICBwbGF0Zm9ybVZlcnNpb25OdW1iZXI6IFZlcnNpb25OdW1iZXIsXG4gICkge1xuICAgIHRoaXMuX3ZlcnNpb25Db252ZXJ0ZXIgPSBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyKElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIHBsYXRmb3JtVmVyc2lvbk51bWJlcik7XG5cbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycyA9IFtdO1xuICAgIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cGdyYWRlZE5vdGlmaWNhdGlvbiA9IHRoaXMuX3ZlcnNpb25Db252ZXJ0ZXIudXBncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xuICAgICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICBoYW5kbGVyKHVwZ3JhZGVkTm90aWZpY2F0aW9uKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBuZWVkc1ZlcnNpb25Db252ZXJ0ZXIocGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gSWYgb3VyIHBsYXRmb3JtIGlzIGxlc3MgdGhhbiBleHRlcm5hbCBsaWJyYXJ5IHZlcnNpb24sIHRoZW4gd2UgbmVlZCBhIGNvbnZlcnRlclxuICAgIHJldHVybiBWZXJzaW9uTGVzc1RoYW4ocGxhdGZvcm1WZXJzaW9uLCBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcbiAgfVxuXG4gIHB1YmxpYyBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkb3duZ3JhZGVQYXJhbWV0ZXJzID0gdGhpcy5fdmVyc2lvbkNvbnZlcnRlci5kb3duZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICAgIHJldHVybiB0aGlzLl9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIuZXhlY3V0ZShkb3duZ3JhZGVQYXJhbWV0ZXJzLnZlcmIsIGRvd25ncmFkZVBhcmFtZXRlcnMucGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgdXBncmFkZVJlc3BvbnNlID0gdGhpcy5fdmVyc2lvbkNvbnZlcnRlci51cGdyYWRlRXhlY3V0ZVJldHVybihyZXNwb25zZSwgdmVyYiwgcGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB1cGdyYWRlUmVzcG9uc2U7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcihoYW5kbGVyOiBOb3RpZmljYXRpb25IYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgfVxuXG4gIHB1YmxpYyB1bnJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcihoYW5kbGVyOiBOb3RpZmljYXRpb25IYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMgPSB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5maWx0ZXIoKGgpID0+IGggIT09IGhhbmRsZXIpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBfZGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlsczogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscykge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZExheW91dENoYW5nZURldGFpbHMoKTogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZExheW91dENoYW5nZURldGFpbHM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRmlsdGVyQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRmlsdGVyQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0LFxuICAgIHByaXZhdGUgX2ZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgX2ZpZWxkSWQ/OiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuRmlsdGVyQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlckFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuRmlsdGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldC5nZXRGaWx0ZXJzQXN5bmMoKS50aGVuPENvbnRyYWN0LkZpbHRlcj4oKGZpbHRlcnMpID0+IHtcbiAgICAgIC8vIFRPRE86IEZpbHRlcmluZyBvZiB0aGUgZmlsdGVycyBzaG91bGQgZXZlbnR1YWxseSBiZSBkb25lIHBsYXRmb3JtIHNpZGUuXG4gICAgICBjb25zdCBldmVudGVkRmlsdGVyID0gdGhpcy5maWVsZElkXG4gICAgICAgID8gZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5maWVsZElkID09PSB0aGlzLmZpZWxkSWQsIHRoaXMpXG4gICAgICAgIDogZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5maWVsZE5hbWUgPT09IHRoaXMuZmllbGROYW1lLCB0aGlzKTtcblxuICAgICAgaWYgKCFldmVudGVkRmlsdGVyKSB7XG4gICAgICAgIC8vIFdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGZpbHRlciB3YXMgcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXRcbiAgICAgICAgLy8gYWZ0ZXIgdGhlIGV2ZW50IHdhcyByYWlzZWQuXG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5NaXNzaW5nRmlsdGVyLCBgY2Fubm90IGZpbmQgZmlsdGVyOiAke3RoaXMuX2ZpZWxkTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV2ZW50ZWRGaWx0ZXI7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIE1hcmtzU2VsZWN0ZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0Lk1hcmtzU2VsZWN0ZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLndvcmtzaGVldC5nZXRTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9yQ29kZXMsIFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBQYXJhbWV0ZXJzU2VydmljZSwgU2VydmljZU5hbWVzLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFBhcmFtZXRlciB9IGZyb20gJy4uL01vZGVscy9QYXJhbWV0ZXInO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IFRhYmxlYXVTaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1U2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1U2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlBhcmFtZXRlckNoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9nbG9iYWxGaWVsZE5hbWU6IHN0cmluZyxcbiAgICBzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQsXG4gICkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuUGFyYW1ldGVyQ2hhbmdlZCwgc2hlZXQpO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmFtZXRlckFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuUGFyYW1ldGVyPiB7XG4gICAgLy8gQ2FsbCBkb3duIHRvIG91ciBzZXJ2aWNlIHRvIGdldCB0aGUgcGFyYW1ldGVyIGJhY2sgdmlhIGl0cyBmaWVsZCBuYW1lXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8UGFyYW1ldGVyc1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gc2VydmljZS5maW5kUGFyYW1ldGVyQnlHbG9iYWxGaWVsZE5hbWVBc3luYyh0aGlzLl9nbG9iYWxGaWVsZE5hbWUpLnRoZW4oKHBhcmFtZXRlckltcGwpID0+IHtcbiAgICAgIGlmIChwYXJhbWV0ZXJJbXBsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLk1pc3NpbmdQYXJhbWV0ZXIsIGBDYW5ub3QgZmluZCBwYXJhbWV0ZXI6ICR7dGhpcy5fZ2xvYmFsRmllbGROYW1lfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihwYXJhbWV0ZXJJbXBsLCB0aGlzLnNoZWV0KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5TdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuU3VtbWFyeURhdGFDaGFuZ2VkLCB3b3Jrc2hlZXQpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1RXZlbnQge1xuICBwcml2YXRlIF90eXBlOiBUYWJsZWF1RXZlbnRUeXBlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlKSB7XG4gICAgdGhpcy5fdHlwZSA9IHR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogVGFibGVhdUV2ZW50VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudCB9IGZyb20gJy4vVGFibGVhdUV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFRhYmxlYXVTaGVldEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVhdVNoZWV0RXZlbnQge1xuICBwcml2YXRlIF9zaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQ7XG5cbiAgcHVibGljIGdldCBzaGVldCgpOiBDb250cmFjdC5FeHRlbnNpb25TaGVldCB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0O1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCkge1xuICAgIHN1cGVyKHR5cGUpO1xuXG4gICAgdGhpcy5fc2hlZXQgPSBzaGVldDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdVNoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVTaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBleHRlbmRzIFRhYmxlYXVTaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVhdVdvcmtzaGVldEV2ZW50IHtcbiAgcHVibGljIGdldCB3b3Jrc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0O1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHR5cGU6IFRhYmxlYXVFdmVudFR5cGUsXG4gICAgcHJvdGVjdGVkIF93b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCxcbiAgKSB7XG4gICAgc3VwZXIodHlwZSwgX3dvcmtzaGVldCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZm9ybWF0dGluZzogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nKSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0aW5nO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LldvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQsXG4gICAgcHJpdmF0ZSBfZm9ybWF0dGluZzogQ29udHJhY3QuV29ya3NoZWV0Rm9ybWF0dGluZyxcbiAgKSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lID0gJ0JlbnRvbiBTYW5zJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUgPSAnQmVudG9uIFNhbnMgTG93LURQSSc7XG5cbmV4cG9ydCBjb25zdCBCZW50b25TYW5zQm9va0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBCb29rJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBCb29rIEl0YWxpYyc7XG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lID0gJ0JlbnRvbiBTYW5zIFNlbWlEZW1pJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgU2VtaURlbWkgSXRhbGljJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zTGlnaHRGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNNZWRpdW1Gb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgTWVkaXVtJztcblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXM6IE1vZGVsW10gPSBbXG4gIEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZSxcbl07XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgQ29ubmVjdGVkU2VydmVyIGltcGxlbWVudHMgQ29udHJhY3QuQ29ubmVjdGVkU2VydmVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBfdXNlcklkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfc2l0ZUlkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfc2l0ZU5hbWVzcGFjZT86IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3dvcmtib29rSWQ/OiBzdHJpbmcsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHVzZXJJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91c2VySWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpdGVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zaXRlSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpdGVOYW1lc3BhY2UoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2l0ZU5hbWVzcGFjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya2Jvb2tJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93b3JrYm9va0lkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNjaGVtYSwgRGF0YVNvdXJjZSBhcyBEYXRhU291cmNlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIERhdGFTb3VyY2UsIERhdGFTb3VyY2VJbXBsLCBEYXRhU291cmNlU2VydmljZSwgU2VydmljZU5hbWVzLCBXb3JrYm9va0ltcGwgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25Xb3JrYm9va0ltcGwgZXh0ZW5kcyBXb3JrYm9va0ltcGwge1xuICBwdWJsaWMgZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRBbGxEYXRhU291cmNlc0FzeW5jKCkudGhlbjxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4oKHJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYTogRGF0YVNjaGVtYSA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzOiBBcnJheTxDb250cmFjdC5EYXRhU291cmNlPiA9IFtdO1xuXG4gICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGRhdGEgc291cmNlcyBhbmQgYWRkIHRoZW0uXG4gICAgICBPYmplY3QudmFsdWVzKGRhdGFTY2hlbWEuZGF0YVNvdXJjZXMpLmZvckVhY2goKGRzKSA9PiB7XG4gICAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZHMpKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZGF0YVNvdXJjZXM7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU291cmNlSW5mbzogRGF0YVNvdXJjZUluZm8pOiBEYXRhU291cmNlIHtcbiAgICBjb25zdCBkYXRhU291cmNlSW1wbCA9IG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlSW5mbywgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZShkYXRhU291cmNlSW1wbCk7XG4gICAgZGF0YVNvdXJjZUltcGwuaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKGRhdGFTb3VyY2UpO1xuICAgIHJldHVybiBkYXRhU291cmNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzLCBTaGVldFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29udGV4dE1lbnVFdmVudCxcbiAgRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcixcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4dGVuc2lvbkRhc2hib2FyZEluZm8sXG4gIEV4dGVuc2lvbkxvY2F0b3IsXG4gIEV4dGVuc2lvblNldHRpbmdzSW5mbyxcbiAgRXh0ZW5zaW9uV29ya3NoZWV0SW5mbyxcbiAgRm9udE5hbWVBbmRJbmZvLFxuICBGb3JtYXR0aW5nU2hlZXQsXG4gIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sXG4gIEluaXRpYWxpemF0aW9uT3B0aW9ucyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5LFxuICBNb2RlbCxcbiAgTm90aWZpY2F0aW9uSWQsXG4gIFBhcmFtZXRlcklkLFxuICBTaGVldFBhdGgsXG4gIFZlcmJJZCxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBBcGlWZXJzaW9uLFxuICBEYXNoYm9hcmRJbXBsLFxuICBFeHBvcnRTZXJ2aWNlLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNoZWV0SW5mb0ltcGwsXG4gIFRhYmxlYXVFcnJvcixcbiAgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBWaXpTZXJ2aWNlLFxuICBXb3Jrc2hlZXRJbXBsLFxuICBkb0Nyb3NzRnJhbWVCb290c3RyYXAsXG4gIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi4vTW9kZWxzL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBXb3JrYm9vayB9IGZyb20gJy4uL01vZGVscy9Xb3JrYm9vayc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuLi9Nb2RlbHMvV29ya3NoZWV0JztcbmltcG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmltcG9ydCB7IFNldHRpbmdzIH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9TZXR0aW5ncyc7XG5pbXBvcnQgeyBVSSB9IGZyb20gJy4uL05hbWVzcGFjZXMvVUknO1xuaW1wb3J0IHsgV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCB9IGZyb20gJy4uL05hbWVzcGFjZXMvV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRDb250ZW50IH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9Xb3Jrc2hlZXRDb250ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcywgcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyB9IGZyb20gJy4uL1NlcnZpY2VzL1JlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zRm9udEZhbWlseU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLFxuICBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlcyxcbn0gZnJvbSAnLi9CZW50b25TYW5zRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuaW1wb3J0IHsgTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIH0gZnJvbSAnLi9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXInO1xuaW1wb3J0IHsgU2V0dGluZ3NJbXBsIH0gZnJvbSAnLi9TZXR0aW5nc0ltcGwnO1xuaW1wb3J0IHtcbiAgU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlcyxcbiAgVGFibGVhdUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVCb2xkRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLFxufSBmcm9tICcuL1RhYmxlYXVCb29rRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi9VSUltcGwnO1xuXG5leHBvcnQgdHlwZSBDYWxsYmFja01hcCA9IHsgW2tleTogc3RyaW5nXTogKCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnNJbXBsIHtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHN0cmluZz47XG4gIHByaXZhdGUgX3N0eWxlRWxlbWVudDogSFRNTFN0eWxlRWxlbWVudDtcbiAgcHVibGljIGRhc2hib2FyZENvbnRlbnQ/OiBEYXNoYm9hcmRDb250ZW50O1xuICBwdWJsaWMgd29ya3NoZWV0Q29udGVudD86IFdvcmtzaGVldENvbnRlbnQ7XG4gIHB1YmxpYyBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG4gIHB1YmxpYyBzZXR0aW5nczogU2V0dGluZ3M7XG4gIHB1YmxpYyB1aTogVUk7XG4gIHB1YmxpYyB3b3JrYm9vazogV29ya2Jvb2s7XG4gIHB1YmxpYyBleHRlbnNpb25ab25lSWQ6IG51bWJlcjtcblxuICBwdWJsaWMgaW5pdGlhbGl6ZUFzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLCBjb250ZXh0TWVudUNhbGxiYWNrcz86IENhbGxiYWNrTWFwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgICAgdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluaXRPcHRpb25zOiBJbml0aWFsaXphdGlvbk9wdGlvbnMgPSB7IGlzQWxwaGE6IEFwaVZlcnNpb24uSW5zdGFuY2UuaXNBbHBoYSwgaXNFeHRlbnNpb25EaWFsb2c6IGlzRXh0ZW5zaW9uRGlhbG9nIH07XG4gICAgICAgIC8vIEZpcnN0IHRoaW5nIHdlIHdhbnQgdG8gZG8gaXMgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgZGVza3RvcCBkaXNwYXRjaGVyIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgdXNcbiAgICAgICAgaWYgKExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlci5oYXNEZXNrdG9wQXBpRGlzcGF0Y2hlclByb21pc2UoaW5pdE9wdGlvbnMpKSB7XG4gICAgICAgICAgLy8gUnVubmluZyBpbiBhIHByZS0yMDE5LjMgZGVza3RvcCwgdXNlIG91ciBsZWdhY3kgZGlzcGF0Y2hlciBwcm9taXNlXG4gICAgICAgICAgY29uc3QgZGVza3RvcERpc3BhdGNoZXJQcm9taXNlID0gTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyLmdldERlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZShpbml0T3B0aW9ucyk7XG4gICAgICAgICAgZGVza3RvcERpc3BhdGNoZXJQcm9taXNlXG4gICAgICAgICAgICA/LnRoZW4oKGRpc3BhdGNoZXJGYWN0b3J5KSA9PiB0aGlzLm9uRGlzcGF0Y2hlclJlY2VpdmVkKGRpc3BhdGNoZXJGYWN0b3J5LCBpc0V4dGVuc2lvbkRpYWxvZywgY29udGV4dE1lbnVDYWxsYmFja3MpKVxuICAgICAgICAgICAgLnRoZW4oKG9wZW5QYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmUob3BlblBheWxvYWQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdlIG11c3QgYmUgcnVubmluZyBpbiBzZXJ2ZXIsIHNvIHdlIHNob3VsZCB0cnkgdG8ga2ljayBvZiB0aGUgc2VydmVyIGRpc3BhdGNoZXIgYm9vdHN0cmFwcGluZ1xuICAgICAgICAgIGNvbnN0IG9uRGlzcGF0Y2hlclJlY2VpdmVkQ2FsbGJhY2sgPSB0aGlzLm9uRGlzcGF0Y2hlclJlY2VpdmVkLmJpbmQodGhpcyk7XG4gICAgICAgICAgZG9Dcm9zc0ZyYW1lQm9vdHN0cmFwKHdpbmRvdywgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgaW5pdE9wdGlvbnMpXG4gICAgICAgICAgICAudGhlbigoZmFjdG9yeTogSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gb25EaXNwYXRjaGVyUmVjZWl2ZWRDYWxsYmFjayhmYWN0b3J5LCBpc0V4dGVuc2lvbkRpYWxvZywgY29udGV4dE1lbnVDYWxsYmFja3MpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKChvcGVuUGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKG9wZW5QYXlsb2FkKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZXBvcnRFeHRlbnNpb25SZW5kZXJDb21wbGV0ZShtZWRpYUJsb2I/OiBBcnJheUJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4cG9ydFNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEV4cG9ydFNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHBvcnQpO1xuXG4gICAgcmV0dXJuIGV4cG9ydFNlcnZpY2UucmVwb3J0RXh0ZW5zaW9uUmVuZGVyQ29tcGxldGUobWVkaWFCbG9iKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYzogb2JqZWN0KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2aXpTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxWaXpTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVml6KTtcblxuICAgIHJldHVybiB2aXpTZXJ2aWNlLmNyZWF0ZVZpekltYWdlQXN5bmMoaW5wdXRTcGVjKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDbGlja1Rocm91Z2hBc3luYyhjbGlja1Rocm91Z2hFbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcblxuICAgIHJldHVybiB1aVNlcnZpY2Uuc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZCwgdGhpcy5leHRlbnNpb25ab25lSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0Rhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3IobG9jYXRvcjogRXh0ZW5zaW9uTG9jYXRvcik6IGxvY2F0b3IgaXMgRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvciB7XG4gICAgY29uc3QgZGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvciA9IGxvY2F0b3IgYXMgRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcjtcbiAgICBpZiAoIWRhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3IuZGFzaGJvYXJkUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdVbmV4cGVjdGVkIGVycm9yIGR1cmluZyBpbml0aWFsaXphdGlvbi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIG9uRGlzcGF0Y2hlclJlY2VpdmVkKFxuICAgIGRpc3BhdGNoZXJGYWN0b3J5OiBJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5LFxuICAgIGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLFxuICAgIGNvbnRleHRNZW51RnVuY3Rpb25zPzogQ2FsbGJhY2tNYXAsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJGYWN0b3J5KElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04pO1xuXG4gICAgLy8gQ2FsbCB0byByZWdpc3RlciBhbGwgdGhlIHNlcnZpY2VzIHdoaWNoIHdpbGwgdXNlIHRoZSBuZXdseSBpbml0aWFsaXplZCBkaXNwYXRjaGVyXG4gICAgcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyKTtcblxuICAgIC8vIEdldCB0aGUgaW5pdGlhbGl6YXRpb24gc2VydmljZSBhbmQgaW5pdGlhbGl6ZSB0aGlzIGV4dGVuc2lvblxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8SW5pdGlhbGl6YXRpb25TZXJ2aWNlPihcbiAgICAgIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuSW5pdGlhbGl6YXRpb25TZXJ2aWNlLFxuICAgICk7XG5cbiAgICBjb25zdCBjYWxsYmFja01hcEtleXMgPSBjb250ZXh0TWVudUZ1bmN0aW9ucyA/IE9iamVjdC5rZXlzKGNvbnRleHRNZW51RnVuY3Rpb25zKSA6IFtdO1xuICAgIHJldHVybiBpbml0aWFsaXphdGlvblNlcnZpY2UuaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYyhpc0V4dGVuc2lvbkRpYWxvZywgY2FsbGJhY2tNYXBLZXlzKS50aGVuPHN0cmluZz4oKHJlc3VsdCkgPT4ge1xuICAgICAgLy8gSWYgd2UgcmVjZWl2ZSBhbiBpbnZhbGlkIHBsYWZvcm0gdmVyc2lvbiwgdGhpcyBtZWFucyB0aGF0IHBsYXRmb3JtIGlzIHJ1bm5uaW5nIDEuNCBvciAyLjEgYW5kXG4gICAgICAvLyBkb2Vzbid0IHBhc3MgdGhlIHBsYXRmb3JtIHZlcnNpb24gdG8gZXh0ZXJuYWwuIEluIHRoaXMgY2FzZSB3ZSBhc3N1bWUgdGhlIHBsYXRmb3JtIHZlcnNpb24gdG8gYmUgMS45XG4gICAgICBjb25zdCBwbGF0Zm9ybVZlcnNpb24gPSByZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQucGxhdGZvcm1WZXJzaW9uXG4gICAgICAgID8gcmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50LnBsYXRmb3JtVmVyc2lvblxuICAgICAgICA6IHsgbWFqb3I6IDEsIG1pbm9yOiA5LCBmaXg6IDAgfTtcblxuICAgICAgLy8gV3JhcCBvdXIgZXhpc3RpbmcgZGlzcGF0Y2hlciBpbiBhIGRpc3BhdGNoZXIgdGhhdCBjYW4gZG93bmdyYWRlL3VwZ3JhZGUgZm9yIGFuIG9sZGVyIHBsYXRmb3JtLlxuICAgICAgaWYgKFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlci5uZWVkc1ZlcnNpb25Db252ZXJ0ZXIocGxhdGZvcm1WZXJzaW9uKSkge1xuICAgICAgICBkaXNwYXRjaGVyID0gbmV3IFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlcihkaXNwYXRjaGVyLCBwbGF0Zm9ybVZlcnNpb24pO1xuICAgICAgfVxuICAgICAgLy8gUmVnaXN0cmF0aW9uIG9mIHNlcnZpY2VzIG11c3QgaGFwcGVuIGJlZm9yZSBpbml0aWFsaXppbmcgY29udGVudCBhbmQgZW52aXJvbm1lbnRcbiAgICAgIC8vIEV4dGVuc2lvbnMgZG9lc24ndCBuZWVkIHRvIHBhc3MgaW4gYSByZWdpc3RyeUlkLiBCeSBkZWZhdWx0LCB0aGUgc2VydmljZSByZWdpc3RyeSBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkIHdpdGggcmVnaXN0cnlJZD0wLlxuICAgICAgcmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyhkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCk7XG4gICAgICByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyKTtcblxuICAgICAgaWYgKHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvICYmIHRoaXMuaXNEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yKHJlc3VsdC5leHRlbnNpb25JbnN0YW5jZS5sb2NhdG9yKSkge1xuICAgICAgICB0aGlzLmRhc2hib2FyZENvbnRlbnQgPSB0aGlzLmluaXRpYWxpemVEYXNoYm9hcmRDb250ZW50KFxuICAgICAgICAgIHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvLFxuICAgICAgICAgIHJlc3VsdC5leHRlbnNpb25JbnN0YW5jZS5sb2NhdG9yLmRhc2hib2FyZFBhdGgsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uWm9uZUlkID0gcmVzdWx0LmV4dGVuc2lvbkRhc2hib2FyZEluZm8uZXh0ZW5zaW9uWm9uZUlkO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LmV4dGVuc2lvbldvcmtzaGVldEluZm8pIHtcbiAgICAgICAgdGhpcy53b3Jrc2hlZXRDb250ZW50ID0gdGhpcy5pbml0aWFsaXplV29ya3NoZWV0Q29udGVudChyZXN1bHQuZXh0ZW5zaW9uV29ya3NoZWV0SW5mbyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSBuZXcgRW52aXJvbm1lbnQocmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50KTtcbiAgICAgIHRoaXMuc2V0dGluZ3MgPSB0aGlzLmluaXRpYWxpemVTZXR0aW5ncyhyZXN1bHQuZXh0ZW5zaW9uU2V0dGluZ3NJbmZvKTtcbiAgICAgIHRoaXMudWkgPSBuZXcgVUkobmV3IFVJSW1wbChpc0V4dGVuc2lvbkRpYWxvZykpO1xuICAgICAgdGhpcy53b3JrYm9vayA9IG5ldyBXb3JrYm9vayhuZXcgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsKCkpO1xuXG4gICAgICBpZiAocmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rRm9ybWF0dGluZykge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVUYWJsZWF1Rm9udHMoZGlzcGF0Y2hlciwgcmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rRm9ybWF0dGluZyk7XG4gICAgICAgIHRoaXMuYXBwbHlBbGxGb3JtYXR0aW5nKHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0Zvcm1hdHRpbmcpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZnRlciBpbml0aWFsaXphdGlvbiBoYXMgY29tcGxldGVkLCBzZXR1cCBsaXN0ZW5lcnMgZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgdGhhdFxuICAgICAgLy8gYXJlIG1lYW50IHRvIGJlIHRyaWdnZXJlZCB3aGVuZXZlciBhIGNvbnRleHQgbWVudSBpdGVtIGlzIGNsaWNrZWQuXG4gICAgICB0aGlzLmluaXRpYWxpemVDb250ZXh0TWVudUNhbGxiYWNrcyhjb250ZXh0TWVudUZ1bmN0aW9ucyk7XG5cbiAgICAgIC8vIEFsc28gc2V0IHVwIGxpc3RlbmVycyBmb3IgRXh0ZW5zaW9uU3R5bGVzQ2hhbmdlZEV2ZW50XG4gICAgICB0aGlzLmluaXRpYWxpemVXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnRDYWxsYmFjayhkaXNwYXRjaGVyKTtcblxuICAgICAgLy8gSW4gdGhlIG5vcm1hbCBpbml0aWFsaXphdGlvbiBjYXNlLCB0aGlzIHdpbGwgYmUgYW4gZW1wdHkgc3RyaW5nLiAgV2hlbiByZXR1cm5pbmcgZnJvbSBpbml0aWFsaXplQXN5bmMgdG8gdGhlXG4gICAgICAvLyBkZXZlbG9wZXIsIHdlIGp1c3QgaW5nb3JlIHRoYXQgc3RyaW5nLiAgSW4gdGhlIGNhc2Ugb2YgaW5pdGlhbGl6aW5nIGZyb20gYW4gZXh0ZW5zaW9uIGRpYWxvZywgdGhpcyBzdHJpbmdcbiAgICAgIC8vIGlzIGFuIG9wdGlvbmFsIHBheWxvYWQgc2VudCBmcm9tIHRoZSBwYXJlbnQgZXh0ZW5zaW9uLlxuICAgICAgcmV0dXJuIHJlc3VsdC5leHRlbnNpb25EaWFsb2dQYXlsb2FkO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5QWxsRm9ybWF0dGluZyhmb3JtYXR0aW5nTW9kZWw6IFdvcmtib29rRm9ybWF0dGluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3R5bGVFbGVtZW50KSB7XG4gICAgICB0aGlzLl9zdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgdGhpcy5fc3R5bGVFbGVtZW50LmlkID0gJ1RhYmxlYXUtRXh0ZW5zaW9uLUZvcm1hdHRpbmcnO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzLl9zdHlsZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fc3R5bGVFbGVtZW50LnNoZWV0IHx8ICFmb3JtYXR0aW5nTW9kZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHlsZXNoZWV0OiBDU1NTdHlsZVNoZWV0ID0gdGhpcy5fc3R5bGVFbGVtZW50LnNoZWV0O1xuICAgIHdoaWxlIChzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0eWxlc2hlZXQuZGVsZXRlUnVsZShzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBmb3JtYXR0aW5nTW9kZWwuZm9ybWF0dGluZ1NoZWV0cy5tYXAoKGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQpID0+IHtcbiAgICAgIHRoaXMuYXBwbHlGb3JtYXR0aW5nU2hlZXRUb1N0eWxlU2hlZXQoY3VycmVudEZvcm1hdHRpbmdTaGVldCwgc3R5bGVzaGVldCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Rm9ybWF0dGluZ1NoZWV0VG9TdHlsZVNoZWV0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQ6IEZvcm1hdHRpbmdTaGVldCwgc3R5bGVzaGVldDogQ1NTU3R5bGVTaGVldCk6IHZvaWQge1xuICAgIGxldCBzdHlsZUluZm8gPSAnJztcblxuICAgIGNvbnN0IGNzc1Byb3BlcnRpZXMgPSBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXM7XG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LWZhbWlseTogJyArIGNzc1Byb3BlcnRpZXMuZm9udEZhbWlseS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5mb250U2l6ZSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LXNpemU6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRTaXplLnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC13ZWlnaHQ6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udFN0eWxlKSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2ZvbnQtc3R5bGU6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRTdHlsZS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbikge1xuICAgICAgc3R5bGVJbmZvICs9ICd0ZXh0LWRlY29yYXRpb246ICcgKyBjc3NQcm9wZXJ0aWVzLnRleHREZWNvcmF0aW9uLnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmNvbG9yKSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2NvbG9yOiAnICsgY3NzUHJvcGVydGllcy5jb2xvciArICc7ICc7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0b3I6IHN0cmluZyA9ICcuJyArIGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY2xhc3NOYW1lS2V5O1xuICAgIGNvbnN0IHJ1bGU6IHN0cmluZyA9IHNlbGVjdG9yICsgJyB7ICcgKyBzdHlsZUluZm8gKyAnIH0nO1xuICAgIHN0eWxlc2hlZXQuaW5zZXJ0UnVsZShydWxlLCBzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnRDYWxsYmFjayhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24sXG4gICAgKTtcbiAgICAvLyBVbnJlZ2lzdGVyIGZ1bmN0aW9uIG5vdCB1c2VkIHNpbmNlIHRoZXNlIG5vdGlmaWNhdGlvbnMgc2hvdWxkIGJlXG4gICAgLy8gb2JzZXJ2ZWQgZm9yIHRoZSBmdWxsIGxpZmV0aW1lIG9mIHRoZSBleHRlbnNpb24uXG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudEZvcm1hdHRpbmc6IFdvcmtib29rRm9ybWF0dGluZykgPT4ge1xuICAgICAgICBpZiAoZXZlbnRGb3JtYXR0aW5nKSB7XG4gICAgICAgICAgdGhpcy5pbml0aWFsaXplVGFibGVhdUZvbnRzKGRpc3BhdGNoZXIsIGV2ZW50Rm9ybWF0dGluZyk7XG4gICAgICAgICAgdGhpcy5hcHBseUFsbEZvcm1hdHRpbmcoZXZlbnRGb3JtYXR0aW5nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVGFibGVhdUZvbnRzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgd29ya2Jvb2tGb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmb250TmFtZXM6IE1vZGVsW10gPSBbLi4uU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlcywgLi4uU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlc107XG4gICAgd29ya2Jvb2tGb3JtYXR0aW5nLmZvcm1hdHRpbmdTaGVldHMuZm9yRWFjaCgoZm9ybWF0dGluZ1NoZWV0KSA9PiB7XG4gICAgICBpZiAoZm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSkge1xuICAgICAgICBmb250TmFtZXMucHVzaChmb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250RmFtaWx5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChmb250TmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7IFtQYXJhbWV0ZXJJZC5Gb250TmFtZUxpc3RJdGVtc106IGZvbnROYW1lcyB9O1xuICAgICAgZGlzcGF0Y2hlclxuICAgICAgICAuZXhlY3V0ZShWZXJiSWQuR2V0Rm9udHMsIHBhcmFtZXRlcnMpXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZEZvbnRzKHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxGb250TmFtZUFuZEluZm8+KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRm9udHMoZm9udHM6IEFycmF5PEZvbnROYW1lQW5kSW5mbz4pOiB2b2lkIHtcbiAgICBmb250cy5mb3JFYWNoKChmb250TmFtZUFuZEluZm8pID0+IHtcbiAgICAgIGlmIChTdXBwb3J0ZWRUYWJsZWF1Rm9udEZhY2VzLmluY2x1ZGVzKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkpIHtcbiAgICAgICAgdGhpcy5sb2FkVGFibGVhdUZvbnRzKGZvbnROYW1lQW5kSW5mbyk7XG4gICAgICB9IGVsc2UgaWYgKFN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXMuaW5jbHVkZXMoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSkge1xuICAgICAgICB0aGlzLmxvYWRCZW50b25TYW5zRm9udHMoZm9udE5hbWVBbmRJbmZvKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZURhc2hib2FyZENvbnRlbnQoaW5mbzogRXh0ZW5zaW9uRGFzaGJvYXJkSW5mbywgc2hlZXRQYXRoOiBTaGVldFBhdGgpOiBEYXNoYm9hcmRDb250ZW50IHtcbiAgICAvLyBzaGVldHMgYXJlIGFsd2F5cyBhY3RpdmUgZm9yIEV4dGVuc2lvbnNcbiAgICBjb25zdCBzaGVldEluZm9JbXBsID0gbmV3IFNoZWV0SW5mb0ltcGwoaW5mby5uYW1lLCBTaGVldFR5cGUuRGFzaGJvYXJkLCB7IHdpZHRoOiBpbmZvLnNpemUudywgaGVpZ2h0OiBpbmZvLnNpemUuaCB9LCB1bmRlZmluZWQsIHRydWUpO1xuICAgIGNvbnN0IGRhc2hib2FyZEltcGwgPSBuZXcgRGFzaGJvYXJkSW1wbChzaGVldEluZm9JbXBsLCBpbmZvLnpvbmVzLCBzaGVldFBhdGgsIEV4dGVuc2lvbnNSZWdpc3RyeUlkLCBudWxsLCBpbmZvLmFjdGl2ZURhc2hib2FyZE9iamVjdElkKTtcbiAgICBjb25zdCBkYXNoYm9hcmQgPSBuZXcgRGFzaGJvYXJkKGRhc2hib2FyZEltcGwpO1xuICAgIHJldHVybiBuZXcgRGFzaGJvYXJkQ29udGVudChkYXNoYm9hcmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplV29ya3NoZWV0Q29udGVudChpbmZvOiBFeHRlbnNpb25Xb3Jrc2hlZXRJbmZvKTogV29ya3NoZWV0Q29udGVudCB7XG4gICAgY29uc3Qgc2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKFxuICAgICAgaW5mby52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgICAgeyB3aWR0aDogaW5mby5zaXplLncsIGhlaWdodDogaW5mby5zaXplLmggfSxcbiAgICAgIHVuZGVmaW5lZCwgLy8gaW5kZXggcHJvcGVydHkgaXMgZW1iZWRkaW5nIHNwZWNpZmljXG4gICAgICB0cnVlLCAvLyBzaGVldHMgYXJlIGFsd2F5cyBhY3RpdmUgZm9yIEV4dGVuc2lvbnNcbiAgICApO1xuXG4gICAgY29uc3Qgd29ya3NoZWV0SW1wbCA9IG5ldyBXb3Jrc2hlZXRJbXBsKFxuICAgICAgc2hlZXRJbmZvSW1wbCxcbiAgICAgIEV4dGVuc2lvbnNSZWdpc3RyeUlkLFxuICAgICAgaW5mby52aXN1YWxJZCxcbiAgICAgIG51bGwsIC8vIHBhcmVudERhc2hib2FyZCBpcyBhbHdheXMgbnVsbCBmb3Igd29ya3NoZWV0IGluIFdvcmtzaGVldENvbnRlbnRcbiAgICAgIG51bGwsIC8vIHBhcmVudFN0b3J5UG9pbnQgaXMgb25seSB1c2VkIGZvciBlbWJlZGRpbmdcbiAgICAgIGluZm8uYmFja2dyb3VuZENvbG9yLFxuICAgICAgV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbC5jb252ZXJ0VG9Xb3JrYm9va0Zvcm1hdHRpbmcoaW5mby5mb3JtYXR0aW5nKSxcbiAgICApO1xuICAgIGNvbnN0IHdvcmtzaGVldCA9IG5ldyBXb3Jrc2hlZXQod29ya3NoZWV0SW1wbCk7XG4gICAgcmV0dXJuIG5ldyBXb3Jrc2hlZXRDb250ZW50KHdvcmtzaGVldCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbyk6IFNldHRpbmdzIHtcbiAgICBjb25zdCBzZXR0aW5nc0ltcGwgPSBuZXcgU2V0dGluZ3NJbXBsKHNldHRpbmdzSW5mbyk7XG4gICAgcmV0dXJuIG5ldyBTZXR0aW5ncyhzZXR0aW5nc0ltcGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29udGV4dE1lbnVDYWxsYmFja3MoY29udGV4dE1lbnVGdW5jdGlvbnM/OiBDYWxsYmFja01hcCk6IHZvaWQge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFxuICAgICAgU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbixcbiAgICApO1xuXG4gICAgLy8gVW5yZWdpc3RlciBmdW5jdGlvbiBub3QgdXNlZCBzaW5jZSB0aGVzZSBub3RpZmljYXRpb25zIHNob3VsZCBiZVxuICAgIC8vIG9ic2VydmVkIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuQ29udGV4dE1lbnVDbGljayxcbiAgICAgICgpID0+IHtcbiAgICAgICAgLy8gTGV0IHRocm91Z2ggYW55IGNvbnRleHQgbWVudSBldmVudCwgdGhlc2UgYXJlIGFscmVhZHkgZmlsdGVyZWQgb24gYXBpLWNvcmVcbiAgICAgICAgLy8gYmFzZWQgb24gdGhlIGV4dGVuc2lvbiBsb2NhdG9yLlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICAoZXZlbnQ6IENvbnRleHRNZW51RXZlbnQpID0+IHtcbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGV4dCBtZW51IElEXG4gICAgICAgIGlmIChjb250ZXh0TWVudUZ1bmN0aW9ucykge1xuICAgICAgICAgIGlmICghY29udGV4dE1lbnVGdW5jdGlvbnNbZXZlbnQuaWRdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlY2VpdmVkIHVuZXhwZWN0ZWQgY29udGV4dCBtZW51IElkIGZyb20gZXZlbnQ6ICR7ZXZlbnQuaWR9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dE1lbnVGdW5jdGlvbnNbZXZlbnQuaWRdKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFRhYmxlYXVGb250cyhmb250TmFtZUFuZEluZm86IEZvbnROYW1lQW5kSW5mbyk6IHZvaWQge1xuICAgIHN3aXRjaCAoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSB7XG4gICAgICBjYXNlIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUxpZ2h0Rm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1UmVndWxhckZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVNlbWlib2xkRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdVJlZ3VsYXJGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1Qm9sZEZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdU1lZGl1bUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVNlbWlib2xkRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVNZWRpdW1Gb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1TGlnaHRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJ2F0dGVtcHRlZCB0byBsb2FkIHVuc3VwcG9ydGVkIGZvbnQ6ICR7Zm9udE5hbWVBbmRJbmZvLmZvbnROYW1lfS4nYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQmVudG9uU2Fuc0ZvbnRzKGZvbnROYW1lQW5kSW5mbzogRm9udE5hbWVBbmRJbmZvKTogdm9pZCB7XG4gICAgc3dpdGNoIChmb250TmFtZUFuZEluZm8uZm9udE5hbWUpIHtcbiAgICAgIGNhc2UgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICcxMDAnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICcxMDAnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKEJlbnRvblNhbnNMb3dEUElGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNTZW1pRGVtaUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHN0eWxlOiAnaXRhbGljJyB9KSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyBzdHlsZTogJ2l0YWxpYycgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAnYXR0ZW1wdGVkIHRvIGxvYWQgdW5zdXBwb3J0ZWQgZm9udDogJHtmb250TmFtZUFuZEluZm8uZm9udE5hbWV9LidgKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEluaXRpYWxpemF0aW9uT3B0aW9ucywgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIgaGFzIGJlZW4gbW92ZWQgKGFuZCByZW5hbWVkKSBmcm9tIGFwaS1pbnRlcm5hbC1jb250cmFjdC5cbiAqIEl0IHN1cHBvcnRzIHJ1bm5pbmcgYSBuZXdlciBleHRlcm5hbCBsaWJyYXJ5IGFnYWluc3QgYSBwcmUgMjAxOS4zIGRlc2t0b3AuXG4gKiBTdGFydGluZyBpbiAyMDE5LjMsIHdlIGhhdmUgYSBtZXJnZWQgYm9vdHN0cmFwIHN0eWxlIGZvciBib3RoIGRlc2t0b3AgYW5kIHNlcnZlci5cbiAqIEluIGFkZGl0aW9uLCB0aGUgYWxwaGEgY2hlY2tpbmcgdGhhdCBpcyBoYXBwZW5pbmcgaGVyZSBpcyBub3QgbmVjZXNzYXJ5IGluIGV4dGVybmFsLWFwaS1qc1xuICogIGFmdGVyIDIwMTkuMyBiZWNhdXNlIHRoYXQgY2hlY2tpbmcgaGFwcGVucyBpbiBhcGktcGxhdGZvcm0tanMgKEFwaURpc3BhdGNoZXJUZXN0LnRzKVxuICogVEZTSUQ6IDEwOTE1NjEgdHJhY2tzIGFuIGltcHJvdmVtZW50IHRvIHRoaXMgc3lzdGVtIHRvIG1ha2UgaXQgbGVzcyBjb21wbGV4IGFuZCB0aWUgaXQgZGlyZWN0bHkgdG9cbiAqICB0YWJsZWF1IGJldGEgcmVsZWFzZSB2ZXJzaW9ucy5cbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gZ2V0RGVza3RvcERpc3BhdGNoZXJQcm9taXNlKG9wdGlvbnM/OiBJbml0aWFsaXphdGlvbk9wdGlvbnMpOiBQcm9taXNlPEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3Rvcnk+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoKCFvcHRpb25zIHx8IHR5cGVvZiBvcHRpb25zLmlzQWxwaGEgPT09ICd1bmRlZmluZWQnKSAmJiAhd2luZG93Ll9fd2FybmluZ0lzc3VlZCkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybignVGhpcyBpcyBhIGJldGEgdmVyc2lvbiBvZiB0aGUgRXh0ZW5zaW9ucyBBUEkuIFBsZWFzZSB1cGdyYWRlIHRvIGFuIG9mZmljaWFsIHJlbGVhc2UuJyk7XG4gICAgICB3aW5kb3cuX193YXJuaW5nSXNzdWVkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmlzQWxwaGEgJiYgd2luZG93Ll9fcGxhdGZvcm1Jc09mZmljaWFsUmVsZWFzZSkge1xuICAgICAgd2luZG93Ll9fdGFibGVhdURlc2t0b3BEaXNwYXRjaGVyXG4gICAgICAgIC50aGVuKChkaXNwYXRjaGVyRmFjdG9yeSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyRmFjdG9yeShJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcbiAgICAgICAgICBkaXNwYXRjaGVyLmV4ZWN1dGUoVmVyYklkLkJsb2NrRXh0ZW5zaW9uLCB7fSkuY2F0Y2goKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyB3aWxsIGJlIHVuZGVmaW5lZCBpZiBwcm9taXNlIGlzIHJlamVjdGVkIG9yIHRocm93c1xuICAgIHJldHVybiB3aW5kb3cuX190YWJsZWF1RGVza3RvcERpc3BhdGNoZXI7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBoYXNEZXNrdG9wQXBpRGlzcGF0Y2hlclByb21pc2Uob3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWdldERlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZShvcHRpb25zKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIF9fdGFibGVhdURlc2t0b3BEaXNwYXRjaGVyOiBQcm9taXNlPEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3Rvcnk+O1xuICAgIF9fcGxhdGZvcm1Jc09mZmljaWFsUmVsZWFzZTogYm9vbGVhbjtcbiAgICBfX3dhcm5pbmdJc3N1ZWQ6IGJvb2xlYW47XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25TZXR0aW5nc0luZm8sIE5vdGlmaWNhdGlvbklkLCBTZXR0aW5nc0V2ZW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRXJyb3JIZWxwZXJzLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgVGFibGVhdUVycm9yLFxufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9UYWJsZWF1RXZlbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL0V4dGVuc2lvbnNTZXJ2aWNlTmFtZXMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IFNldHRpbmdzQ29sbGVjdGlvbiwgU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvU2V0dGluZ3NTZXJ2aWNlJztcblxuY2xhc3MgU2V0dGluZ3NDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5TZXR0aW5nc0NoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9uZXdTZXR0aW5nczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuU2V0dGluZ3NDaGFuZ2VkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmV3U2V0dGluZ3MoKTogU2V0dGluZ3NDb2xsZWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fbmV3U2V0dGluZ3M7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldHRpbmdzSW1wbCB7XG4gIHByaXZhdGUgc3RhdGljIEFTWU5DX1NBVkVfSU5fUFJPR1JFU1MgPSAnQXN5bmMgU2F2ZSBpcyBpbiBwcm9ncmVzcywgdXBkYXRpbmcgc2V0dGluZ3MgaXMgbm90IGFsbG93ZWQuJztcbiAgcHJpdmF0ZSBfaXNNb2RpZmllZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY3VycmVudFNldHRpbmdzOiBTZXR0aW5nc0NvbGxlY3Rpb247XG5cbiAgLy8gU2luY2UgcHJvbWlzZXMgY2FuJ3QgYmUgaW50cm9zcGVjdGVkIGZvciBzdGF0ZSwga2VlcCBhIHZhcmlhYmxlIHRoYXRcbiAgLy8gaW5kaWNhdGVzIGEgc2F2ZSBpcyBpbiBwcm9ncmVzcywgc28gdGhhdCBzZXQvZXJhc2UgY2FuJ3QgYmUgY2FsbGVkIGR1cmluZyBhIHNhdmUuXG4gIHByaXZhdGUgX3NhdmVJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNldHRpbmdzSW5mbzogRXh0ZW5zaW9uU2V0dGluZ3NJbmZvKSB7XG4gICAgdGhpcy5pbml0aWFsaXplU2V0dGluZ3Moc2V0dGluZ3NJbmZvKTtcbiAgfVxuXG4gIHB1YmxpYyBlcmFzZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoa2V5LCAna2V5Jyk7XG5cbiAgICAvLyBPbmx5IG1ha2UgYSBtb2RpZmljYXRpb24gaWYgd2UgaGF2ZSB0aGUga2V5IGFscmVhZHlcbiAgICBpZiAodGhpcy5fY3VycmVudFNldHRpbmdzW2tleV0pIHtcbiAgICAgIHRoaXMudmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpO1xuXG4gICAgICBkZWxldGUgdGhpcy5fY3VycmVudFNldHRpbmdzW2tleV07XG4gICAgICB0aGlzLl9pc01vZGlmaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0KGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGtleSwgJ2tleScpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldO1xuICB9XG5cbiAgcHVibGljIGdldEFsbCgpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIC8vIFJldHVybnMgYSBtdXRhYmxlIGNvcHkgb2YgdGhlIHNldHRpbmdzXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzTW9kaWZpZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzTW9kaWZpZWQ7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKCk6IFByb21pc2U8U2V0dGluZ3NDb2xsZWN0aW9uPiB7XG4gICAgdGhpcy52ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk7XG5cbiAgICAvLyBKdXN0IHJlc29sdmUgaW1tZWRpYXRlbHkgaWYgc2V0dGluZ3MgYXJlIHVuY2hhbmdlZFxuICAgIGlmICghdGhpcy5faXNNb2RpZmllZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZTxTZXR0aW5nc0NvbGxlY3Rpb24+KHRoaXMuX2N1cnJlbnRTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2F2ZUluUHJvZ3Jlc3MgPSB0cnVlO1xuXG4gICAgLy8gVXNlIHRoZSBzZXR0aW5ncyBzZXJ2aWNlIHRvIHNhdmUgc2V0dGluZ3MgdG8gdHdiXG4gICAgY29uc3Qgc2V0dGluZ3NTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZXR0aW5nc1NlcnZpY2U+KFxuICAgICAgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5TZXR0aW5nc1NlcnZpY2UsXG4gICAgKTtcblxuICAgIHJldHVybiBzZXR0aW5nc1NlcnZpY2Uuc2F2ZVNldHRpbmdzQXN5bmModGhpcy5fY3VycmVudFNldHRpbmdzKS50aGVuPFNldHRpbmdzQ29sbGVjdGlvbj4oXG4gICAgICAobmV3U2V0dGluZ3MpID0+IHtcbiAgICAgICAgdGhpcy5fc2F2ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNNb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFNldHRpbmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50U2V0dGluZ3MgPSBuZXdTZXR0aW5ncztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX2N1cnJlbnRTZXR0aW5ncywgbmV3U2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdTZXR0aW5ncztcbiAgICAgIH0sXG4gICAgICAocmVhc29uKSA9PiB7XG4gICAgICAgIHRoaXMuX3NhdmVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZWFzb24pO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTdHJpbmdQYXJhbWV0ZXIoa2V5LCAna2V5Jyk7IC8vIEtleSBzaG91bGRuJ3QgYmUgYW4gZW1wdHkgc3RyaW5nLlxuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIodmFsdWUsICd2YWx1ZScpOyAvLyBFbXB0eSBzdHJpbmcgdmFsdWUgaXMgYWxsb3dlZC5cbiAgICB0aGlzLnZlcmlmeVNldHRpbmdzQXJlVW5sb2NrZWQoKTtcblxuICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldID0gdmFsdWU7XG4gICAgdGhpcy5faXNNb2RpZmllZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgYWxsIGV2ZW50cyByZWxldmFudCB0byBzZXR0aW5ncyBvYmplY3QuICBUaGlzIGlzIG9ubHkgYSBzZXR0aW5nc1VwZGF0ZSBldmVudCBjdXJyZW50bHkuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+fSBDb2xsZWN0aW9uIG9mIGV2ZW50IG1hbmFnZXJzIHRvIHBhc3MgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXIuXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cygpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3NDaGFuZ2VkRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxTZXR0aW5nc0NoYW5nZWRFdmVudD4oQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5TZXR0aW5nc0NoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuU2V0dGluZ3NDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudDogU2V0dGluZ3NFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLl9jdXJyZW50U2V0dGluZ3MgPSBldmVudC5uZXdTZXR0aW5ncyA/PyB7fTtcbiAgICAgICAgc2V0dGluZ3NDaGFuZ2VkRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBTZXR0aW5nc0NoYW5nZWRFdmVudChldmVudC5uZXdTZXR0aW5ncykpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKHNldHRpbmdzQ2hhbmdlZEV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU2V0dGluZ3Moc2V0dGluZ3NJbmZvOiBFeHRlbnNpb25TZXR0aW5nc0luZm8pOiB2b2lkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNldHRpbmdzSW5mbywgJ3NldHRpbmdzSW5mbycpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2V0dGluZ3NJbmZvLnNldHRpbmdzVmFsdWVzLCAnc2V0dGluZ3NJbmZvLlNldHRpbmdzVmFsdWVzJyk7XG5cbiAgICB0aGlzLl9jdXJyZW50U2V0dGluZ3MgPSBzZXR0aW5nc0luZm8uc2V0dGluZ3NWYWx1ZXM7XG5cbiAgICAvLyBSZXNldCB0aGUgaXNNb2RpZmllZCBmbGFnXG4gICAgdGhpcy5faXNNb2RpZmllZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaGVscGVyIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGFueSBsb2NhbCB1cGRhdGUgdG8gdGhpcy5jdXJyZW50U2V0dGluZ3MuXG4gICAqIENoZWNrcyBpZiBhIGN1cnJlbnQgc2F2ZSBjYWxsIGlzIHN0aWxsIGluIHByb2dyZXNzIGFuZCB0aHJvd3MgYW4gZXJyb3IgaWYgc28uXG4gICAqL1xuICBwcml2YXRlIHZlcmlmeVNldHRpbmdzQXJlVW5sb2NrZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3NhdmVJblByb2dyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuU2V0dGluZ1NhdmVJblByb2dyZXNzLCBTZXR0aW5nc0ltcGwuQVNZTkNfU0FWRV9JTl9QUk9HUkVTUyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjb25zdCBUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgQm9vayc7XG5leHBvcnQgY29uc3QgVGFibGVhdUxpZ2h0Rm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBMaWdodCc7XG5leHBvcnQgY29uc3QgVGFibGVhdVJlZ3VsYXJGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IFJlZ3VsYXInO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVNZWRpdW1Gb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IE1lZGl1bSc7XG5leHBvcnQgY29uc3QgVGFibGVhdVNlbWlib2xkRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBTZW1pYm9sZCc7XG5leHBvcnQgY29uc3QgVGFibGVhdUJvbGRGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IEJvbGQnO1xuXG5leHBvcnQgY29uc3QgVGFibGVhdUJvb2tGb250RmFjZU5hbWUgPSAnVGFibGVhdSBCb29rJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1Qm9sZEZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IEJvbGQnO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVMaWdodEZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IExpZ2h0JztcbmV4cG9ydCBjb25zdCBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgTWVkaXVtJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1UmVndWxhckZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IFJlZ3VsYXInO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVTZW1pQm9sZEZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IFNlbWkgQm9sZCc7XG5cbmV4cG9ydCBjb25zdCBTdXBwb3J0ZWRUYWJsZWF1Rm9udEZhY2VzOiBNb2RlbFtdID0gW1xuICBUYWJsZWF1Qm9va0ZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVMaWdodEZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdU1lZGl1bUZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdVJlZ3VsYXJGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVTZW1pQm9sZEZvbnRGYWNlTmFtZSxcbl07XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRW1iZWRkaW5nRXJyb3JDb2RlcywgRXJyb3JDb2RlcywgU2hhcmVkRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEaWFsb2dNZXNzYWdlRXZlbnQgYXMgRGlhbG9nTWVzc2FnZUV2ZW50Q29udHJhY3QsIERpYWxvZ1VwZGF0ZUV2ZW50LCBOb3RpZmljYXRpb25JZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnksXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIFNlcnZpY2VOYW1lcyxcbiAgU2luZ2xlRXZlbnRNYW5hZ2VyLFxuICBTaW5nbGVFdmVudE1hbmFnZXJJbXBsLFxuICBUYWJsZWF1RXJyb3IsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1RhYmxlYXVFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvVUlTZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIERpYWxvZ01lc3NhZ2VFdmVudCBleHRlbmRzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LkRpYWxvZ01lc3NhZ2VFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBzb3VyY2VEaWFsb2dVcmw/OiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuRGlhbG9nTWVzc2FnZVJlY2VpdmVkKTtcbiAgfVxufVxuXG4vKipcbiAqIEN1c3RvbSBlcnJvciBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIFRhYmxlYXVFcnJvciBvYmplY3QuXG4gKiBJbmNsdWRlcyBjb250ZXh0IGZvciB3aGljaCBkaWFsb2cgY2F1c2VkIHRoZSBleGNlcHRpb24gdmlhIGl0cyB1cmwuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZWF1RGlhbG9nRXJyb3IgZXh0ZW5kcyBUYWJsZWF1RXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IoX2Vycm9yQ29kZTogRXJyb3JDb2RlcyB8IEVtYmVkZGluZ0Vycm9yQ29kZXMgfCBTaGFyZWRFcnJvckNvZGVzLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihfZXJyb3JDb2RlLCBtZXNzYWdlKTtcblxuICAgIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYXN0ZXIvQnJlYWtpbmctQ2hhbmdlcy5tZCNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmtcbiAgICAvLyBFcnJvciBpbmhlcml0YW5jZSBkb2VzIG5vdCB3b3JrIHByb3BlcnRseSB3aGVuIGNvbXBpbGluZyB0byBFUzUsIHRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIGZvcmNlXG4gICAgLy8gdGhlIHByb3RvIGNoYWluIHRvIGJlIGJ1aWx0IGNvcnJlY3RseS4gIFNlZSB0aGUgZ2l0aHViIGxpbmsgYWJvdmUgZm9yIGRldGFpbHMuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFRhYmxlYXVEaWFsb2dFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVSUltcGwge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuKSB7fVxuXG4gIHB1YmxpYyBkaXNwbGF5RGlhbG9nQXN5bmModXJsOiBzdHJpbmcsIHBheWxvYWQ/OiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5EaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB1aVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFVJU2VydmljZT4oRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5VSVNlcnZpY2UpO1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFxuICAgICAgU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbixcbiAgICApO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVpU2VydmljZVxuICAgICAgICAuZGlzcGxheURpYWxvZ0FzeW5jKHVybCwgcGF5bG9hZCB8fCAnJywgdGhpcy5pc0V4dGVuc2lvbkRpYWxvZywgb3B0aW9ucylcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVucmVnaXN0ZXJGbiA9IG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgICAgICAgTm90aWZpY2F0aW9uSWQuRXh0ZW5zaW9uRGlhbG9nVXBkYXRlLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBMZXQgdGhyb3VnaCBhbnkgZGlhbG9nIHVwZGF0ZSBldmVudFxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXZlbnQ6IERpYWxvZ1VwZGF0ZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChldmVudC5pc0Nsb3NlRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY2xvc2VQYXlsb2FkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RGlhbG9nRXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnY2xvc2VQYXlsb2FkIGlzIHVuZGVmaW5lZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50LmNsb3NlUGF5bG9hZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBUYWJsZWF1RGlhbG9nRXJyb3IoRXJyb3JDb2Rlcy5EaWFsb2dDbG9zZWRCeVVzZXIsICdFeHRlbnNpb24gZGlhbG9nIGNsb3NlZCBieSB1c2VyLicpKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHVucmVnaXN0ZXJGbigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VuZERpYWxvZ01lc3NhZ2VBc3luYyhtZXNzYWdlOiBzdHJpbmcsIHRhcmdldERpYWxvZ1VybD86IHN0cmluZykge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG5cbiAgICB1aVNlcnZpY2Uuc2VuZERpYWxvZ01lc3NhZ2VBc3luYyhtZXNzYWdlLCB0YXJnZXREaWFsb2dVcmwpO1xuICB9XG5cbiAgcHVibGljIHNlbmREaWFsb2dNZXNzYWdlVG9QYXJlbnRBc3luYyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuaXNFeHRlbnNpb25EaWFsb2cpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnc2VuZERpYWxvZ01lc3NhZ2VUb1BhcmVudEFzeW5jIGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIGFuIGV4dGVuc2lvbiBkaWFsb2cuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcblxuICAgIHVpU2VydmljZS5zZW5kRGlhbG9nTWVzc2FnZVRvUGFyZW50QXN5bmMobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VEaWFsb2cocGF5bG9hZD86IHN0cmluZywgZGlhbG9nVXJsPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcblxuICAgIHVpU2VydmljZS5jbG9zZURpYWxvZyhwYXlsb2FkLCBkaWFsb2dVcmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGFsbCBldmVudHMgcmVsZXZhbnQgdG8gVUkgb2JqZWN0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyLlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemVFdmVudHMoKTogQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+KCk7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2U7XG5cbiAgICB0cnkge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIHNlcnZpY2UgcmVnaXN0ZXJlZCwganVzdCByZXR1cm5cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IGRpYWxvZ01lc3NhZ2VFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPENvbnRyYWN0LkRpYWxvZ01lc3NhZ2VFdmVudD4oQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5EaWFsb2dNZXNzYWdlUmVjZWl2ZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuRXh0ZW5zaW9uRGlhbG9nTWVzc2FnZSxcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXZlbnQ6IERpYWxvZ01lc3NhZ2VFdmVudENvbnRyYWN0KSA9PiB7XG4gICAgICAgIGRpYWxvZ01lc3NhZ2VFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IERpYWxvZ01lc3NhZ2VFdmVudChldmVudC5tZXNzYWdlLCBldmVudC5zb3VyY2VEaWFsb2dVcmwpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChkaWFsb2dNZXNzYWdlRXZlbnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzLCBUYWJsZWF1RXZlbnRUeXBlLCBXb3JrYm9va0Zvcm1hdHRpbmcgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkTGF5b3V0RXZlbnQsIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRGFzaGJvYXJkSW1wbCxcbiAgRGFzaGJvYXJkT2JqZWN0SW1wbCxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFdvcmtzaGVldEltcGwsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL0Rhc2hib2FyZExheW91dENoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3QgfSBmcm9tICcuL0Rhc2hib2FyZE9iamVjdCc7XG5pbXBvcnQgeyBTaGVldCB9IGZyb20gJy4vU2hlZXQnO1xuaW1wb3J0IHsgV29ya3NoZWV0IH0gZnJvbSAnLi9Xb3Jrc2hlZXQnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkIGV4dGVuZHMgU2hlZXQgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGFzaGJvYXJkSW1wbDogRGFzaGJvYXJkSW1wbCkge1xuICAgIHN1cGVyKF9kYXNoYm9hcmRJbXBsKTtcbiAgICBfZGFzaGJvYXJkSW1wbC5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoKTtcbiAgICB0aGlzLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldHMoKTogQXJyYXk8Q29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwud29ya3NoZWV0c0ltcGwubWFwKCh3b3Jrc2hlZXRJbXBsOiBXb3Jrc2hlZXRJbXBsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFdvcmtzaGVldCh3b3Jrc2hlZXRJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb2JqZWN0cygpOiBBcnJheTxDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmRPYmplY3Q+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5vYmplY3RzLm1hcCgoZGFzaGJvYXJkT2JqZWN0SW1wbDogRGFzaGJvYXJkT2JqZWN0SW1wbCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBEYXNoYm9hcmRPYmplY3QoZGFzaGJvYXJkT2JqZWN0SW1wbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZURhc2hib2FyZE9iamVjdElkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZURhc2hib2FyZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5hY3RpdmVEYXNoYm9hcmROYW1lO1xuICB9XG5cbiAgcHVibGljIHNldFpvbmVWaXNpYmlsaXR5QXN5bmMoem9uZVZpc2liaWxpdHlNYXA6IENvbnRyYWN0LlpvbmVWaXNpYmlsaXR5TWFwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuc2V0RGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eUFzeW5jKHpvbmVWaXNpYmlsaXR5TWFwKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXREYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5QXN5bmMoZGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcDogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLnNldERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlBc3luYyhkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXNoYm9hcmRPYmplY3RCeUlkKGRhc2hib2FyZE9iamVjdElkOiBudW1iZXIpOiBEYXNoYm9hcmRPYmplY3QgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHpvbmUgPSB0aGlzLl9kYXNoYm9hcmRJbXBsLmdldERhc2hib2FyZE9iamVjdEJ5SWQoZGFzaGJvYXJkT2JqZWN0SWQpO1xuICAgIHJldHVybiB6b25lICYmIG5ldyBEYXNoYm9hcmRPYmplY3Qoem9uZSk7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cygpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcblxuICAgIC8vIEluaXRpYWxpemluZyBldmVudHMgYW5kIHJlZ2lzdGVyaW5nIG5vdGlmaWNhdGlvbiBzZXJ2aWNlXG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2U7XG5cbiAgICB0cnkge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIHNlcnZpY2UgcmVnaXN0ZXJlZCwganVzdCByZXR1cm4gKGFsbG93cyB1bml0IHRlc3Rpbmcgd2l0aG91dCBOb3RpZmljYXRpb25TZXJ2aWNlIG1vY2spXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBkYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxEYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudDogRGFzaGJvYXJkTGF5b3V0RXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZGFzaGJvYXJkT2JqZWN0Q2hhbmdlczogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyA9IHRoaXMuX2Rhc2hib2FyZEltcGwudXBkYXRlWm9uZXMoXG4gICAgICAgICAgZXZlbnQuem9uZXMsXG4gICAgICAgICAgZXZlbnQuYWN0aXZlWm9uZUlkLFxuICAgICAgICAgIGV2ZW50LmFjdGl2ZURhc2hib2FyZE5hbWUsXG4gICAgICAgICk7XG4gICAgICAgIGRhc2hib2FyZExheW91dENoYW5nZWRFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IERhc2hib2FyZExheW91dENoYW5nZWRFdmVudChkYXNoYm9hcmRPYmplY3RDaGFuZ2VzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2goZGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50KTtcblxuICAgIGNvbnN0IHdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudD4oXG4gICAgICBUYWJsZWF1RXZlbnRUeXBlLldvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQsXG4gICAgKTtcblxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXZlbnRGb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmcpID0+IHtcbiAgICAgICAgd29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50KGV2ZW50Rm9ybWF0dGluZykpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKHdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlQW5kUmVzaXplRGFzaGJvYXJkT2JqZWN0c0FzeW5jKFxuICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwubW92ZUFuZFJlc2l6ZURhc2hib2FyZE9iamVjdHNBc3luYyhkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSk7XG4gIH1cblxuICBwdWJsaWMgcmVwbGF5QW5pbWF0aW9uQXN5bmMocmVwbGF5U3BlZWQ6IENvbnRyYWN0LlJlcGxheVNwZWVkVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLnJlcGxheUFuaW1hdGlvbkFzeW5jKHJlcGxheVNwZWVkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuZ2V0RmlsdGVyc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLmFwcGx5RmlsdGVyQXN5bmMoZmllbGROYW1lLCB2YWx1ZXMsIHVwZGF0ZVR5cGUsIG9wdGlvbnMpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi9EYXNoYm9hcmQnO1xuaW1wb3J0IHsgV29ya3NoZWV0IH0gZnJvbSAnLi9Xb3Jrc2hlZXQnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkYXNoYm9hcmQgb2JqZWN0cyAtIHRoZSB6b25lcyBpbiBhIGRhc2hib2FyZC5cbiAqL1xuZXhwb3J0IGNsYXNzIERhc2hib2FyZE9iamVjdCBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZE9iamVjdCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXNoYm9hcmRPYmplY3RJbXBsOiBEYXNoYm9hcmRPYmplY3RJbXBsKSB7fVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkKCk6IENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gICAgcmV0dXJuIG5ldyBEYXNoYm9hcmQodGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5kYXNoYm9hcmRJbXBsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC50eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBwb3NpdGlvbigpOiBDb250cmFjdC5Qb2ludCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwucG9zaXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuc2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwud29ya3NoZWV0SW1wbCkge1xuICAgICAgcmV0dXJuIG5ldyBXb3Jrc2hlZXQodGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC53b3Jrc2hlZXRJbXBsKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRmxvYXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuaXNGbG9hdGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmlzVmlzaWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmZpZWxkSWQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25JZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnksXG4gIEVycm9ySGVscGVycyxcbiAgRXZlbnRMaXN0ZW5lck1hbmFnZXIsXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIFBhcmFtZXRlckltcGwsXG4gIFNlcnZpY2VOYW1lcyxcbiAgU2luZ2xlRXZlbnRNYW5hZ2VyLFxuICBTaW5nbGVFdmVudE1hbmFnZXJJbXBsLFxufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFBhcmFtZXRlckNoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9QYXJhbWV0ZXJDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgUGFyYW1ldGVyIGNvbnRyYWN0LiBDYWxscyBkb3duIHRvIHRoZSBpbXBsXG4gKiBjbGFzcyBmb3IgYWxtb3N0IGFsbCBvZiB0aGUgd29yayBpdCBkb2VzLlxuICovXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBDb250cmFjdC5QYXJhbWV0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJhbWV0ZXJJbXBsOiBQYXJhbWV0ZXJJbXBsLFxuICAgIHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCxcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEluaXRpYWxpemUgb3VyIGV2ZW50IGhhbmRsaW5nIGZvciB0aGlzIGNsYXNzXG4gICAgdGhpcy5pbml0aWFsaXplRXZlbnRzKHNoZWV0KS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1cnJlbnRWYWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuY3VycmVudFZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBDb250cmFjdC5EYXRhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5kYXRhVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxsb3dhYmxlVmFsdWVzKCk6IENvbnRyYWN0LlBhcmFtZXRlckRvbWFpblJlc3RyaWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmFsbG93YWJsZVZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVZhbHVlQXN5bmMobmV3VmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmNoYW5nZVZhbHVlQXN5bmMobmV3VmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2Qgd2hpY2ggZ29lcyB0aHJvdWdoIGFuZCByZWdpc3RlcnMgZWFjaCBldmVudCB0eXBlIHRoaXMgaW1wbCBrbm93cyBhYm91dFxuICAgKiB3aXRoIHRoZSBOb3RpZmljYXRpb25TZXJ2aWNlLiBJdCByZXR1cm5zIGFuIGFycmF5IG9mIFNpbmdsZUV2ZW50TWFuYWdlciBvYmplY3RzIHdoaWNoXG4gICAqIGNhbiB0aGVuIGJlIHBhc3NlZCB0byBhbiBFdmVudExpc3RlbmVyTWFuYWdlciB0byBoYW5kbGUgdXNlciByZWdpc3RyYXRpb24gLyB1bnJlZ2lzdHJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHNoZWV0IFRoZSBzaGVldCBvYmplY3Qgd2hpY2ggd2lsbCBiZSBpbmNsdWRlZCB3aXRoIHRoZSBldmVudCBub3RpZmljYXRpb25zXG4gICAqIEByZXR1cm5zIHtBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+fSBDb2xsZWN0aW9uIG9mIGV2ZW50IG1hbmFnZXJzIHRvIHBhc3MgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXJcbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlJbnRlcm5hbFZhbHVlKHNoZWV0LCAnc2hlZXQnKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIGFsbCBvZiB0aGUgZXZlbnQgbWFuYWdlcnMgd2UnbGwgbmVlZCAob25lIGZvciBlYWNoIGV2ZW50IHR5cGUpXG4gICAgY29uc3QgcGFyYW1ldGVyRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQ+KENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuUGFyYW1ldGVyQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5QYXJhbWV0ZXJDaGFuZ2VkLFxuICAgICAgKG1vZGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IG1vZGVsIGFzIHN0cmluZztcbiAgICAgICAgcmV0dXJuIGZpZWxkTmFtZSA9PT0gdGhpcy5wYXJhbWV0ZXJJbXBsLmlkO1xuICAgICAgfSxcbiAgICAgIChmaWVsZE5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBwYXJhbWV0ZXJFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IFBhcmFtZXRlckNoYW5nZWRFdmVudChmaWVsZE5hbWUsIHNoZWV0KSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2gocGFyYW1ldGVyRXZlbnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciwgU2hlZXRJbXBsLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFBhcmFtZXRlciB9IGZyb20gJy4vUGFyYW1ldGVyJztcblxuZXhwb3J0IGNsYXNzIFNoZWV0IGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25TaGVldCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zaGVldEltcGw6IFNoZWV0SW1wbCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0VHlwZSgpOiBDb250cmFjdC5TaGVldFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwuc2hlZXRUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBzaXplKCk6IENvbnRyYWN0LlNpemUge1xuICAgIGlmICh0aGlzLmlzVmFsaWRTaXplKHRoaXMuX3NoZWV0SW1wbC5zaXplKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5zaXplO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCAnU2l6ZSBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZFNpemUoc2l6ZTogYW55KTogc2l6ZSBpcyBDb250cmFjdC5TaXplIHtcbiAgICBjb25zdCB0ZXN0U2l6ZSA9IHNpemUgYXMgQ29udHJhY3QuU2l6ZTtcbiAgICBpZiAodGVzdFNpemUud2lkdGggIT09IHVuZGVmaW5lZCAmJiB0ZXN0U2l6ZS5oZWlnaHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGZpbmRQYXJhbWV0ZXJBc3luYyhwYXJhbWV0ZXJOYW1lOiBzdHJpbmcpOiBQcm9taXNlPENvbnRyYWN0LlBhcmFtZXRlciB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwuZmluZFBhcmFtZXRlckFzeW5jKHBhcmFtZXRlck5hbWUpLnRoZW4oKHBhcmFtZXRlckltcGwpID0+IHtcbiAgICAgIGlmIChwYXJhbWV0ZXJJbXBsKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXI+KChyZXNvbHZlKSA9PiByZXNvbHZlKG5ldyBQYXJhbWV0ZXIocGFyYW1ldGVySW1wbCwgdGhpcykpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx1bmRlZmluZWQ+KChyZXNvbHZlKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmFtZXRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlBhcmFtZXRlcj4+IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLmdldFBhcmFtZXRlcnNBc3luYygpLnRoZW4oKHBhcmFtZXRlcnNJbXBsKSA9PiB7XG4gICAgICByZXR1cm4gcGFyYW1ldGVyc0ltcGwubWFwKChwYXJhbWV0ZXJJbXBsKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25Xb3JrYm9va0ltcGwgfSBmcm9tICcuLi9JbXBsL0V4dGVuc2lvbldvcmtib29rSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBXb3JrYm9vayBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbldvcmtib29rIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3dvcmtib29rSW1wbDogRXh0ZW5zaW9uV29ya2Jvb2tJbXBsKSB7fVxuXG4gIHB1YmxpYyBnZXRBbGxEYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya2Jvb2tJbXBsLmdldEFsbERhdGFTb3VyY2VzQXN5bmMoKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIENvbHVtbixcbiAgRmlsdGVyVXBkYXRlVHlwZSxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgVGFibGVhdUV2ZW50VHlwZSxcbiAgVG9vbHRpcENvbnRleHQsXG4gIFdvcmtzaGVldEZvcm1hdHRpbmcsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBGaWx0ZXJFdmVudCwgTm90aWZpY2F0aW9uSWQsIFN1bW1hcnlEYXRhRXZlbnQsIFZpc3VhbElkLCBXb3Jrc2hlZXRGb3JtYXR0aW5nRXZlbnQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgVGFibGVhdUVycm9yLFxuICBXb3Jrc2hlZXRJbXBsLFxufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEZpbHRlckNoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9GaWx0ZXJDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgTWFya3NTZWxlY3RlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL01hcmtzU2VsZWN0ZWRFdmVudCc7XG5pbXBvcnQgeyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9TdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1dvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IERhc2hib2FyZCB9IGZyb20gJy4vRGFzaGJvYXJkJztcbmltcG9ydCB7IFNoZWV0IH0gZnJvbSAnLi9TaGVldCc7XG5cbmV4cG9ydCBjbGFzcyBXb3Jrc2hlZXQgZXh0ZW5kcyBTaGVldCBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX3dvcmtzaGVldEltcGw6IFdvcmtzaGVldEltcGwpIHtcbiAgICBzdXBlcihfd29ya3NoZWV0SW1wbCk7XG5cbiAgICAvLyBDYWxsIHRvIGluaXRpYWxpemUgZXZlbnRzIGFuZCB0aGVuIGNhbGwgZG93biB0byB0aGUgZXZlbnQgbGlzdGVuZXIgbWFuYWdlciB0byBoYW5kbGUgdGhpbmdzXG4gICAgdGhpcy5pbml0aWFsaXplRXZlbnRzKCkuZm9yRWFjaCgoZSkgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnREYXNoYm9hcmQoKTogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkIHtcbiAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gZm9yIEV4dGVuc2lvbnMgaWYgdGhlIERhc2hib2FyZEltcGxzIGFyZSBjcmVhdGVkIGNvcnJlY3RseVxuICAgIGlmICh0aGlzLl93b3Jrc2hlZXRJbXBsLnBhcmVudERhc2hib2FyZCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYFBhcmVudCBkYXNoYm9hcmQgbm90IGltcGxlbWVudGVkYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEYXNoYm9hcmQodGhpcy5fd29ya3NoZWV0SW1wbC5wYXJlbnREYXNoYm9hcmQpO1xuICB9XG5cbiAgcHVibGljIGdldCBiYWNrZ3JvdW5kQ29sb3IoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fd29ya3NoZWV0SW1wbC5iYWNrZ3JvdW5kQ29sb3IgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBXb3Jrc2hlZXQgYmFja2dyb3VuZCBjb2xvciBpcyBub3QgYXZhaWxhYmxlYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYmFja2dyb3VuZENvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0aW5nKCk6IFdvcmtzaGVldEZvcm1hdHRpbmcge1xuICAgIGlmICh0aGlzLl93b3Jrc2hlZXRJbXBsLmZvcm1hdHRpbmcgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBXb3Jrc2hlZXQgZm9ybWF0dGluZyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZm9ybWF0dGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHdoaWNoIGdvZXMgdGhyb3VnaCBhbmQgcmVnaXN0ZXJzIGVhY2ggZXZlbnQgdHlwZSB0aGlzIGltcGwga25vd3MgYWJvdXRcbiAgICogd2l0aCB0aGUgTm90aWZpY2F0aW9uU2VydmljZS4gSXQgcmV0dXJucyBhbiBhcnJheSBvZiBTaW5nbGVFdmVudE1hbmFnZXIgb2JqZWN0cyB3aGljaFxuICAgKiBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXIgdG8gaGFuZGxlIHVzZXIgcmVnaXN0cmF0aW9uIC8gdW5yZWdpc3RyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7V29ya3NoZWV0fSB3b3Jrc2hlZXQgVGhlIHdvcmtzaGVldCBvYmplY3Qgd2hpY2ggd2lsbCBiZSBpbmNsdWRlZCB3aXRoIHRoZSBldmVudCBub3RpZmljYXRpb25zXG4gICAqIEByZXR1cm5zIHtBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+fSBDb2xsZWN0aW9uIG9mIGV2ZW50IG1hbmFnZXJzIHRvIHBhc3MgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXJcbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIGFsbCBvZiB0aGUgZXZlbnQgbWFuYWdlcnMgd2UnbGwgbmVlZCAob25lIGZvciBlYWNoIGV2ZW50IHR5cGUpXG4gICAgY29uc3QgbWFya3NFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPE1hcmtzU2VsZWN0ZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5NYXJrU2VsZWN0aW9uQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5TZWxlY3RlZE1hcmtzQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCB2aXN1YWxJZCA9IG1vZGVsIGFzIFZpc3VhbElkO1xuICAgICAgICByZXR1cm4gdGhpcy52aXN1YWxJZHNBcmVFcXVhbCh2aXN1YWxJZCwgdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZCk7XG4gICAgICB9LFxuICAgICAgKCkgPT4gbWFya3NFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IE1hcmtzU2VsZWN0ZWRFdmVudCh0aGlzKSksXG4gICAgKTtcblxuICAgIGNvbnN0IGZpbHRlckV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8RmlsdGVyQ2hhbmdlZEV2ZW50PihUYWJsZWF1RXZlbnRUeXBlLkZpbHRlckNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuRmlsdGVyQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJFdmVudFJlc3BvbnNlID0gbW9kZWwgYXMgRmlsdGVyRXZlbnQ7XG4gICAgICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnZpc3VhbElkLndvcmtzaGVldCA9PT0gZmlsdGVyRXZlbnRSZXNwb25zZS52aXN1YWxJZC53b3Jrc2hlZXQ7XG4gICAgICB9LFxuICAgICAgKGV2ZW50OiBGaWx0ZXJFdmVudCkgPT4ge1xuICAgICAgICBmaWx0ZXJFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IEZpbHRlckNoYW5nZWRFdmVudCh0aGlzLCBldmVudC5maWVsZE5hbWUsIGV2ZW50LmZpZWxkSWQpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IHN1bW1hcnlEYXRhRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5TdW1tYXJ5RGF0YUNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuU3VtbWFyeURhdGFDaGFuZ2VkLFxuICAgICAgKG1vZGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IHN1bW1hcnlEYXRhRXZlbnRSZXNwb25zZSA9IG1vZGVsIGFzIFN1bW1hcnlEYXRhRXZlbnQ7XG4gICAgICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnZpc3VhbElkLndvcmtzaGVldCA9PT0gc3VtbWFyeURhdGFFdmVudFJlc3BvbnNlLnZpc3VhbElkLndvcmtzaGVldDtcbiAgICAgIH0sXG4gICAgICAoZXZlbnQ6IFN1bW1hcnlEYXRhRXZlbnQpID0+IHtcbiAgICAgICAgc3VtbWFyeURhdGFFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IFN1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50KHRoaXMpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IHdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxXb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50PihcbiAgICAgIFRhYmxlYXVFdmVudFR5cGUuV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWQsXG4gICAgKTtcblxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3Qgd29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCA9IG1vZGVsIGFzIFdvcmtzaGVldEZvcm1hdHRpbmdFdmVudDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwudmlzdWFsSWQud29ya3NoZWV0ID09PSB3b3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50LnZpc3VhbElkLndvcmtzaGVldDtcbiAgICAgIH0sXG4gICAgICAoZXZlbnRGb3JtYXR0aW5nOiBXb3Jrc2hlZXRGb3JtYXR0aW5nKSA9PiB7XG4gICAgICAgIHdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBXb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50KHRoaXMsIGV2ZW50Rm9ybWF0dGluZykpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKG1hcmtzRXZlbnQpO1xuICAgIHJlc3VsdHMucHVzaChmaWx0ZXJFdmVudCk7XG4gICAgcmVzdWx0cy5wdXNoKHN1bW1hcnlEYXRhRXZlbnQpO1xuICAgIHJlc3VsdHMucHVzaCh3b3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IEZpbHRlclVwZGF0ZVR5cGUsXG4gICAgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseUZpbHRlckFzeW5jKGZpZWxkTmFtZSwgdmFsdWVzLCB1cGRhdGVUeXBlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJhbmdlRmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcsIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LlJhbmdlRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZSwgZmlsdGVyT3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMoZmllbGROYW1lLCB2YWx1ZXMsIHVwZGF0ZVR5cGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcsIG9wdGlvbnM6IENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmMoZmllbGROYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5jbGVhckZpbHRlckFzeW5jKGZpZWxkTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0RGF0YVNvdXJjZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRGaWx0ZXJzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRIaWdobGlnaHRlZE1hcmtzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdW1tYXJ5RGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFN1bW1hcnlEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U3VtbWFyeURhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKHBhZ2VSb3dDb3VudDogbnVtYmVyLCBvcHRpb25zOiBDb250cmFjdC5HZXRTdW1tYXJ5RGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMocGFnZVJvd0NvdW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYygpOiBQcm9taXNlPEFycmF5PENvbHVtbj4+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnV29ya3NoZWV0LmdldFVuZGVybHlpbmdEYXRhQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSAnICtcbiAgICAgICAgJ1dvcmtzaGVldC5nZXRVbmRlcmx5aW5nVGFibGVzQXN5bmMgYW5kIFdvcmtzaGVldC5nZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMnLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBvcHRpb25zOiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMsXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKGxvZ2ljYWxUYWJsZUlkLCBwYWdlUm93Q291bnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldFZpc3VhbFNwZWNpZmljYXRpb25Bc3luYygpOiBQcm9taXNlPENvbnRyYWN0LlZpc3VhbFNwZWNpZmljYXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIGNvbHVtbnM6IHN0cmluZ1tdLFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYWRkTWFya3NDYXJkRmllbGRzQXN5bmMobWFya3NDYXJkSW5kZXgsIGVuY29kaW5nVHlwZSwgY29sdW1ucywgc3RhcnRJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgbW92ZU1hcmtzQ2FyZEZpZWxkQXN5bmMobWFya3NDYXJkSW5kZXg6IG51bWJlciwgZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlciwgZmllbGRDb3VudCA9IDEpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5tb3ZlTWFya3NDYXJkRmllbGRBc3luYyhtYXJrc0NhcmRJbmRleCwgZnJvbUluZGV4LCB0b0luZGV4LCBmaWVsZENvdW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICBkZWxldGVDb3VudDogbnVtYmVyLFxuICAgIGNvbHVtbnM6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhtYXJrc0NhcmRJbmRleCwgZW5jb2RpbmdUeXBlLCBzdGFydEluZGV4LCBkZWxldGVDb3VudCwgY29sdW1ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SURBc3luYyhtYXJrc0luZm86IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiwgdXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnNlbGVjdE1hcmtzQnlJZEFzeW5jKG1hcmtzSW5mbywgdXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+LCBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LCBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgYW5ub3RhdGVNYXJrQXN5bmMobWFyazogQ29udHJhY3QuTWFya0luZm8sIGFubm90YXRpb25UZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hbm5vdGF0ZU1hcmtBc3luYyhtYXJrLCBhbm5vdGF0aW9uVGV4dCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QW5ub3RhdGlvbnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0QW5ub3RhdGlvbnNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFubm90YXRpb25Bc3luYyhhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwucmVtb3ZlQW5ub3RhdGlvbkFzeW5jKGFubm90YXRpb24pO1xuICB9XG5cbiAgcHVibGljIGhvdmVyVHVwbGVBc3luYyhob3ZlcmVkVHVwbGU/OiBudW1iZXIsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCB8IG51bGwsIGFsbG93SG92ZXJBY3Rpb25zID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmhvdmVyVHVwbGVBc3luYyhob3ZlcmVkVHVwbGUsIHRvb2x0aXAsIGFsbG93SG92ZXJBY3Rpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RUdXBsZXNBc3luYyhzZWxlY3RlZFR1cGxlczogQXJyYXk8bnVtYmVyPiwgc2VsZWN0T3B0aW9uOiBDb250cmFjdC5TZWxlY3RPcHRpb25zLCB0b29sdGlwPzogVG9vbHRpcENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RUdXBsZXNBc3luYyhzZWxlY3RlZFR1cGxlcywgc2VsZWN0T3B0aW9uLCB0b29sdGlwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb29sdGlwVGV4dEFzeW5jKHR1cGxlSWQ6IG51bWJlcik6IFByb21pc2U8U3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VG9vbHRpcFRleHRBc3luYyh0dXBsZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwubGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZWRpdEFsaWFzZXNEaWFsb2dBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmVkaXRBbGlhc2VzRGlhbG9nQXN5bmMoZmllbGROYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzdWFsSWRzQXJlRXF1YWwoYTogVmlzdWFsSWQsIGI6IFZpc3VhbElkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGEgJiZcbiAgICAgIGIgJiZcbiAgICAgIGEud29ya3NoZWV0ID09PSBiLndvcmtzaGVldCAmJlxuICAgICAgYS5kYXNoYm9hcmQgPT09IGIuZGFzaGJvYXJkICYmXG4gICAgICBhLnN0b3J5Ym9hcmQgPT09IGIuc3Rvcnlib2FyZCAmJlxuICAgICAgYS5zdG9yeVBvaW50SUQgPT09IGIuc3RvcnlQb2ludElEXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgRGFzaGJvYXJkQ29udGVudCBuYW1lc3BhY2UuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIERhc2hib2FyZENvbnRlbnQgaXNcbiAqIGN1cnJlbnRseSBqdXN0IGEgKHNpbmdsZSkgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkQ29udGVudCBpbXBsZW1lbnRzIENvbnRyYWN0LkRhc2hib2FyZENvbnRlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGFzaGJvYXJkOiBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQpIHt9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmQoKTogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uRW52aXJvbm1lbnQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpVmVyc2lvbiwgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIGFzIEVudW1NYXBwaW5ncyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGVkU2VydmVyIH0gZnJvbSAnLi4vSW1wbC9Db25uZWN0ZWRTZXJ2ZXInO1xuaW1wb3J0IHsgV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCB9IGZyb20gJy4vV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIGVudmlyb25tZW50IG5hbWVzcGFjZS5cbiAqIEVudmlyb25tZW50IGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzXG4gKiBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICogRmlyc3QgY2xhc3MgZXh0ZW5zaW9ucyBjYW4gZ2V0IHRvIENvbm5lY3RlZFNlcnZlciB3aXRoOiBlbnZpcm9ubWVudFsnY29ubmVjdGVkU2VydmVyJ11cbiAqL1xuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50IGltcGxlbWVudHMgQ29udHJhY3QuRW52aXJvbm1lbnQge1xuICAvKipUaGUgZm9sbG93aW5nIGlzIGFuIGluZGV4IHNpZ25hdHVyZS4gSXQgYWxsb3dzIHByb3BlcnRpZXMgdG8gYmUgYWNjZXNzZWQgYnkgbmFtZS5cbiAgICogVGhpcyBhbGxvd3MgdXMgdG8gYWRkIHByb3BlcnRpZXMgZHluYW1pY2FsbHkgKHNlZSB1c2FnZSBvZiB0aGlzLmNvbm5lY3RlZFNlcnZlciBiZWxvdykgd2l0aG91dCBUeXBlc2NyaXB0IGVycm9ycy5cbiAgICogVGhlIHJlYXNvbiB3ZSBkbyB0aGlzIGlzIHNvIHRoYXQgM3JkLXBhcnR5IGV4dGVuc2lvbiBkZXZlbG9wZXJzIGRvIG5vdCBzZWUgdGhlIGNvbm5lY3RlZFNlcnZlciBwcm9wZXJ0eVxuICAgKiB0aGF0IGlzIG9ubHkgYXZhaWxhYmxlIHRvIGZpcnN0IGNsYXNzIGV4dGVuc2lvbiBkZXZlbG9wZXJzLlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgaW5kZXggc2lnYXR1cmUgbmVlZHMgdG8gYmUgYSB1bmlvbiBvZiBhbGwgcHJvcGVydGllcyBpbiB0aGUgb2JqZWN0LCBzaW5jZSB3ZSBjb3VsZFxuICAgKiBhY2Nlc3MgYW55IHByb3BlcnR5IHVzaW5nIHRoZSBwcm9wZXJ0eSBpbmRleCBtZXRob2QuXG4gICAqL1xuICBbeDogc3RyaW5nXTogQ29ubmVjdGVkU2VydmVyIHwgc3RyaW5nIHwgQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHwgc3RyaW5nW10gfCBib29sZWFuIHwgdW5kZWZpbmVkIHwgQ29udHJhY3QuRXhwb3J0ZWRNZWRpYVR5cGU7XG4gIHByaXZhdGUgX2FwaVZlcnNpb246IHN0cmluZztcbiAgcHJpdmF0ZSBfY29udGV4dDogQ29udHJhY3QuRXh0ZW5zaW9uQ29udGV4dDtcbiAgcHJpdmF0ZSBfZm9ybWF0dGluZz86IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZztcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2U6IHN0cmluZztcbiAgcHJpdmF0ZSBfY291bnRyeT86IHN0cmluZztcbiAgcHJpdmF0ZSBfbG9jYWxlOiBzdHJpbmc7XG4gIHByaXZhdGUgX3dvcmtib29rTG9jYWxlOiBzdHJpbmc7XG4gIHByaXZhdGUgX21vZGU6IENvbnRyYWN0LkV4dGVuc2lvbk1vZGU7XG4gIHByaXZhdGUgX29wZXJhdGluZ1N5c3RlbTogc3RyaW5nO1xuICBwcml2YXRlIF90YWJsZWF1VmVyc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIF91bmlxdWVVc2VySWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2V4cG9ydGVkTWVkaWFUeXBlPzogQ29udHJhY3QuRXhwb3J0ZWRNZWRpYVR5cGU7XG4gIHByaXZhdGUgX2lzRXhwb3J0aW5nOiBib29sZWFuO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihleHRlbnNpb25FbnZpcm9ubWVudDogRXh0ZW5zaW9uRW52aXJvbm1lbnQpIHtcbiAgICB0aGlzLl9hcGlWZXJzaW9uID0gQXBpVmVyc2lvbi5JbnN0YW5jZSAmJiBBcGlWZXJzaW9uLkluc3RhbmNlLmZvcm1hdHRlZFZhbHVlOyAvLyBtYWoubWluLmZpeCAobm8gYnVpbGQpXG4gICAgdGhpcy5fY29udGV4dCA9IEVudW1NYXBwaW5ncy5leHRlbnNpb25Db250ZXh0LmNvbnZlcnQoZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ29udGV4dCk7XG4gICAgdGhpcy5faXNFeHBvcnRpbmcgPSBleHRlbnNpb25FbnZpcm9ubWVudC5pc0V4cG9ydGluZztcbiAgICB0aGlzLl9mb3JtYXR0aW5nID0gV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbC5jb252ZXJ0VG9Xb3JrYm9va0Zvcm1hdHRpbmcoZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKTtcbiAgICB0aGlzLl9sYW5ndWFnZSA9IGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkxhbmd1YWdlO1xuICAgIHRoaXMuX2NvdW50cnkgPSBleHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25Db3VudHJ5O1xuICAgIHRoaXMuX2xvY2FsZSA9IGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkxvY2FsZTtcbiAgICB0aGlzLl93b3JrYm9va0xvY2FsZSA9IGV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rTG9jYWxlO1xuICAgIHRoaXMuX21vZGUgPSBFbnVtTWFwcGluZ3MuZXh0ZW5zaW9uTW9kZS5jb252ZXJ0KGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbk1vZGUpO1xuICAgIHRoaXMuX29wZXJhdGluZ1N5c3RlbSA9IGV4dGVuc2lvbkVudmlyb25tZW50Lm9wZXJhdGluZ1N5c3RlbTtcbiAgICB0aGlzLl90YWJsZWF1VmVyc2lvbiA9IGV4dGVuc2lvbkVudmlyb25tZW50LnRhYmxlYXVWZXJzaW9uO1xuICAgIHRoaXMuX3VuaXF1ZVVzZXJJZCA9IGV4dGVuc2lvbkVudmlyb25tZW50LnVuaXF1ZVVzZXJJZDtcbiAgICB0aGlzLl9leHBvcnRlZE1lZGlhVHlwZSA9IGV4dGVuc2lvbkVudmlyb25tZW50LmV4cG9ydGVkTWVkaWFUeXBlXG4gICAgICA/IEVudW1NYXBwaW5ncy5leHBvcnRlZE1lZGlhVHlwZS5jb252ZXJ0KGV4dGVuc2lvbkVudmlyb25tZW50LmV4cG9ydGVkTWVkaWFUeXBlKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGEgdXNlcklkLCB0aGVuIHdlIGFyZSBhIGZpcnN0IGNsYXNzIGV4dGVuc2lvblxuICAgIGlmIChleHRlbnNpb25FbnZpcm9ubWVudC51c2VySWQpIHtcbiAgICAgIHRoaXMuY29ubmVjdGVkU2VydmVyID0gbmV3IENvbm5lY3RlZFNlcnZlcihcbiAgICAgICAgZXh0ZW5zaW9uRW52aXJvbm1lbnQudXNlcklkLFxuICAgICAgICBleHRlbnNpb25FbnZpcm9ubWVudC5zaXRlSWQsXG4gICAgICAgIGV4dGVuc2lvbkVudmlyb25tZW50LnNpdGVOYW1lc3BhY2UsXG4gICAgICAgIGV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rSWQsXG4gICAgICApO1xuXG4gICAgICB0aGlzLmZlYXR1cmVGbGFncyA9IGV4dGVuc2lvbkVudmlyb25tZW50LmZlYXR1cmVGbGFncztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaVZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYXBpVmVyc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29udGV4dCgpOiBDb250cmFjdC5FeHRlbnNpb25Db250ZXh0IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya2Jvb2tGb3JtYXR0aW5nKCk6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1hdHRpbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxhbmd1YWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlO1xuICB9XG5cbiAgcHVibGljIGdldCBjb3VudHJ5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvdW50cnk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtib29rTG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtib29rTG9jYWxlO1xuICB9XG5cbiAgcHVibGljIGdldCBtb2RlKCk6IENvbnRyYWN0LkV4dGVuc2lvbk1vZGUge1xuICAgIHJldHVybiB0aGlzLl9tb2RlO1xuICB9XG5cbiAgcHVibGljIGdldCBvcGVyYXRpbmdTeXN0ZW0oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0aW5nU3lzdGVtO1xuICB9XG5cbiAgcHVibGljIGdldCB0YWJsZWF1VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZWF1VmVyc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdW5pcXVlVXNlcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VuaXF1ZVVzZXJJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeHBvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRXhwb3J0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBleHBvcnRlZE1lZGlhVHlwZSgpOiBDb250cmFjdC5FeHBvcnRlZE1lZGlhVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2V4cG9ydGVkTWVkaWFUeXBlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ2FsbGJhY2tNYXAsIEV4dGVuc2lvbnNJbXBsIH0gZnJvbSAnLi4vSW1wbC9FeHRlbnNpb25zSW1wbCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIEV4dGVuc2lvbnMgbmFtZXNwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9ucyBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbnMge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBleHRlbnNpb25JbXBsOiBFeHRlbnNpb25zSW1wbCkge1xuICAgIHRoaXMuZXh0ZW5zaW9uSW1wbCA9IGV4dGVuc2lvbkltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZENvbnRlbnQoKTogQ29udHJhY3QuRGFzaGJvYXJkQ29udGVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5kYXNoYm9hcmRDb250ZW50O1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXRDb250ZW50KCk6IENvbnRyYWN0LldvcmtzaGVldENvbnRlbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwud29ya3NoZWV0Q29udGVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZW52aXJvbm1lbnQoKTogQ29udHJhY3QuRW52aXJvbm1lbnQge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuZW52aXJvbm1lbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNldHRpbmdzKCk6IENvbnRyYWN0LlNldHRpbmdzIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLnNldHRpbmdzO1xuICB9XG5cbiAgcHVibGljIGdldCB1aSgpOiBDb250cmFjdC5VSSB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC51aTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya2Jvb2soKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya2Jvb2sge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwud29ya2Jvb2s7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZE9iamVjdElkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5leHRlbnNpb25ab25lSWQ7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZUFzeW5jKGNvbnRleHRNZW51Q2FsbGJhY2tzPzogQ2FsbGJhY2tNYXApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmluaXRpYWxpemVBc3luYyhmYWxzZSwgY29udGV4dE1lbnVDYWxsYmFja3MpLnRoZW48dm9pZD4oKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplRGlhbG9nQXN5bmMoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmluaXRpYWxpemVBc3luYyh0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYzogb2JqZWN0KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmNyZWF0ZVZpekltYWdlQXN5bmMoaW5wdXRTcGVjKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDbGlja1Rocm91Z2hBc3luYyhjbGlja1Rocm91Z2hFbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5zZXRDbGlja1Rocm91Z2hBc3luYyhjbGlja1Rocm91Z2hFbmFibGVkKTtcbiAgfVxuXG4gIHB1YmxpYyByZXBvcnRFeHRlbnNpb25SZW5kZXJDb21wbGV0ZShtZWRpYUJsb2I/OiBBcnJheUJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwucmVwb3J0RXh0ZW5zaW9uUmVuZGVyQ29tcGxldGUobWVkaWFCbG9iKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2V0dGluZ3MgYXMgU2V0dGluZ3NDb250cmFjdCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgU2V0dGluZ3NJbXBsIH0gZnJvbSAnLi4vSW1wbC9TZXR0aW5nc0ltcGwnO1xuaW1wb3J0IHsgU2V0dGluZ3NDb2xsZWN0aW9uIH0gZnJvbSAnLi4vU2VydmljZXMvU2V0dGluZ3NTZXJ2aWNlJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgc2V0dGluZ3MgbmFtZXNwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ3MgZXh0ZW5kcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIFNldHRpbmdzQ29udHJhY3Qge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfc2V0dGluZ3NJbXBsOiBTZXR0aW5nc0ltcGwpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBvdXIgZXZlbnQgaGFuZGxpbmcgZm9yIHRoaXMgY2xhc3NcbiAgICB0aGlzLl9zZXR0aW5nc0ltcGwuaW5pdGlhbGl6ZUV2ZW50cygpLmZvckVhY2goKGUpID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBlcmFzZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3NldHRpbmdzSW1wbC5lcmFzZShrZXkpO1xuICB9XG5cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5nZXQoa2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGwoKTogU2V0dGluZ3NDb2xsZWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLmdldEFsbCgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc01vZGlmaWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuaXNNb2RpZmllZDtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQXN5bmMoKTogUHJvbWlzZTxTZXR0aW5nc0NvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLnNhdmVBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3NldHRpbmdzSW1wbC5zZXQoa2V5LCB2YWx1ZSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi4vSW1wbC9VSUltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBVSSBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBVSSBleHRlbmRzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgQ29udHJhY3QuVUkge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfaW1wbDogVUlJbXBsKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEluaXRpYWxpemUgb3VyIGV2ZW50IGhhbmRsaW5nIGZvciB0aGlzIGNsYXNzXG4gICAgdGhpcy5faW1wbC5pbml0aWFsaXplRXZlbnRzKCkuZm9yRWFjaCgoZSkgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGRpc3BsYXlEaWFsb2dBc3luYyh1cmw6IHN0cmluZywgcGF5bG9hZD86IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkRpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9pbXBsLmRpc3BsYXlEaWFsb2dBc3luYyh1cmwsIHBheWxvYWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZTogc3RyaW5nLCB0YXJnZXREaWFsb2dVcmw/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5faW1wbC5zZW5kRGlhbG9nTWVzc2FnZUFzeW5jKG1lc3NhZ2UsIHRhcmdldERpYWxvZ1VybCk7XG4gIH1cblxuICBwdWJsaWMgc2VuZERpYWxvZ01lc3NhZ2VUb1BhcmVudEFzeW5jKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9pbXBsLnNlbmREaWFsb2dNZXNzYWdlVG9QYXJlbnRBc3luYyhtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nLCBkaWFsb2dVcmw/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9pbXBsLmNsb3NlRGlhbG9nKHBheWxvYWQsIGRpYWxvZ1VybCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDbGFzc05hbWVLZXksIFdvcmtib29rRm9ybWF0dGluZyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRW51bU1hcHBpbmdzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBXb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsIHtcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0VG9Xb3JrYm9va0Zvcm1hdHRpbmcod29ya2Jvb2tGb3JtYXR0aW5nTW9kZWw/OiBXb3JrYm9va0Zvcm1hdHRpbmcpOiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghd29ya2Jvb2tGb3JtYXR0aW5nTW9kZWwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRpbmdNYXA6IEFycmF5PENvbnRyYWN0LkZvcm1hdHRpbmdTaGVldD4gPSB3b3JrYm9va0Zvcm1hdHRpbmdNb2RlbC5mb3JtYXR0aW5nU2hlZXRzLm1hcCgoY3VycmVudEZvcm1hdHRpbmdTaGVldCkgPT4ge1xuICAgICAgICBjb25zdCBmb3JtYXR0aW5nU2hlZXQ6IENvbnRyYWN0LkZvcm1hdHRpbmdTaGVldCA9IHtcbiAgICAgICAgICBjbGFzc05hbWVLZXk6IEVudW1NYXBwaW5ncy5jbGFzc05hbWVLZXkuY29udmVydChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNsYXNzTmFtZUtleSksXG4gICAgICAgICAgY3NzUHJvcGVydGllczogZ2V0Q3NzUHJvcGVydGllcyhjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNsYXNzTmFtZUtleSwgY3VycmVudEZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzKSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRpbmdTaGVldDtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0OiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgPSB7XG4gICAgICAgIGZvcm1hdHRpbmdTaGVldHM6IGZvcm1hdHRpbmdNYXAsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q3NzUHJvcGVydGllcyhjbGFzc05hbWVLZXk6IENsYXNzTmFtZUtleSwgY3NzUHJvcGVydGllczogUmVhY3QuQ1NTUHJvcGVydGllcyk6IGltcG9ydCgncmVhY3QnKS5DU1NQcm9wZXJ0aWVzIHtcbiAgaWYgKGNsYXNzTmFtZUtleSA9PT0gQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzIHx8IGNsYXNzTmFtZUtleSA9PT0gQ2xhc3NOYW1lS2V5LkNvbHVtbkRpdmlkZXJzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJvcmRlckNvbG9yOiBjc3NQcm9wZXJ0aWVzLmJvcmRlckNvbG9yLFxuICAgICAgYm9yZGVyU3R5bGU6IGNzc1Byb3BlcnRpZXMuYm9yZGVyU3R5bGUsXG4gICAgICBib3JkZXJXaWR0aDogY3NzUHJvcGVydGllcy5ib3JkZXJXaWR0aCxcbiAgICB9IGFzIFJlYWN0LkNTU1Byb3BlcnRpZXM7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZvbnRGYW1pbHk6IGNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSxcbiAgICBmb250U2l6ZTogY3NzUHJvcGVydGllcy5mb250U2l6ZSxcbiAgICBmb250V2VpZ2h0OiBjc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQsXG4gICAgZm9udFN0eWxlOiBjc3NQcm9wZXJ0aWVzLmZvbnRTdHlsZSxcbiAgICB0ZXh0RGVjb3JhdGlvbjogY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbixcbiAgICBjb2xvcjogY3NzUHJvcGVydGllcy5jb2xvcixcbiAgfTtcbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIFdvcmtzaGVldENvbnRlbnQgbmFtZXNwYWNlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBXb3Jrc2hlZXRDb250ZW50IGlzXG4gKiBjdXJyZW50bHkganVzdCBhIChzaW5nbGUpIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtzaGVldENvbnRlbnQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3Jrc2hlZXRDb250ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3dvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7fVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8sIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Jbml0aWFsaXphdGlvblNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEluaXRpYWxpemF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5Jbml0aWFsaXphdGlvblNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYyhpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbiwgY29udGV4dE1lbnVJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxFeHRlbnNpb25Cb290c3RyYXBJbmZvPiB7XG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uQ29udGV4dE1lbnVJZHNdOiBjb250ZXh0TWVudUlkcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Jc0V4dGVuc2lvbkRpYWxvZ106IGlzRXh0ZW5zaW9uRGlhbG9nLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5Jbml0aWFsaXplRXh0ZW5zaW9uLCBwYXJhbXMpLnRoZW48RXh0ZW5zaW9uQm9vdHN0cmFwSW5mbz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBUT0RPIC0gVmFsaWRhdGUgcmV0dXJuIHZhbHVlXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25Cb290c3RyYXBJbmZvO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvLCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBTZXR0aW5nc0NvbGxlY3Rpb24sIFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL1NldHRpbmdzU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU2V0dGluZ3NTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLlNldHRpbmdzU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlU2V0dGluZ3NBc3luYyhzZXR0aW5nczogU2V0dGluZ3NDb2xsZWN0aW9uKTogUHJvbWlzZTxTZXR0aW5nc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2F2ZVNldHRpbmdzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlNldHRpbmdzVmFsdWVzXTogc2V0dGluZ3MsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNhdmVFeHRlbnNpb25TZXR0aW5ncywgcGFyYW1ldGVycykudGhlbjxTZXR0aW5nc0NvbGxlY3Rpb24+KCh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdmFsdWUucmVzdWx0IGFzIEV4dGVuc2lvblNldHRpbmdzSW5mbztcblxuICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5zZXR0aW5nc1ZhbHVlcykge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1VuZXhwZWN0ZWQgZXJyb3Igc2F2aW5ncyBzZXR0aW5ncy4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdC5zZXR0aW5nc1ZhbHVlcztcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRGlhbG9nT3B0aW9ucywgRGlhbG9nU3R5bGUsIEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdCwgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMsIEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncywgU2VydmljZUltcGxCYXNlLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFVJU2VydmljZSB9IGZyb20gJy4uL1VJU2VydmljZSc7XG5cbmNvbnN0IERFRkFVTFRfRElBTE9HX0hFSUdIVCA9IDQwMDsgLy8gaW4gcGl4ZWxzXG5jb25zdCBERUZBVUxUX0RJQUxPR19XSURUSCA9IDYwMDsgLy8gaW4gcGl4ZWxzXG5jb25zdCBERUZBVUxUX0RJQUxPR19TVFlMRTogRGlhbG9nU3R5bGUgPSBEaWFsb2dTdHlsZS5XaW5kb3c7XG5cbmV4cG9ydCBjbGFzcyBVSVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgVUlTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwbGF5RGlhbG9nQXN5bmModXJsOiBzdHJpbmcsIHBheWxvYWQ6IHN0cmluZywgaXNFeHRlbnNpb25EaWFsb2c6IGJvb2xlYW4sIG9wdGlvbnM/OiBEaWFsb2dPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2Rpc3BsYXlEaWFsb2dBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nVXJsXTogdXJsLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1BheWxvYWRdOiBwYXlsb2FkLFxuICAgIH07XG5cbiAgICAvLyBUaGUgZGlhbG9nIHVybCBzb3VyY2UgcmVmZXJzIHRvIHdobyBpcyBvcGVuaW5nIGEgbmV3IGRpYWxvZyAoaS5lLiB0aGUgZGlhbG9nJ3MgcGFyZW50KS5cbiAgICAvLyBJZiB0aGUgaG9zdCBleHRlbnNpb24gaXMgb3BlbmluZyBhIGRpYWxvZyB3ZSBsZWF2ZSB0aGUgc291cmNlIHVybCBhcyB1bmRlZmluZWQgdG8gaGVscCB1cyBkaWZmZXJlbnRpYXRlIGZyb20gb3RoZXIgZGlhbG9ncy5cbiAgICBpZiAoaXNFeHRlbnNpb25EaWFsb2cpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nVXJsU291cmNlXSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cblxuICAgIGNvbnN0IGg6IG51bWJlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5oZWlnaHQgPyBvcHRpb25zLmhlaWdodCA6IERFRkFVTFRfRElBTE9HX0hFSUdIVDtcbiAgICBjb25zdCB3OiBudW1iZXIgPSBvcHRpb25zICYmIG9wdGlvbnMud2lkdGggPyBvcHRpb25zLndpZHRoIDogREVGQVVMVF9ESUFMT0dfV0lEVEg7XG4gICAgY29uc3QgZGlhbG9nU3R5bGU6IERpYWxvZ1N0eWxlID0gb3B0aW9ucyAmJiBvcHRpb25zLmRpYWxvZ1N0eWxlID8gb3B0aW9ucy5kaWFsb2dTdHlsZSA6IERFRkFVTFRfRElBTE9HX1NUWUxFO1xuXG4gICAgLy8gT24gdGhlIHBsYXRmb3JtIHNpZGUsIHdlIGRvIHNvbWV0aGluZyByZWFzb25hYmxlIHJlZ2FyZGVzcyBvZiB3aGV0aGVyIHRoZSBwYXNzZWRcbiAgICAvLyBoZWlnaHQgYW5kIHdpZHRoIGFyZSB0b28gbGFyZ2Ugb3IgdG9vIHNtYWxsLiAgQnV0IHRoaXMgbGlrZWx5IGluZGljYXRlcyBhIGRldmVsb3BlciBlcnJvcixcbiAgICAvLyBzbyB3ZSB0aHJvdyBhbiBlcnJvciBoZXJlIHRvIGhlbHAgd2l0aCBkZWJ1Z2dpbmcuXG4gICAgaWYgKGggPD0gMCB8fCB3IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnU2l6ZSBwYXJhbWV0ZXJzIGZvciBkaXNwbGF5RGlhbG9nQXN5bmMgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nSF0gPSBoO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nV10gPSB3O1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RGlhbG9nU3R5bGU+KGRpYWxvZ1N0eWxlLCBEaWFsb2dTdHlsZSwgJ0RpYWxvZ1N0eWxlJyk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dTdHlsZV0gPSBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MuZGlhbG9nU3R5bGVzLmNvbnZlcnQoZGlhbG9nU3R5bGUpO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuRGlzcGxheURpYWxvZywgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRpYWxvZ1Jlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25EaWFsb2dSZXN1bHQ7XG4gICAgICBzd2l0Y2ggKGRpYWxvZ1Jlc3VsdCkge1xuICAgICAgICBjYXNlIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdC5EaWFsb2dBbHJlYWR5T3BlbjpcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuRGlhbG9nQWxyZWFkeU9wZW4sICdUaGVyZSBhbHJlYWR5IGV4aXN0cyBhbiBvcGVuIGRpYWxvZyBmb3IgdGhpcyBleHRlbnNpb24uJyk7XG4gICAgICAgIGNhc2UgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LkludmFsaWREb21haW46XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgICAgIEVycm9yQ29kZXMuSW52YWxpZERvbWFpbkRpYWxvZyxcbiAgICAgICAgICAgICdUaGUgdXJsIG9mIGFuIGV4dGVuc2lvbiBkaWFsb2cgbXVzdCBtYXRjaCB0aGUgZG9tYWluIG9mIHRoZSBwYXJlbnQgZXh0ZW5zaW9uLicsXG4gICAgICAgICAgKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBTdWNjZXNzIGNhc2VcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VEaWFsb2cocGF5bG9hZD86IHN0cmluZywgZGlhbG9nVXJsPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2Nsb3NlRGlhbG9nJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dVcmxTb3VyY2VdOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICB9O1xuXG4gICAgaWYgKHBheWxvYWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nUGF5bG9hZF0gPSBwYXlsb2FkO1xuICAgIH1cblxuICAgIGlmIChkaWFsb2dVcmwpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nVXJsXSA9IGRpYWxvZ1VybDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DbG9zZURpYWxvZywgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBzZW5kRGlhbG9nTWVzc2FnZUFzeW5jKG1lc3NhZ2U6IHN0cmluZywgdGFyZ2V0RGlhbG9nVXJsPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NlbmREaWFsb2dNZXNzYWdlJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dNZXNzYWdlXTogbWVzc2FnZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dVcmxTb3VyY2VdOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICB9O1xuXG4gICAgaWYgKHRhcmdldERpYWxvZ1VybCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dVcmxdID0gdGFyZ2V0RGlhbG9nVXJsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNlbmREaWFsb2dNZXNzYWdlLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHNlbmREaWFsb2dNZXNzYWdlVG9QYXJlbnRBc3luYyhtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VuZE1lc3NhZ2VUb1BhcmVudCcsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nTWVzc2FnZV06IG1lc3NhZ2UsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nVXJsU291cmNlXTogd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNlbmRNZXNzYWdlVG9QYXJlbnQsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQ6IGJvb2xlYW4sIGV4dGVuc2lvblpvbmVJZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUoY2xpY2tUaHJvdWdoRW5hYmxlZCwgJ2Jvb2xlYW4nLCAnY2xpY2tUaHJvdWdoRW5hYmxlZCcpO1xuXG4gICAgaWYgKGV4dGVuc2lvblpvbmVJZCA9PT0gdW5kZWZpbmVkIHx8IGV4dGVuc2lvblpvbmVJZCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ0V4dGVuc2lvbiBJZCBpcyBpbnZhbGlkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvblpvbmVJZF06IGV4dGVuc2lvblpvbmVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DbGlja1Rocm91Z2hFbmFibGVkXTogY2xpY2tUaHJvdWdoRW5hYmxlZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0Q2xpY2tUaHJvdWdoLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vSW1wbC9Jbml0aWFsaXphdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFNldHRpbmdzU2VydmljZUltcGwgfSBmcm9tICcuL0ltcGwvU2V0dGluZ3NTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9JbXBsL1VJU2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgU2V0dGluZ3NTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFVJU2VydmljZUltcGwoZGlzcGF0Y2hlciwgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCkpO1xufVxuIiwiZXhwb3J0IGNvbnN0IEV4dGVuc2lvbnNSZWdpc3RyeUlkID0gMDtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLyoqXG4gKiBUaGlzIGlzIHlvdXIgbWFpbi4gVGhpcyBpcyB3aGVyZSB5b3UgcmUtZXhwb3J0IGV2ZXJ5dGhpbmcgeW91IHdhbnQgdG8gYmUgcHVibGljbHkgYXZhaWxhYmxlLlxuICpcbiAqIFRoZSBidWlsZCBlbmZvcmNlcyB0aGF0IHRoZSBmaWxlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnbG9iYWwgdmFyaWFibGUgdGhhdCBpcyBleHBvcnRlZC5cbiAqL1xuXG5pbXBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbi8vIER1ZSB0byB0aGUgd2F5IHdlIGNvbmZpZ3VyZWQgd2VicGFjaywgd2Ugc2hvdWxkIGJlIGV4cG9ydGluZyB0aGluZ3Mgd2hpY2ggd2lsbCBiZSB1bmRlclxuLy8gYSBnbG9iYWwgdmFyaWFibGUgY2FsbGVkIFwidGFibGVhdVwiLiBFeHBvcnQgZXZlcnl0aGluZyB3ZSB3YW50IHRvIGJlIHZpc2libGUgdW5kZXIgdGFibGVhdVxuLy8gZnJvbSB0aGlzIGZpbGUuXG5pbXBvcnQgeyBFeHRlbnNpb25zSW1wbCB9IGZyb20gJy4vRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbnNJbXBsJztcbmltcG9ydCB7IEV4dGVuc2lvbnMgfSBmcm9tICcuL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9FeHRlbnNpb25zJztcblxuZGVjbGFyZSBsZXQgVkVSU0lPTl9JU19BTFBIQTogYm9vbGVhbjtcbmNvbnN0IGlzQWxwaGE6IGJvb2xlYW4gPSB0eXBlb2YgVkVSU0lPTl9JU19BTFBIQSAhPT0gJ3VuZGVmaW5lZCcgPyBWRVJTSU9OX0lTX0FMUEhBIDogZmFsc2U7XG5cbmRlY2xhcmUgbGV0IEFQSV9WRVJTSU9OX05VTUJFUjogc3RyaW5nO1xuQXBpVmVyc2lvbi5TZXRWZXJzaW9uTnVtYmVyKHR5cGVvZiBBUElfVkVSU0lPTl9OVU1CRVIgIT09ICd1bmRlZmluZWQnID8gQVBJX1ZFUlNJT05fTlVNQkVSIDogJzAuMC4wJywgaXNBbHBoYSk7XG5cbmNvbnN0IGV4dGVuc2lvbkltcGwgPSBuZXcgRXh0ZW5zaW9uc0ltcGwoKTtcbmV4cG9ydCBjb25zdCBleHRlbnNpb25zID0gbmV3IEV4dGVuc2lvbnMoZXh0ZW5zaW9uSW1wbCk7XG5cbi8vIEV4cG9ydCBFbnVtc1xuLy8gVGhlc2Ugc2hvdyB1cCB1bmRlciB0aGUgdGFibGVhdSBvYmplY3QuIEkuZS4gdGFibGVhdS5FeHRlbnNpb25Db250ZXh0LlNlcnZlclxuZXhwb3J0IHtcbiAgQW5hbHl0aWNzT2JqZWN0VHlwZSxcbiAgQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLFxuICBEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZSxcbiAgRGF0YVR5cGUsXG4gIERhdGVSYW5nZVR5cGUsXG4gIERpYWxvZ1N0eWxlLFxuICBFbmNvZGluZ1R5cGUsXG4gIEVycm9yQ29kZXMsXG4gIEV4cG9ydGVkTWVkaWFUeXBlLFxuICBFeHRlbnNpb25Db250ZXh0LFxuICBFeHRlbnNpb25Nb2RlLFxuICBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSxcbiAgRmlsdGVyRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbixcbiAgRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSxcbiAgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gIE1hcmtUeXBlLFxuICBQYXJhbWV0ZXJWYWx1ZVR5cGUsXG4gIFBlcmlvZFR5cGUsXG4gIFF1aWNrVGFibGVDYWxjVHlwZSxcbiAgUmVsYXRpdmVEYXRlRmlsdGVyT3B0aW9ucyxcbiAgUmVwbGF5U3BlZWRUeXBlLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlLFxuICBTZWxlY3RPcHRpb25zLFxuICBTaGVldFR5cGUsXG4gIFNvcnREaXJlY3Rpb24sXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFRyZW5kTGluZU1vZGVsVHlwZSxcbiAgVml6SW1hZ2VFbmNvZGluZ1R5cGUsXG4gIFZpekltYWdlUGFsZXR0ZVR5cGUsXG4gIFZpekltYWdlU2l6ZVNldHRpbmdBbGlnbm1lbnRUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nVHlwZSxcbiAgVml6SW1hZ2VTb3J0RGlyZWN0aW9uVHlwZSxcbiAgWm9uZVZpc2liaWxpdHlUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ No newline at end of file diff --git a/lib/tableau.extensions.1.17.0.min.js b/lib/tableau.extensions.1.17.0.min.js new file mode 100644 index 00000000..7c8909b0 --- /dev/null +++ b/lib/tableau.extensions.1.17.0.min.js @@ -0,0 +1,2 @@ +(()=>{var e={74: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 o(e){try{l(a.next(e))}catch(e){n(e)}}function s(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(o,s)}l((a=a.apply(e,t||[])).next())})};Object.defineProperty(t,"__esModule",{value:!0}),t.ExtensionsImpl=void 0;const i=r(5691),n=r(6636),o=r(7464),s=r(7944),l=r(494),d=r(9680),c=r(3713),u=r(7879),p=r(4301),m=r(3694),h=r(8484),g=r(8413),y=r(7736),v=r(8518),I=r(3156),S=r(4227),f=r(4633),b=r(8013),T=r(5144),P=r(3834);t.ExtensionsImpl=class{initializeAsync(e,t){return this._initializationPromise||(this._initializationPromise=new Promise((r,a)=>{const i={isAlpha:o.ApiVersion.Instance.isAlpha,isExtensionDialog:e};if(f.LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise(i)){const n=f.LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise(i);null==n||n.then(r=>this.onDispatcherReceived(r,e,t)).then(e=>{r(e)}).catch(e=>{a(e)})}else{const s=this.onDispatcherReceived.bind(this);(0,o.doCrossFrameBootstrap)(window,n.INTERNAL_CONTRACT_VERSION,i).then(r=>s(r,e,t)).then(e=>{r(e)}).catch(e=>{a(e)})}})),this._initializationPromise}reportExtensionRenderComplete(e){return a(this,void 0,void 0,function*(){return o.ApiServiceRegistry.get(v.ExtensionsRegistryId).getService("export-service").reportExtensionRenderComplete(e)})}createVizImageAsync(e){return o.ApiServiceRegistry.get(v.ExtensionsRegistryId).getService("viz-service").createVizImageAsync(e)}setClickThroughAsync(e){return o.ApiServiceRegistry.get(v.ExtensionsRegistryId).getService("UIService").setClickThroughAsync(e,this.extensionZoneId)}isDashboardExtensionLocator(e){if(!e.dashboardPath)throw new o.TableauError(i.ErrorCodes.InternalError,"Unexpected error during initialization.");return!0}onDispatcherReceived(e,t,r){let a=e(n.INTERNAL_CONTRACT_VERSION);(0,y.registerInitializationExtensionsServices)(a);const i=o.ApiServiceRegistry.get(v.ExtensionsRegistryId).getService("InitializationService"),s=r?Object.keys(r):[];return i.initializeDashboardExtensionsAsync(t,s).then(e=>{const i=e.extensionEnvironment.platformVersion?e.extensionEnvironment.platformVersion:{major:1,minor:9,fix:0};return o.VersionedExternalApiDispatcher.needsVersionConverter(i)&&(a=new o.VersionedExternalApiDispatcher(a,i)),(0,o.registerAllSharedServices)(a,v.ExtensionsRegistryId),(0,y.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 u.Environment(e.extensionEnvironment),this.settings=this.initializeSettings(e.extensionSettingsInfo),this.ui=new m.UI(new P.UIImpl(t)),this.workbook=new l.Workbook(new S.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){o.ApiServiceRegistry.get(v.ExtensionsRegistryId).getService("notification-service").registerHandler(n.NotificationId.WorkbookFormattingChanged,()=>!0,t=>{t&&(this.initializeTableauFonts(e,t),this.applyAllFormatting(t))})}initializeTableauFonts(e,t){const r=[...I.SupportedBentonSansFontFaces,...T.SupportedTableauFontFaces];if(t.formattingSheets.forEach(e=>{e.cssProperties.fontFamily&&r.push(e.cssProperties.fontFamily)}),r.length>0){const t={[n.ParameterId.FontNameListItems]:r};e.execute(n.VerbId.GetFonts,t).then(e=>{this.loadFonts(e.result)}).catch()}}loadFonts(e){e.forEach(e=>{T.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 o.SheetInfoImpl(e.name,i.SheetType.Dashboard,{width:e.size.w,height:e.size.h},void 0,!0),a=new o.DashboardImpl(r,e.zones,t,v.ExtensionsRegistryId,null,e.activeDashboardObjectId),n=new s.Dashboard(a);return new c.DashboardContent(n)}initializeWorksheetContent(e){const t=new o.SheetInfoImpl(e.visualId.worksheet,i.SheetType.Worksheet,{width:e.size.w,height:e.size.h},void 0,!0),r=new o.WorksheetImpl(t,v.ExtensionsRegistryId,e.visualId,null,null,e.backgroundColor,h.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.formatting)),a=new d.Worksheet(r);return new g.WorksheetContent(a)}initializeSettings(e){const t=new b.SettingsImpl(e);return new p.Settings(t)}initializeContextMenuCallbacks(e){o.ApiServiceRegistry.get(v.ExtensionsRegistryId).getService("notification-service").registerHandler(n.NotificationId.ContextMenuClick,()=>!0,t=>{if(e){if(!e[t.id])throw new o.TableauError(i.ErrorCodes.InternalError,`Received unexpected context menu Id from event: ${t.id}`);e[t.id]()}})}loadTableauFonts(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 o.TableauError(i.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 o.TableauError(i.ErrorCodes.InternalError,`'attempted to load unsupported font: ${e.fontName}.'`)}}}},130:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ShouldThrow=t.EnumConverter=void 0;const a=r(5691),i=r(3267);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=n={}))},154:e=>{"use strict";var t;!function(e){let t,r,a,i,n,o,s,l,d,c;!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.Image="image",e.Pdf="pdf",e.Svg="svg",e.Html="html",e.PowerPoint="powerpoint",e.Excel="excel"}(i=e.ExportedMediaType||(e.ExportedMediaType={})),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"}(n=e.TableauEventType||(e.TableauEventType={})),function(e){e.Discrete="discrete",e.Continuous="continuous"}(o=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"}(l=e.VizImagePaletteType||(e.VizImagePaletteType={})),function(e){e.Fixed="fixed",e.Manual="manual"}(d=e.VizImageSizeSettingType||(e.VizImageSizeSettingType={})),function(e){e.Right="right",e.Left="left",e.Center="center"}(c=e.VizImageSizeSettingAlignmentType||(e.VizImageSizeSettingAlignmentType={}))}(t||(t={})),e.exports=t},370:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.SharedErrorCodes=void 0,function(e){e.CrosstabCreationError="crosstab-creation-error",e.DataCreationError="data-creation-error",e.InvalidAggregationFieldName="invalid-aggregation-field-name",e.InvalidFilterFieldName="invalid-filter-name",e.InvalidFilterFieldValue="invalid-filter-fieldValue",e.InvalidSelectionDate="invalid-selection-date",e.InvalidSelectionFieldName="invalid-selection-fieldName",e.InvalidSelectionValue="invalid-selection-value",e.InvalidSelectionSheet="invalid-selection-sheet",e.InternalError="internal-error",e.InvalidParameter="invalid-parameter",e.PDFCreationError="pdf-creation-error",e.PowerPointCreationError="powerpoint-creation-error",e.NotActiveSheet="not-active-sheet",e.ImplementationError="wrong-implementation",e.ApiExecutionError="api-execution-error",e.ServerError="server-error",e.Timeout="timeout"}(r||(t.SharedErrorCodes=r={}))},385:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CrossFrameMessenger=void 0;const a=r(1966),i=r(6636),n=r(522),o=r(8531),s=r(8709);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:s.MessageType.Initialize,crossFrameVersion:t,apiVersion:e,options:r};return this.prepareMessage(i)}prepareCommandMessage(e,t){const r={msgGuid:a.raw(),msgType:s.MessageType.Command,verbId:e,parameters:t};return this.prepareMessage(r)}prepareCommandResponseMessage(e,t,r){const i={msgGuid:a.raw(),msgType:s.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:s.MessageType.Notification,notificationId:e,data:t};return this.prepareMessage(r)}prepareAckMessage(){const e={msgGuid:a.raw(),msgType:s.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((0,o.isMessage)(t))switch(t.msgType){case s.MessageType.Initialize:if(!(0,o.isInitMessage)(t)||!this.initializeMessageHandler)return;this.initializeMessageHandler(t,e.source);break;case s.MessageType.CommandResponse:if(!(0,o.isCommandResponseMessage)(t)||!this.commandResponseMessageHandler)return;this.commandResponseMessageHandler(t,e.source);break;case s.MessageType.Command:if(!(0,o.isCommandMessage)(t)||!this.commandMessageHandler)return;this.commandMessageHandler(t,e.source);break;case s.MessageType.Notification:if(!(0,o.isNotificationMessage)(t)||!this.notificationMessageHandler)return;this.notificationMessageHandler(t,e.source);break;case s.MessageType.Handshake:if(!(0,o.isHandshakeMessage)(t)||!this.handshakeMessageHandler)return;this.handshakeMessageHandler(t,e.source)}}setOtherWindow(e){this.otherWindow=e}setOtherWindowOrigin(e){this.otherWindowOrigin=e}}},386:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},396:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExternalStackingVersionConverter=void 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}}},407:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SettingsServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(7464);class o 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=o},460:function(e,t,r){"use strict";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,i)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),i=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.Toolbar=t.TableauDialogType=t.SheetSizeBehavior=t.PulseTimeDimension=t.PulseLayout=t.PulseErrorMessageVisibility=t.PrintScaling=t.PrintPageSize=t.PrintOrientation=t.EmbeddingTableauEventType=t.EmbeddingErrorCodes=t.DeviceType=t.CrosstabFileFormat=t.ApiMenuType=void 0,i(r(6835),t);var n=r(5848);Object.defineProperty(t,"ApiMenuType",{enumerable:!0,get:function(){return n.ApiMenuType}}),Object.defineProperty(t,"CrosstabFileFormat",{enumerable:!0,get:function(){return n.CrosstabFileFormat}}),Object.defineProperty(t,"DeviceType",{enumerable:!0,get:function(){return n.DeviceType}}),Object.defineProperty(t,"EmbeddingErrorCodes",{enumerable:!0,get:function(){return n.EmbeddingErrorCodes}}),Object.defineProperty(t,"EmbeddingTableauEventType",{enumerable:!0,get:function(){return n.TableauEventType}}),Object.defineProperty(t,"PrintOrientation",{enumerable:!0,get:function(){return n.PrintOrientation}}),Object.defineProperty(t,"PrintPageSize",{enumerable:!0,get:function(){return n.PrintPageSize}}),Object.defineProperty(t,"PrintScaling",{enumerable:!0,get:function(){return n.PrintScaling}}),Object.defineProperty(t,"PulseErrorMessageVisibility",{enumerable:!0,get:function(){return n.PulseErrorMessageVisibility}}),Object.defineProperty(t,"PulseLayout",{enumerable:!0,get:function(){return n.PulseLayout}}),Object.defineProperty(t,"PulseTimeDimension",{enumerable:!0,get:function(){return n.PulseTimeDimension}}),Object.defineProperty(t,"SheetSizeBehavior",{enumerable:!0,get:function(){return n.SheetSizeBehavior}}),Object.defineProperty(t,"TableauDialogType",{enumerable:!0,get:function(){return n.TableauDialogType}}),Object.defineProperty(t,"Toolbar",{enumerable:!0,get:function(){return n.Toolbar}}),i(r(3219),t),i(r(9336),t),i(r(3359),t),i(r(6707),t),i(r(6877),t),i(r(9770),t)},494:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Workbook=void 0,t.Workbook=class{constructor(e){this._workbookImpl=e}getAllDataSourcesAsync(){return this._workbookImpl.getAllDataSourcesAsync()}}},522:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CrossFramePreparedMessage=void 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}}},608:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataValue=t.Column=t.MarkInfo=t.DataTable=void 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}}},633:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SheetUtils=void 0;const a=r(5691),i=r(6636),n=r(3267);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 o=0===t&&0===i;return{behavior:a.SheetSizeBehavior.Range,minSize:{width:t,height:r},maxSize:{width:o?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}}},636:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorkbookFormattingChangedEvent=void 0;const a=r(5691),i=r(9577);class n extends i.TableauEvent{constructor(e){super(a.TableauEventType.WorkbookFormattingChanged),this._formatting=e}get formatting(){return this._formatting}}t.WorkbookFormattingChangedEvent=n},677:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExternalContextMenuServiceImpl=void 0;const a=r(6636),i=r(1891);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,o={[a.ParameterId.FunctionName]:"renameContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuHeader]:r,[a.ParameterId.ExternalMenuDescription]:i};return this.execute(n,o).then(e=>{})}}t.ExternalContextMenuServiceImpl=n},720:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Param=void 0;const a=r(5691),i=r(3267),n=r(2782);class o{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(o.isTypeNumber(e))return o.serializeNumberForPlatform(e);if(o.isTypeDate(e))return o.serializeDateForPlatform(e);if(o.isTypeBool(e))return o.serializeBooleanForPlatform(e);if(o.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(o.isNullOrUndefined(e))return{success:!1};if(o.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=o},742:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},751:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Sheet=void 0;const a=r(5691),i=r(7464),n=r(5231);class o 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=o},769:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauWorksheetEvent=void 0;const a=r(964);class i extends a.TableauSheetEvent{get worksheet(){return this._worksheet}constructor(e,t){super(e,t),this._worksheet=t}}t.TableauWorksheetEvent=i},770:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorkbookImpl=void 0,t.WorkbookImpl=class{}},822:(e,t)=>{"use strict";var r,a,i;Object.defineProperty(t,"__esModule",{value:!0}),t.VizOptionNames=void 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_COUNT=":embcount",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={})),function(e){e.Size=":size",e.Embed=":embed",e.EmbedCount=":embcount",e.ApiInternalVersion=":apiInternalVersion",e.ApiExternalVersion=":apiExternalVersion",e.ShowVizHome=":showVizHome",e.Jsdebug=":jsdebug",e.BootstrapWhenNotified=":bootstrapWhenNotified",e.NavType="navType",e.NavSrc="navSrc",e.debug=":jsdebug",e.ApiID=":apiID",e.disableUrlActionsPopups=":disableUrlActionsPopups",e.hideTabs=":tabs",e.toolbar=":toolbar",e.device=":device",e.instanceIdToClone=":iid",e.touchOptimize="mobile",e.hideEditButton=":hideEditButton",e.hideEditInDesktopButton=":hideEditInDesktopButton",e.suppressDefaultEditBehavior=":suppressDefaultEditBehavior",e.hideCloseButton=":hideCloseButton"}(i||(t.VizOptionNames=i={}))},895:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardObject=void 0;const a=r(7944),i=r(9680);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}}},964:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauSheetEvent=void 0;const a=r(9577);class i extends a.TableauEvent{get sheet(){return this._sheet}constructor(e,t){super(e),this._sheet=t}}t.TableauSheetEvent=i},1262:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExternalIdentityVersionConverter=void 0,t.ExternalIdentityVersionConverter=class{downgradeExecuteCall(e,t){return{verb:e,parameters:t}}upgradeExecuteReturn(e,t,r){return e}upgradeNotification(e){return e}}},1273:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.GetDataType=void 0,function(e){e.Summary="summary",e.Underlying="underlying"}(r||(t.GetDataType=r={}))},1401:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataSourceServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(4602),o=r(8127),s=r(7887),l=r(7832),d=r(3267),c=r(1891);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 o.Field(new l.FieldImpl(e,t))}convertDataSource(e){return new n.DataSource(new s.DataSourceImpl(e,this._registryId))}}t.DataSourceServiceImpl=u},1471:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StoryPointInfoImpl=void 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}}},1592:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TooltipTextRequestModel=void 0,t.TooltipTextRequestModel=class{constructor(e,t){this.visualIdPresModel=e,this.tupleId=t}}},1596:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},1611:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.NotificationServiceImpl=void 0;const a=r(8194);class i extends a.NotificationServiceImplBase{get serviceName(){return"notification-service"}}t.NotificationServiceImpl=i},1615:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ClientInfoServiceImpl=void 0;const a=r(6636),i=r(1891);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},1647:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},1768:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.AskDataOptionNames=void 0,function(e){e.token="token",e.origin="origin",e.showEmbed="showEmbed",e.showPin="showPin",e.showSave="showSave",e.showShare="showShare",e.debug=":jsdebug",e.ApiID=":apiID",e.ApiExternalVersion=":apiExternalVersion",e.ApiInternalVersion=":apiInternalVersion",e.AskDataWebComponent=":askDataWebComponent"}(r||(t.AskDataOptionNames=r={}))},1871:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableSummary=void 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}}},1891:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ServiceImplBase=void 0;const a=r(6753),i=r(3267),n=r(130);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)})}}},1966: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}),t.HoverTupleInteractionModel=t.SelectTuplesInteractionModel=t.SelectionModelsContainer=t.TupleSelectionModel=t.DimensionSelectionModel=t.RangeSelectionModel=t.HierarchicalSelectionModel=t.ValueSelectionModel=t.SelectionModel=void 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}}},2140:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ApiServiceRegistry=void 0;const a=r(5691),i=r(3267);"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 o{static get(e){if(window.__tableauApiServiceRegistry&&window.__tableauApiServiceRegistry[e]||o.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=o},2219:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.VerbId=void 0,function(e){e.ActivateNextStoryPoint="activate-next-story-point",e.ActivatePreviousStoryPoint="activate-previous-story-point",e.ActivateSheet="activateSheet",e.ActivateStoryPoint="activate-story-point",e.AddMarksCardFields="add-marks-card-fields",e.AppendExternalMenuItem="append-external-menu-item",e.ApplyCategoricalFilter="categorical-filter",e.ApplyPulseFilters="apply-pulse-filters",e.ApplyPulseTimeDimension="apply-pulse-time-dimension",e.ApplyRangeFilter="range-filter",e.ApplyRelativeDateFilter="apply-relative-date-Filter",e.Authenticate="authenticate",e.BlockExtension="block-extension",e.ChangeParameterValue="change-parameter-value",e.ChangeSharedFilter="change-shared-filter",e.ClearAllPulseFilters="clear-all-pulse-filters",e.ClearFilter="clear-filter",e.ClearPulseFilters="clear-pulse-filters",e.ClearSelectedMarks="clear-selected-marks",e.CloseDialog="close-dialog",e.CreateAnnotation="create-annotation",e.DashboardCategoricalFilter="dashboard-categorical-filter",e.DisplayDialog="display-dialog",e.DownloadWorkbook="download-workbook",e.EditAliasesDialog="edit-aliases-dialog",e.ExecuteExternalMenuItem="execute-external-menu-item",e.ExportCrosstab="export-crosstab",e.ExportCrosstabCsvDownload="export-crosstab-csv-download",e.ExportCrosstabExcelDownload="export-crosstab-excel-download",e.ExportData="export-data",e.ExportDataDownload="export-data-download",e.ExportImage="export-image",e.ExportPdf="export-pdf",e.ExportPdfDownload="export-pdf-download",e.ExportPowerpoint="export-powerpoint",e.ExportPowerpointDownload="export-powerpoint-download",e.FindParameter="find-parameter",e.GetActiveTables="get-active-tables",e.GetAllDataSources="get-all-data-sources",e.GetAnnotations="get-annotations",e.GetCategoricalDomain="get-categorical-domain",e.GetConnectionDescriptionSummaries="get-connection-description-summaries",e.GetCurrentSrc="get-current-src",e.GetCustomViews="get-custom-views",e.GetDashboardFilters="get-dashboard-filters",e.GetDataSource="get-datasource",e.GetDataSourceData="get-datasource-data",e.GetDataSources="get-data-sources",e.GetDataSummaryData="get-summary-data",e.GetDataSummaryDataReader="get-summary-data-reader",e.GetDataTableReaderPage="get-data-table-reader-page",e.GetEmbeddingAbstractQueryWithDataModel="get-embedding-abstract-query-with-data-model",e.GetEmbeddingClientInfo="get-embedding-client-info",e.GetVizStateWithDataModel="get-viz-state-with-data-model",e.GetExportCrosstabSheetMap="get-export-crosstab-sheet-map",e.GetExportPdfOptions="get-export-pdf-options",e.GetField="get-field",e.GetFieldAndDataSource="get-field-and-datasource",e.GetVisualSpecification="get-visual-specification",e.GetFilters="get-filters",e.GetFonts="get-fonts",e.GetHighlightedMarks="get-highlighted-marks",e.GetJoinDescription="get-join-description",e.GetLogicalTableData="get-logical-table-data",e.GetLogicalTableDataReader="get-logical-table-data-reader",e.GetLogicalTables="get-logical-tables",e.GetParametersForSheet="get-parameters-for-sheet",e.GetPulseCategoricalDomain="get-pulse-categorical-domain",e.GetPulseFilters="get-pulse-filters",e.GetPulseTimeDimension="get-pulse-time-dimension",e.GetRangeDomain="get-range-domain",e.GetSelectedMarks="get-selected-marks",e.GetSharedFilter="get-shared-filter",e.GetTooltipText="get-tooltip-text",e.GetUnderlyingData="get-underlying-data",e.GetUnderlyingTableData="get-underlying-table-data",e.GetUnderlyingTableDataReader="get-underlying-table-data-reader",e.GetUnderlyingTables="get-underlying-tables",e.HierarchicalFilter="hierachical-filter",e.InitializeExtension="initialize-extension",e.IsAnalyticsAssistantAvailable="is-analytics-assistant-available",e.LaunchAnalyticsAssistant="launch-analytics-assistant",e.MoveAndResizeZones="move-and-resize-zones",e.MoveMarksCardField="move-marks-card-field",e.RaiseLeaveMarkNavNotification="raise-leave-mark-nav-notification",e.RaiseHoverTupleNotification="raise-hover-tuple-notification",e.RaiseSelectTuplesNotification="raise-select-tuples-notification",e.Redo="redo",e.RefreshDataSource="refresh-data-source",e.ReleaseDataTableReader="release-data-table-reader",e.RemoveAnnotation="remove-annotation",e.RemoveCustomView="remove-custom-view",e.RemoveExternalMenuItem="remove-external-menu-item",e.RenameExternalMenu="rename-external-menu",e.ReplayAnimation="replay-animation",e.ReportExtensionRenderComplete="report-extension-render-complete",e.RevertStoryPoint="revert-story-point",e.RevertWorkbook="revert-workbook",e.SaveExtensionSettings="save-extension-settings",e.SaveWorkbookAsCustomView="save-workbook-as-custom-view",e.SelectByValue="select-by-value",e.SetActiveCustomViewAsDefault="set-active-custom-view-as-default",e.SetAutoUpdate="set-auto-update",e.SetClickThrough="set-click-through",e.SendDialogMessage="send-dialog-message",e.SendMessageToParent="send-message-to-parent",e.SetVizStateWithDataModel="set-viz-state-with-data-model",e.SetSheetSize="set-sheet-size",e.SetZoneVisibility="set-zone-visibility",e.Share="share",e.ShowCustomView="show-custom-view",e.SpliceMarksCardFields="splice-marks-card-fields",e.TestConversionVerb="test-conversion-verb",e.Undo="undo",e.UpdateCustomView="update-custom-view",e.VizAPI="viz-api"}(r||(t.VerbId=r={}))},2332:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},2414:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.GetDataServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(5412),o=r(7464),s=r(4369),l=r(608),d=r(5877),c=r(9012),u=r(1273),p=r(1891);class m extends p.ServiceImplBase{constructor(){super(...arguments),this.viewDataTableCacheId=(0,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,o,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(o),[i.ParameterId.ShowDataTableFormat]:s.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,o){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]:s.ExternalToInternalEnumMappings.showDataTableFormatType.convert(o)};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,o,l){const d={[i.ParameterId.FunctionName]:"getLogicalTableDataAsync",[i.ParameterId.ColumnsToInclude]:n,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(o),[i.ParameterId.DataSourceId]:e,[i.ParameterId.IgnoreAliases]:r,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.MaxRows]:this.getLimitedMaxRows(a,this.getMaxRowLimit()+1),[i.ParameterId.ShowDataTableFormat]:s.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,o){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]:s.ExternalToInternalEnumMappings.showDataTableFormatType.convert(o)};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,o,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(o),[i.ParameterId.MaxRows]:this.getLimitedMaxRows(l,this.getMaxRowLimit()+1),[i.ParameterId.ShowDataTableFormat]:s.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,o,l,c,u){r=this.getLimitedMaxRows(r,this.getMaxRowLimit());const p={[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]:o,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(l),[i.ParameterId.ShowDataTableFormat]:s.ExternalToInternalEnumMappings.showDataTableFormatType.convert(c),[i.ParameterId.PageRowCount]:r,[i.ParameterId.ApplyWorksheetFormatting]:u};return this.execute(i.VerbId.GetUnderlyingTableDataReader,p).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===m.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 o.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=m,m.summaryTableId=""},2570:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.VersionNumber=void 0;const a=r(5691),i=r(3267);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}`}}},2594:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.UIServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(7464),o=a.DialogStyle.Window;class s extends n.ServiceImplBase{get serviceName(){return"UIService"}displayDialogAsync(e,t,r,s){const l={[i.ParameterId.FunctionName]:"displayDialogAsync",[i.ParameterId.ExtensionDialogUrl]:e,[i.ParameterId.ExtensionDialogPayload]:t};r&&(l[i.ParameterId.ExtensionDialogUrlSource]=window.location.href);const d=s&&s.height?s.height:400,c=s&&s.width?s.width:600,u=s&&s.dialogStyle?s.dialogStyle:o;if(d<=0||c<=0)throw new n.TableauError(a.ErrorCodes.InvalidParameter,"Size parameters for displayDialogAsync must be positive");return l[i.ParameterId.ExtensionDialogH]=d,l[i.ParameterId.ExtensionDialogW]=c,n.ErrorHelpers.verifyEnumValue(u,a.DialogStyle,"DialogStyle"),l[i.ParameterId.ExtensionDialogStyle]=n.ExternalToInternalEnumMappings.dialogStyles.convert(u),this.execute(i.VerbId.DisplayDialog,l).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,t){const r={[i.ParameterId.FunctionName]:"closeDialog",[i.ParameterId.ExtensionDialogUrlSource]:window.location.href};return e&&(r[i.ParameterId.ExtensionDialogPayload]=e),t&&(r[i.ParameterId.ExtensionDialogUrl]=t),this.execute(i.VerbId.CloseDialog,r).then(()=>{})}sendDialogMessageAsync(e,t){const r={[i.ParameterId.FunctionName]:"sendDialogMessage",[i.ParameterId.ExtensionDialogMessage]:e,[i.ParameterId.ExtensionDialogUrlSource]:window.location.href};return t&&(r[i.ParameterId.ExtensionDialogUrl]=t),this.execute(i.VerbId.SendDialogMessage,r).then(()=>{})}sendDialogMessageToParentAsync(e){const t={[i.ParameterId.FunctionName]:"sendMessageToParent",[i.ParameterId.ExtensionDialogMessage]:e,[i.ParameterId.ExtensionDialogUrlSource]:window.location.href};return this.execute(i.VerbId.SendMessageToParent,t).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=s},2616:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},2632:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardImpl=void 0;const a=r(5691),i=r(5691),n=r(6636),o=r(6753),s=r(9357),l=r(2140),d=r(3267),c=r(2782),u=r(9531),p=r(8935),m=r(9735),h=r(3964);class g extends p.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 o="",s="",l=!1;e.sheetInfo?(o=e.sheetInfo.name,s=e.sheetInfo.url||"",l=""===s):o=e.name;const d=new m.SheetInfoImpl(o,i.SheetType.Worksheet,r,this._worksheetsImpl.length,a,l,s),c={worksheet:o,dashboard:this._sheetInfoImpl.name,storyboard:this._sheetPath.storyboard,flipboardZoneID:this._sheetPath.flipboardZoneID,storyPointID:this._sheetPath.storyPointID};t=new h.WorksheetImpl(d,this._registryId,c,this,this._parentStoryPointImpl),e.zoneType===n.DashboardObjectType.Worksheet&&this._worksheetsImpl.push(t)}const l=new s.Point(e.x,e.y),d=new u.DashboardObjectImpl(this,o.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,o=this._activeDashboardObjectId,s=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)}),o!==t&&(0!==t&&this.addChange(t,c,i.DashboardLayoutChange.Selected),0!==o&&this.addChange(o,c,i.DashboardLayoutChange.Deselected)),r&&s!==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},2671:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},2782:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ErrorHelpers=void 0;const a=r(5691),i=r(3267),n=r(720);class o{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(!o.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=o},3069:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},3092:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CustomViewImpl=void 0;const a=r(7464);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)}}},3153:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataTypeConverter=void 0;const a=r(9875);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%"},3156:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SupportedBentonSansFontFaces=t.BentonSansMediumFontFaceName=t.BentonSansLightFontFaceName=t.BentonSansSemiDemiItalicFontFaceName=t.BentonSansSemiDemiFontFaceName=t.BentonSansBookItalicFontFaceName=t.BentonSansBookFontFaceName=t.BentonSansLowDPIFontFamilyName=t.BentonSansFontFamilyName=void 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]},3219:(e,t)=>{"use strict";var r,a,i;Object.defineProperty(t,"__esModule",{value:!0}),t.PulseChildElementAttributes=t.PulseChildElements=t.PulseAttributes=void 0,function(e){e.DisableExploreFilter="disable-explore-filter",e.Layout="layout",e.OnFirstInteractive="onFirstInteractive",e.OnFirstPulseMetricSizeKnown="onFirstPulseMetricSizeKnown",e.OnPulseUrlError="onPulseError",e.OnPulseFiltersChanged="onPulseFiltersChanged",e.OnPulseInsightDiscovered="onPulseInsightDiscovered",e.OnPulseMetricSizeChanged="onPulseMetricSizeChanged",e.OnPulseTimeDimensionChanged="onPulseTimeDimensionChanged",e.OnPulseUrlChanged="onPulseUrlChanged",e.TimeDimension="time-dimension",e.TokenOptional="token-optional"}(r||(t.PulseAttributes=r={})),function(e){e.IframeStyle="iframe-style",e.ThemeParameter="theme-parameter",e.PulseFilter="pulse-filter"}(a||(t.PulseChildElements=a={})),function(e){e.Name="name",e.Field="field",e.Value="value",e.Type="type"}(i||(t.PulseChildElementAttributes=i={}))},3267:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauError=void 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},3293:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.VisualModelServiceImpl=void 0;const a=r(6636),i=r(1891);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 o={[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,o).then(()=>{})}moveMarksCardFieldAsync(e,t,r,i,n=1){const o={[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,o).then(()=>{})}spliceMarksCardFieldsAsync(e,t,r,i,n,o){const s={[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]:o};return this.execute(a.VerbId.SpliceMarksCardFields,s).then(()=>{})}editAliasesDialogAsync(e){const t={[a.ParameterId.FunctionName]:"editAliasesDialogAsync",[a.ParameterId.FieldId]:e};return this.execute(a.VerbId.EditAliasesDialog,t).then(()=>{})}}t.VisualModelServiceImpl=n},3359:(e,t)=>{"use strict";var r,a,i,n,o;Object.defineProperty(t,"__esModule",{value:!0}),t.VizChildElementAttributes=t.VizChildElements=t.VizAuthoringAttributes=t.VizAttributes=t.VizSharedAttributes=void 0,function(e){e.TouchOptimize="touch-optimize",e.HideEditInDesktopButton="hide-edit-in-desktop-button",e.SuppressDefaultEditBehavior="suppress-default-edit-behavior",e.DisableVersionCheck="disable-version-check",e.OnEditInDesktopButtonClicked="onEditInDesktopButtonClicked",e.OnFirstVizSizeKnown="onFirstVizSizeKnown",e.OnFirstInteractive="onFirstInteractive"}(r||(t.VizSharedAttributes=r={})),function(e){e.DisableUrlActionsPopups="disable-url-actions",e.HideTabs="hide-tabs",e.Toolbar="toolbar",e.InstanceIdToClone="instance-id-to-clone",e.Device="device",e.HideEditButton="hide-edit-button",e.OnEditButtonClicked="onEditButtonClicked",e.OnFilterChanged="onFilterChanged",e.OnCustomMarkContextMenuEvent="onCustomMarkContextMenuEvent",e.OnMarkSelectionChanged="onMarkSelectionChanged",e.OnParameterChanged="onParameterChanged",e.OnToolbarStateChanged="onToolbarStateChanged",e.OnUrlAction="onUrlAction",e.OnTabSwitched="onTabSwitched",e.OnCustomViewLoaded="onCustomViewLoaded",e.OnCustomViewRemoved="onCustomViewRemoved",e.OnCustomViewSaved="onCustomViewSaved",e.OnCustomViewSetDefault="onCustomViewSetDefault",e.OnStoryPointSwitched="onStoryPointSwitched",e.OnSummaryDataChanged="onSummaryDataChanged",e.OnReadyToReceiveAuthToken="onReadyToReceiveAuthToken"}(a||(t.VizAttributes=a={})),function(e){e.OnWorkbookPublished="onWorkbookPublished",e.OnWorkbookPublishedAs="onWorkbookPublishedAs",e.OnWorkbookReadyToClose="onWorkbookReadyToClose",e.HideCloseButton="hide-close-button"}(i||(t.VizAuthoringAttributes=i={})),function(e){e.VizFilter="viz-filter",e.VizParameter="viz-parameter",e.CustomParameter="custom-parameter",e.IframeStyle="iframe-style"}(n||(t.VizChildElements=n={})),function(e){e.Field="field",e.Value="value",e.Name="name"}(o||(t.VizChildElementAttributes=o={}))},3443:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ParameterImpl=void 0;const a=r(5691),i=r(6753),n=r(2140),o=r(9012),s=r(2782),l=r(720);t.ParameterImpl=class{constructor(e,t){this._registryId=t,this.setParameterInfo(e)}get name(){return this._parameterInfo.name}get currentValue(){return o.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){s.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,s,l,d;t===a.ParameterValueType.List?r=(e.allowableValues||[]).map(t=>o.DataValueFactory.MakeParameterDataValue(t,e.dataType)):t===a.ParameterValueType.Range&&(n=e.minValue&&o.DataValueFactory.MakeParameterDataValue(e.minValue,e.dataType),s=e.maxValue&&o.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:s,stepSize:l,dateStepPeriod:d}}}},3658:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},3694:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.UI=void 0;const a=r(7464);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)}sendDialogMessageToParentAsync(e){return this._impl.sendDialogMessageToParentAsync(e)}closeDialog(e,t){this._impl.closeDialog(e,t)}}t.UI=i},3713:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardContent=void 0,t.DashboardContent=class{constructor(e){this._dashboard=e}get dashboard(){return this._dashboard}}},3834:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.UIImpl=t.TableauDialogError=t.DialogMessageEvent=void 0;const a=r(5691),i=r(5691),n=r(6636),o=r(7464),s=r(9577),l=r(8518);class d extends s.TableauEvent{constructor(e,t){super(a.TableauEventType.DialogMessageReceived),this.message=e,this.sourceDialogUrl=t}}t.DialogMessageEvent=d;class c extends o.TableauError{constructor(e,t){super(e,t),Object.setPrototypeOf(this,c.prototype)}}t.TableauDialogError=c,t.UIImpl=class{constructor(e){this.isExtensionDialog=e}displayDialogAsync(e,t,r){const s=o.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService"),d=o.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service");return new Promise((o,l)=>{s.displayDialogAsync(e,t||"",this.isExtensionDialog,r).then(()=>{const e=d.registerHandler(n.NotificationId.ExtensionDialogUpdate,()=>!0,t=>{if(t.isCloseEvent){if(void 0===t.closePayload)throw new c(a.ErrorCodes.InternalError,"closePayload is undefined");o(t.closePayload)}else l(new c(i.ErrorCodes.DialogClosedByUser,"Extension dialog closed by user."));e()})}).catch(e=>{l(e)})})}sendDialogMessageAsync(e,t){o.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService").sendDialogMessageAsync(e,t)}sendDialogMessageToParentAsync(e){if(!this.isExtensionDialog)throw new o.TableauError(i.ErrorCodes.InternalError,"sendDialogMessageToParentAsync can only be called from an extension dialog.");o.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService").sendDialogMessageToParentAsync(e)}closeDialog(e,t){o.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService").closeDialog(e,t)}initializeEvents(){const e=new Array;let t;try{t=o.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new o.SingleEventManagerImpl(a.TableauEventType.DialogMessageReceived);return t.registerHandler(n.NotificationId.ExtensionDialogMessage,()=>!0,e=>{r.triggerEvent(()=>new d(e.message,e.sourceDialogUrl))}),e.push(r),e}}},3855:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},3916:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},3964:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorksheetImpl=void 0;const a=r(5691),i=r(5691),n=r(4602),o=r(8810),s=r(1273),l=r(2140),d=r(3267),c=r(2782),u=r(7887),p=r(8935);class m extends p.SheetImpl{constructor(e,t,r,a,i,n=null,o=null){super(e,t),this._visualId=r,this._parentDashboardImpl=a,this._parentStoryPointImpl=i,this._backgroundColor=n,this._formatting=o}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,s.GetDataType.Summary,!!e.ignoreAliases,!!e.ignoreSelection,!0,e.columnsToIncludeById||[],e.maxRows||0,e.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!==(t=e.applyWorksheetFormatting)&&void 0!==t&&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)&&void 0!==r&&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,s.GetDataType.Underlying,!!e.ignoreAliases,!!e.ignoreSelection,!!e.includeAllColumns,e.columnsToIncludeById||[],e.maxRows||0,e.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!==(t=e.applyWorksheetFormatting)&&void 0!==t&&t)}getUnderlyingTablesAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getUnderlyingTablesAsync(this.visualId).then(e=>e.map(e=>new o.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)&&void 0!==r&&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)&&void 0!==a&&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=m},3980:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},4227:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExtensionWorkbookImpl=void 0;const a=r(7464),i=r(8518);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},4301:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Settings=void 0;const a=r(7464);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},4328:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},4369:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExternalToInternalEnumMappings=void 0;const a=r(5691),i=r(6636),n=r(130);class o{}t.ExternalToInternalEnumMappings=o,o.filterDomainType=new n.EnumConverter({[a.FilterDomainType.Relevant]:i.FilterDomainType.Relevant,[a.FilterDomainType.Database]:i.FilterDomainType.Database}),o.nullOptions=new n.EnumConverter({[a.FilterNullOption.AllValues]:i.FilterNullOption.AllValues,[a.FilterNullOption.NonNullValues]:i.FilterNullOption.NonNullValues,[a.FilterNullOption.NullValues]:i.FilterNullOption.NullValues}),o.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}),o.setVisibilityType=new n.EnumConverter({[a.ZoneVisibilityType.Show]:!0,[a.ZoneVisibilityType.Hide]:!1}),o.setReplaySpeedType=new n.EnumConverter({[a.ReplaySpeedType.Slow]:2,[a.ReplaySpeedType.Normal]:1,[a.ReplaySpeedType.Fast]:.5}),o.sheetType=new n.EnumConverter({[a.SheetType.Dashboard]:i.SheetType.Dashboard,[a.SheetType.Worksheet]:i.SheetType.Worksheet,[a.SheetType.Story]:i.SheetType.Story}),o.showDataTableFormatType=new n.EnumConverter({[a.IncludeDataValuesOption.AllValues]:i.ApiShowDataTableFormat.NativeAndFormattedValues,[a.IncludeDataValuesOption.OnlyNativeValues]:i.ApiShowDataTableFormat.NativeValuesOnly,[a.IncludeDataValuesOption.OnlyFormattedValues]:i.ApiShowDataTableFormat.FormattedValuesOnly}),o.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,[a.PeriodType.IsoYears]:i.DateStepPeriod.IsoYears,[a.PeriodType.IsoQuarters]:i.DateStepPeriod.IsoQuarters,[a.PeriodType.IsoWeeks]:i.DateStepPeriod.IsoWeeks}),o.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}),o.dialogStyles=new n.EnumConverter({[a.DialogStyle.Window]:i.DialogStyle.Window,[a.DialogStyle.Modal]:i.DialogStyle.Modal,[a.DialogStyle.Modeless]:i.DialogStyle.Modeless})},4524:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ConnectedServer=void 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}}},4602:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataSource=void 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)}}},4633:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LegacyInternalApiDispatcherHolder=void 0;const a=r(6636);var i;!function(e){function t(e){return e&&void 0!==e.isAlpha||window.__warningIssued?(null==e?void 0:e.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)}}(i||(t.LegacyInternalApiDispatcherHolder=i={}))},4641:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FilterChangedEvent=void 0;const a=r(5691),i=r(7464),n=r(769);class o 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=o},4656:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExecuteMinorUpgradeNotification=t.ExecuteMinorUpgradeReturnExternal=t.ExecuteMinorDowngradeCallExternal=void 0,t.CreateExternalCompatibleVersionConverter=function(e,r){return o(e,r,t.ExecuteMinorDowngradeCallExternal,t.ExecuteMinorUpgradeReturnExternal,t.ExecuteMinorUpgradeNotification)},t.CreateExternalCompatibleVersionConverterWithTranslators=o;const a=r(4965),i=r(1262),n=r(396);function o(e,t,r,o,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";Object.defineProperty(t,"__esModule",{value:!0}),t.ExportHelpers=void 0;const a=r(6636),i=r(5691),n=r(3267);class o{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:o}=this.DefaultLayoutOptions;const s=this.fitRegex.exec(t),l=this.pctRegex.exec(t);s?([r,i]=s.slice(1).map(e=>Number(e)),n=a.ScaleMode.ScaleFitPages):l&&([o]=l.slice(1).map(e=>Number(e)),n=a.ScaleMode.ScalePercentage),e.pageFitHorizontal=r,e.pageFitVertical=i,e.pageScaleMode=n,e.pageScalePercent=o}}t.ExportHelpers=o,o.DefaultDataOptions={ignoreAliases:!1,columnsToIncludeById:[]},o.DefaultPDFOptions={scaling:i.PrintScaling.Automatic,pageSize:i.PrintPageSize.Letter,orientation:i.PrintOrientation.Portrait},o.DefaultLayoutOptions={imageHeight:0,imageWidth:0,pageFitHorizontal:1,pageFitVertical:1,pageOrientationOption:a.PageOrientation.Portrait,pageScaleMode:a.ScaleMode.ScaleAuto,pageScalePercent:100,pageSizeOption:a.PageSizeOption.Letter},o.fitRegex=new RegExp("fit([0-9]+)x([0-9]+)"),o.pctRegex=new RegExp("pct([0-9]+)")},4858:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.MarksSelectedEvent=void 0;const a=r(5691),i=r(769);class n extends i.TableauWorksheetEvent{constructor(e){super(a.TableauEventType.MarkSelectionChanged,e)}getMarksAsync(){return this.worksheet.getSelectedMarksAsync()}}t.MarksSelectedEvent=n},4879:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},4941:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CrossFrameDispatcher=void 0;const a=r(5691);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}}}},4965:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.NotificationMinorDowngrades=t.ExecuteMinorDowngrades=t.ExecuteMinorUpgrades=void 0,t.VersionLessThan=function(e,t){return!(e.major>t.major)&&(e.majoru)throw new Error(`External version must be less than or equal to platform version.\n externalMajorVersion=${d} platformMajorVersion=${u}`);if(o(e,t))return new a.IdentityVersionConverter;const p=l(d,u,c,r),m=l(d,u,c,n),h=l(d,u,c,s);return m.reverse(),h.reverse(),i.StackingVersionConverter.fromData(e,t,p,m,h)}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,o=d(Object.keys(a[n]));for(let e=t;e<=o;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.ExecuteMinorUpgrades={1:{9:[]}},t.ExecuteMinorDowngrades={1:{5:[n.DowngradeWorksheetNames],9:[],175:[n.DowngradeWorksheetFomatting175],182:[n.DowngradeExtensionEnvironmentContext],189:[n.DowngradePeriodType]}},t.NotificationMinorDowngrades={1:{9:[],10:[n.DowngradeFlipboardZoneID],175:[n.DowngradeWorksheetFomattingNotification175]}}},5144:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SupportedTableauFontFaces=t.TableauSemiBoldFontFaceName=t.TableauRegularFontFaceName=t.TableauMediumFontFaceName=t.TableauLightFontFaceName=t.TableauBoldFontFaceName=t.TableauBookFontFaceName=t.TableauBoldFontFamilyName=t.TableauSemiboldFontFamilyName=t.TableauMediumFontFamilyName=t.TableauRegularFontFamilyName=t.TableauLightFontFamilyName=t.TableauBookFontFamilyName=void 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]},5204:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.InitializationServiceImpl=void 0;const a=r(6636),i=r(7464);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},5231:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Parameter=void 0;const a=r(5691),i=r(6636),n=r(7464),o=r(6944),s=r(8518);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(s.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 o.ParameterChangedEvent(t,e))}),t.push(l),t}}t.Parameter=l},5310:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},5412:(e,t,r)=>{"use strict";var a;r.r(t),r.d(t,{NIL:()=>C,parse:()=>y,stringify:()=>c,v1:()=>g,v3:()=>A,v4:()=>_,v5:()=>F,validate:()=>s,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 o=/^(?:[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&&o.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(!s(r))throw TypeError("Stringified UUID is invalid");return r};var u,p,m=0,h=0;const g=function(e,t,r){var a=t&&r||0,i=t||new Array(16),o=(e=e||{}).node||u,s=void 0!==e.clockseq?e.clockseq:p;if(null==o||null==s){var l=e.random||(e.rng||n)();null==o&&(o=u=[1|l[0],l[1],l[2],l[3],l[4],l[5]]),null==s&&(s=p=16383&(l[6]<<8|l[7]))}var d=void 0!==e.msecs?e.msecs:Date.now(),g=void 0!==e.nsecs?e.nsecs:h+1,y=d-m+(g-h)/1e4;if(y<0&&void 0===e.clockseq&&(s=s+1&16383),(y<0||d>m)&&void 0===e.nsecs&&(g=0),g>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");m=d,h=g,p=s;var v=(1e4*(268435455&(d+=122192928e5))+g)%4294967296;i[a++]=v>>>24&255,i[a++]=v>>>16&255,i[a++]=v>>>8&255,i[a++]=255&v;var I=d/4294967296*1e4&268435455;i[a++]=I>>>8&255,i[a++]=255&I,i[a++]=I>>>24&15|16,i[a++]=I>>>16&255,i[a++]=s>>>8|128,i[a++]=255&s;for(var S=0;S<6;++S)i[a+S]=o[S];return t||c(i)},y=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 v(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 f(e,t,r,a,i,n){return S((o=S(S(t,e),S(a,n)))<<(s=i)|o>>>32-s,r);var o,s}function b(e,t,r,a,i,n,o){return f(t&r|~t&a,e,t,i,n,o)}function T(e,t,r,a,i,n,o){return f(t&a|r&~a,e,t,i,n,o)}function P(e,t,r,a,i,n,o){return f(t^r^a,e,t,i,n,o)}function E(e,t,r,a,i,n,o){return f(r^(t|~a),e,t,i,n,o)}const A=v("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,o=parseInt(a.charAt(n>>>4&15)+a.charAt(15&n),16);t.push(o)}return t}(function(e,t){e[t>>5]|=128<>5]|=(255&e[a/8])<>>32-t}const F=v("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=I,I=v,v=w(y,30)>>>0,y=g,g=T}r[0]=r[0]+g>>>0,r[1]=r[1]+y>>>0,r[2]=r[2]+v>>>0,r[3]=r[3]+I>>>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]]}),C="00000000-0000-0000-0000-000000000000",x=function(e){if(!s(e))throw TypeError("Invalid UUID");return parseInt(e.substr(14,1),16)}},5493:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.registerAllSharedServices=function(e,t){a.ApiServiceRegistry.get(t).registerService(new n.AnimationServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new s.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 p.NotificationServiceImpl(e)),a.ApiServiceRegistry.get(t).registerService(new m.ParametersServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new h.SelectionServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new o.AnnotationServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new I.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 v.VizServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new d.ExternalContextMenuServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new i.AccessibilityServiceImpl(e,t))};const a=r(2140),i=r(9074),n=r(6048),o=r(9153),s=r(1401),l=r(9640),d=r(677),c=r(7852),u=r(2414),p=r(1611),m=r(7742),h=r(9216),g=r(6261),y=r(3293),v=r(9605),I=r(7640)},5520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.RangeDomain=t.CategoricalDomain=t.RelativeDateFilter=t.RangeFilter=t.HierarchicalFilter=t.HierarchicalLevelDetail=t.HierarchicalDataValue=t.CategoricalFilter=t.Filter=void 0;const a=r(5691),i=r(2140),n=r(2782);class o{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=o,t.CategoricalFilter=class extends o{constructor(e,t,r,a,i,n,o,s){super(e,t,a,r,i),this._appliedValues=n,this._isExcludeMode=o,this._isAllSelected=s}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 o{constructor(e,t,r,a,i,n,o,s,l,d,c){super(e,t,a,r,i),this._dimensionName=n,this._hierarchyCaption=o,this._numberOfLevels=s,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 o{constructor(e,t,r,a,i,n,o,s){super(e,t,a,r,i),this._min=n,this._max=o,this._includeNullValues=s}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 o{constructor(e,t,r,a,i,n,o,s,l){super(e,t,a,r,i),this._anchorDate=n,this._periodType=o,this._rangeType=s,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}}},5691:function(e,t,r){"use strict";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,i)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),i=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),i(r(460),t),i(r(6191),t)},5848:(e,t)=>{"use strict";var r,a,i,n,o,s,l,d,c,u,p,m,h,g,y,v;Object.defineProperty(t,"__esModule",{value:!0}),t.TableauDialogType=t.ApiMenuType=t.TableauEventType=t.PulseErrorMessageVisibility=t.PulseTimeDimension=t.PulseLayout=t.SheetSizeBehavior=t.Toolbar=t.ToolbarButtons=t.RevertVizSelection=t.PrintScaling=t.PrintPageSize=t.PrintOrientation=t.EmbeddingErrorCodes=t.DeviceType=t.CrosstabFileFormat=void 0,function(e){e.CSV="csv",e.Excel="xlsx"}(r||(t.CrosstabFileFormat=r={})),function(e){e.Default="default",e.Desktop="desktop",e.Tablet="tablet",e.Phone="phone"}(a||(t.DeviceType=a={})),function(e){e.AuthFailed="auth-failed",e.BrowserNotCapable="browser-not-capable",e.DownloadWorkbookNotAllowed="download-workbook-not-allowed",e.FilterCannotBePerformed="filter-cannot-be-performed",e.IndexOutOfRange="index-out-of-range",e.InternalError="internal-error",e.InvalidCustomViewName="invalid-custom-view-name",e.InvalidDateParameter="invalid-date-parameter",e.invalidFilterFieldNameOrValue="invalid-filter-field-name",e.InvalidParameter="invalid-parameter",e.InvalidTimeDimension="invalid-time-dimension",e.InvalidSize="invalid-size",e.InvalidSheetType="invalid-sheet-type",e.InvalidSizeBehavior="invalid-size-behavior",e.InvalidSizeBehaviorOnWorksheet="invalid-size-behavior-on-worksheet",e.InvalidUrl="invalid-url",e.MissingMaxSize="missing-max-size",e.MissingMinSize="missing-min-size",e.MissingMinMaxSize="missing-min-max-size",e.MissingParameter="missing-parameter",e.MissingRangeNForRelativeDateFilters="missing-range-n-for-relative-date-filters",e.NoUrlForHiddenWorksheet="no-url-for-hidden-worksheet",e.NoUrlOrParentElementNotFound="no-url-or-parent-element-not-found",e.NotActiveSheet="not-active-sheet",e.NullOrEmptyParameter="null-or-empty-parameter",e.SheetNotInWorkbook="sheet-not-in-workbook",e.StaleDataReference="stale-data-reference",e.UnknownAuthError="unknown-auth-error",e.UnsupportedEventName="unsupported-event-name",e.VizAlreadyInManager="viz-already-in-manager",e.ImplementationError="wrong-implementation",e.NotImplemented="not-implemented",e.EventInitializationError="event-initialization-error",e.IncompatibleVersionError="incompatible-version-error",e.UnknownDialogType="unknown-dialog-type",e.FilterMissingOrNotImplemented="filter-missing-not-implemented",e.StoryPointIdMismatch="storypoint-id-mismatch"}(i||(t.EmbeddingErrorCodes=i={})),function(e){e.Portrait="portrait",e.Landscape="landscape"}(n||(t.PrintOrientation=n={})),function(e){e.Letter="letter",e.Legal="legal",e.Note="note",e.Folio="folio",e.Tabloid="tabloid",e.Ledger="ledger",e.Statement="statement",e.Executive="executive",e.A3="A3",e.A4="A4",e.A5="A5",e.B4="B4",e.B5="B5",e.Quarto="quarto",e.Unspecified="unspecified"}(o||(t.PrintPageSize=o={})),function(e){e.Automatic="automatic",e.Perc25="25%",e.Perc50="50%",e.Perc60="60%",e.Perc75="75%",e.Perc80="80%",e.Perc90="90%",e.Perc100="100%",e.Perc200="200%",e.Perc400="400%",e.AtMost1PageHigh="at-most-1-page-high",e.AtMost2PagesHigh="at-most-2-pages-high",e.AtMost1PageWide="at-most-1-page-wide",e.AtMost2PagesWide="at-most-2-pages-wide"}(s||(t.PrintScaling=s={})),function(e){e.All="all",e.Axes="axes",e.Filters="filters",e.Sorts="sorts",e.Shelves="shelves"}(l||(t.RevertVizSelection=l={})),function(e){e.Alerts="alerts",e.AskData="askData",e.CustomViews="customViews",e.DataDetails="dataDetails",e.Share="share",e.Subscribe="subscribe"}(d||(t.ToolbarButtons=d={})),function(e){e.Top="top",e.Bottom="bottom",e.Hidden="hidden"}(c||(t.Toolbar=c={})),function(e){e.Automatic="automatic",e.Exactly="exactly",e.Range="range",e.AtLeast="atleast",e.AtMost="atmost"}(u||(t.SheetSizeBehavior=u={})),function(e){e.Default="default",e.Card="card",e.Ban="ban"}(p||(t.PulseLayout=p={})),function(e){e.Today="Today",e.Yesterday="Yesterday",e.WeekToDate="WeekToDate",e.LastWeek="LastWeek",e.MonthToDate="MonthToDate",e.LastMonth="LastMonth",e.QuarterToDate="QuarterToDate",e.LastQuarter="LastQuarter",e.YearToDate="YearToDate",e.LastYear="LastYear"}(m||(t.PulseTimeDimension=m={})),function(e){e.Visible="visible",e.Hidden="hidden",e.Suppressed="suppressed"}(h||(t.PulseErrorMessageVisibility=h={})),function(e){e.CustomViewLoaded="customviewloaded",e.CustomViewRemoved="customviewremoved",e.CustomViewSaved="customviewsaved",e.CustomViewSetDefault="customviewsetdefault",e.EditButtonClicked="editbuttonclicked",e.EditInDesktopButtonClicked="editindesktopbuttonclicked",e.FilterChanged="filterchanged",e.FirstVizSizeKnown="firstvizsizeknown",e.FirstInteractive="firstinteractive",e.CustomMarkContextMenuEvent="custommarkcontextmenu",e.MarkSelectionChanged="markselectionchanged",e.ParameterChanged="parameterchanged",e.ToolbarStateChanged="toolbarstatechanged",e.WorkbookReadyToClose="workbookreadytoclose",e.WorkbookPublished="workbookpublished",e.WorkbookPublishedAs="workbookpublishedas",e.UrlAction="urlaction",e.TabSwitched="tabswitched",e.StoryPointSwitched="storypointswitched",e.VizLoadError="vizloaderror",e.IframeSrcUpdated="iframesrcupdated",e.SummaryDataChanged="summarydatachanged",e.ReadyToReceiveAuthToken="readytoreceiveauthtoken",e.FirstPulseMetricSizeKnown="firstpulsemetricsizeknown",e.PulseError="pulseerror",e.PulseFiltersChanged="pulsefilterschanged",e.PulseInsightDiscovered="pulseinsightdiscovered",e.PulseMetricSizeChanged="pulsemetricsizechanged",e.PulseTimeDimensionChanged="pulsetimedimensionchanged",e.PulseUrlChanged="pulseurlchanged"}(g||(t.TableauEventType=g={})),function(e){e.Ubertip="ubertip"}(y||(t.ApiMenuType=y={})),function(e){e.ExportPDF="export-pdf",e.ExportPowerPoint="export-powerpoint",e.ExportData="export-data",e.ExportCrossTab="export-cross-tab",e.ExportWorkbook="export-workbook",e.Share="share"}(v||(t.TableauDialogType=v={}))},5877: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 o(e){try{l(a.next(e))}catch(e){n(e)}}function s(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(o,s)}l((a=a.apply(e,t||[])).next())})};Object.defineProperty(t,"__esModule",{value:!0}),t.DataTableReader=void 0;const i=r(2140),n=r(2782);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}),t.SingleEventManagerImpl=void 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}}}},5949:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.IdentityVersionConverter=void 0,t.IdentityVersionConverter=class{upgradeExecuteCall(e,t){return{verb:e,parameters:t}}downgradeExecuteReturn(e){return e}downgradeNotification(e){return e}}},6048:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AnimationServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(4369),o=r(2782),s=r(1891);class l extends s.ServiceImplBase{get serviceName(){return"animation-service"}replayAsync(e){const t={[i.ParameterId.ReplaySpeed]:1};return o.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},6191:function(e,t,r){"use strict";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,i)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),i=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.VizImageSortDirectionType=t.VizImageSizeSettingType=t.VizImageSizeSettingAlignmentType=t.VizImagePaletteType=t.VizImageEncodingType=t.TableauEventType=t.ExtensionMode=t.ExtensionContext=t.ExportedMediaType=t.ErrorCodes=void 0,i(r(4328),t);var n=r(154);Object.defineProperty(t,"ErrorCodes",{enumerable:!0,get:function(){return n.ErrorCodes}}),Object.defineProperty(t,"ExportedMediaType",{enumerable:!0,get:function(){return n.ExportedMediaType}}),Object.defineProperty(t,"ExtensionContext",{enumerable:!0,get:function(){return n.ExtensionContext}}),Object.defineProperty(t,"ExtensionMode",{enumerable:!0,get:function(){return n.ExtensionMode}}),Object.defineProperty(t,"TableauEventType",{enumerable:!0,get:function(){return n.TableauEventType}}),Object.defineProperty(t,"VizImageEncodingType",{enumerable:!0,get:function(){return n.VizImageEncodingType}}),Object.defineProperty(t,"VizImagePaletteType",{enumerable:!0,get:function(){return n.VizImagePaletteType}}),Object.defineProperty(t,"VizImageSizeSettingAlignmentType",{enumerable:!0,get:function(){return n.VizImageSizeSettingAlignmentType}}),Object.defineProperty(t,"VizImageSizeSettingType",{enumerable:!0,get:function(){return n.VizImageSizeSettingType}}),Object.defineProperty(t,"VizImageSortDirectionType",{enumerable:!0,get:function(){return n.VizImageSortDirectionType}}),i(r(2332),t),i(r(3980),t),i(r(2671),t),i(r(9770),t)},6261:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SizeServiceImpl=void 0;const a=r(6636),i=r(1891);class n extends i.ServiceImplBase{get serviceName(){return"size-service"}changeSizeAsync(e,t){var r,i,n,o;const s={[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===(o=t.maxSize)||void 0===o?void 0:o.width)||0};return this.execute(a.VerbId.SetSheetSize,s).then(e=>{})}}t.SizeServiceImpl=n},6300:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},6517:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},6538:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Extensions=void 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)}reportExtensionRenderComplete(e){return this.extensionImpl.reportExtensionRenderComplete(e)}}},6575:e=>{"use strict";var t;!function(e){let t,r,a,i,n,o,s,l,d,c,u,p,m,h,g,y,v,I,S,f,b,T,P,E,A,_,D,w,F,C,x,M;!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"}(o=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"}(s=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"}(p=e.FieldAggregationType||(e.FieldAggregationType={})),function(e){e.Dimension="dimension",e.Measure="measure",e.Unknown="unknown"}(m=e.FieldRoleType||(e.FieldRoleType={})),function(e){e.Categorical="categorical",e.Range="range",e.Hierarchical="hierarchical",e.RelativeDate="relative-date"}(h=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"}(v=e.FilterNullOption||(e.FilterNullOption={})),function(e){e.AllValues="all-values",e.OnlyNativeValues="only-native-values",e.OnlyFormattedValues="only-formatted-values"}(I=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.AutoFormat="auto-format",e.SystemNumber="system-number",e.SystemCurrency="system-currency",e.SystemLongDate="system-long-date",e.SystemShortDate="system-short-date",e.SystemTime="system-time",e.Custom="custom",e.CustomNumber="custom-number",e.CustomCurrency="custom-currency",e.CustomScientific="custom-scientific",e.CustomPercentage="custom-percentage"}(f=e.DataFormatType||(e.DataFormatType={})),function(e){e.None="units-none",e.Thousands="units-thousands",e.Millions="units-millions",e.BillionsEnglish="units-billions-english",e.BillionsStandard="units-billions-standard"}(b=e.NumberFormatUnits||(e.NumberFormatUnits={})),function(e){e.Automatic="automatic",e.Parentheses="parentheses",e.OuterPrefix="outer-prefix",e.OuterSuffix="outer-suffix",e.InnerPrefix="inner-prefix",e.InnerSuffix="inner-suffix"}(T=e.NegativeNumberFormat||(e.NegativeNumberFormat={})),function(e){e.All="all",e.List="list",e.Range="range"}(P=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",e.IsoYears="iso-years",e.IsoQuarters="iso-quarters",e.IsoWeeks="iso-weeks"}(E=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"}(A=e.QuickTableCalcType||(e.QuickTableCalcType={})),function(e){e.Replace="select-replace",e.Add="select-add",e.Remove="select-remove"}(_=e.SelectionUpdateType||(e.SelectionUpdateType={})),function(e){e.Simple="select-options-simple",e.Toggle="select-options-toggle"}(D=e.SelectOptions||(e.SelectOptions={})),function(e){e.Dashboard="dashboard",e.Story="story",e.Worksheet="worksheet"}(w=e.SheetType||(e.SheetType={})),function(e){e.Increasing="increasing",e.Decreasing="decreasing"}(F=e.SortDirection||(e.SortDirection={})),function(e){e.Linear="linear",e.Logarithmic="logarithmic",e.Exponential="exponential",e.Polynomial="polynomial"}(C=e.TrendLineModelType||(e.TrendLineModelType={})),function(e){e.Slow="slow",e.Normal="normal",e.Fast="fast"}(x=e.ReplaySpeedType||(e.ReplaySpeedType={})),function(e){e.AllSelected="all-selected",e.NoneSelected="none-selected",e.SomeSelected="some-selected",e.UnknownSelected="unknown-selected"}(M=e.HierarchicalLevelSelectionState||(e.HierarchicalLevelSelectionState={})),e.ZoneVisibilityType=Object.assign({},o)}(t||(t={})),e.exports=t},6583:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DowngradeWorksheetFomattingNotification175=t.DowngradeWorksheetFomatting175=void 0,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},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},t.DowngradePeriodType=function(e){if(Array.isArray(e.result)){const t=e.result;for(const e of t)o(e)}else o(e.result);return e};const a=r(6636),i=r(6677),n=["tableau-row-dividers","tableau-column-dividers","tableau-pane"];function o(e){e.allowableValuesType===a.DomainRestrictionType.Range&&(e.dateStepPeriod===a.DateStepPeriod.IsoYears?e.dateStepPeriod=a.DateStepPeriod.Years:e.dateStepPeriod===a.DateStepPeriod.IsoQuarters?e.dateStepPeriod=a.DateStepPeriod.Quarters:e.dateStepPeriod===a.DateStepPeriod.IsoWeeks&&(e.dateStepPeriod=a.DateStepPeriod.Weeks))}t.DowngradeWorksheetFomatting175=e=>function(e,t){var r;const a=e.result;return(null===(r=null==a?void 0:a.extensionWorksheetInfo)||void 0===r?void 0:r.formatting)&&(a.extensionWorksheetInfo.formatting.formattingSheets=a.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)},6636:function(e,t,r){"use strict";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,i)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),i=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.MESSAGING_VERSION=t.INTERNAL_CONTRACT_VERSION=void 0;const n=r(8347);t.INTERNAL_CONTRACT_VERSION=n,i(r(3153),t),i(r(9875),t),i(r(1647),t),i(r(6677),t),i(r(7193),t),i(r(2219),t),i(r(1768),t),i(r(1596),t),i(r(2616),t),i(r(7664),t),i(r(7515),t),i(r(822),t),i(r(385),t),i(r(4879),t),i(r(386),t),i(r(8709),t),i(r(5310),t),i(r(6517),t),i(r(742),t),i(r(1262),t),i(r(4656),t),i(r(3916),t),i(r(4965),t),t.MESSAGING_VERSION={major:1,minor:0,fix:0}},6658:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.UnregisterTimeoutInMilliseconds=t.Deferred=void 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},6677:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.NotificationId=void 0,function(e){e.CustomMarkContextMenuClicked="custom-mark-context-menu-clicked",e.ContextMenuClick="context-menu-click",e.CustomViewRemoved="custom-view-removed",e.CustomViewSaved="custom-view-saved",e.CustomViewSetDefault="custom-view-set-default",e.CustomViewsLoaded="custom-views-loaded",e.DashboardLayoutChanged="dashboard-layout-changed",e.EditButtonClicked="edit-button-clicked",e.EditInDesktopButtonClicked="edit-in-desktop-button-clicked",e.ExtensionDialogUpdate="extension-dialog-update",e.ExtensionDialogMessage="extension-dialog-message",e.FilterChanged="filter-changed",e.FirstVizSizeKnown="first-viz-size-known",e.FirstPulseMetricSizeKnown="first-pulse-metric-size-known",e.ParameterChanged="parameter-changed",e.PulseError="pulse-error",e.PulseFiltersChanged="pulse-filters-changed",e.PulseMetricSizeChanged="pulse-metric-size-changed",e.PulseInsightDiscovered="pulse-insight-discovered",e.PulseInteractive="pulse-interactive",e.PulseTimeDimensionChanged="pulse-time-dimension-changed",e.PulseUrlChanged="pulse-url-changed",e.SelectedMarksChanged="selected-marks-changed",e.SettingsChanged="settings-changed",e.SummaryDataChanged="summary-data-changed",e.TestConversionNotification="test-conversion-notification",e.ToolbarStateChanged="toolbar-state-changed",e.VizInteractive="viz-interactive",e.AskDataInteractive="ask-data-interactive",e.WorkbookReadyToClose="workbook-ready-to-close",e.WorkbookFormattingChanged="workbook-formatting-changed",e.WorkbookPublished="workbook-published",e.WorkbookPublishedAs="workbook-published-as",e.WorksheetFormattingChanged="worksheet-formatting-changed",e.UrlAction="url-action",e.TabSwitched="tab-switched",e.StoryPointSwitched="story-point-switched",e.ReadyToReceiveAuthToken="ready-to-receive-auth-token"}(r||(t.NotificationId=r={}))},6707:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},6743:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},6753:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.InternalToExternalEnumMappings=void 0;const a=r(5691),i=r(6636),n=r(130);class o{}t.InternalToExternalEnumMappings=o,o.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}),o.dataFormatType=new n.EnumConverter({[i.DataFormatType.AutoFormat]:a.DataFormatType.AutoFormat,[i.DataFormatType.SystemNumber]:a.DataFormatType.SystemNumber,[i.DataFormatType.SystemCurrency]:a.DataFormatType.SystemCurrency,[i.DataFormatType.SystemLongDate]:a.DataFormatType.SystemLongDate,[i.DataFormatType.SystemShortDate]:a.DataFormatType.SystemShortDate,[i.DataFormatType.SystemTime]:a.DataFormatType.SystemTime,[i.DataFormatType.Custom]:a.DataFormatType.Custom,[i.DataFormatType.CustomNumber]:a.DataFormatType.CustomNumber,[i.DataFormatType.CustomCurrency]:a.DataFormatType.CustomCurrency}),o.numberFormatUnits=new n.EnumConverter({[i.NumberFormatUnits.None]:a.NumberFormatUnits.None,[i.NumberFormatUnits.Thousands]:a.NumberFormatUnits.Thousands,[i.NumberFormatUnits.Millions]:a.NumberFormatUnits.Millions,[i.NumberFormatUnits.BillionsEnglish]:a.NumberFormatUnits.BillionsEnglish,[i.NumberFormatUnits.BillionsStandard]:a.NumberFormatUnits.BillionsStandard}),o.negativeNumberFormat=new n.EnumConverter({[i.NegativeNumberFormat.Automatic]:a.NegativeNumberFormat.Automatic,[i.NegativeNumberFormat.Parentheses]:a.NegativeNumberFormat.Parentheses,[i.NegativeNumberFormat.OuterPrefix]:a.NegativeNumberFormat.OuterPrefix,[i.NegativeNumberFormat.OuterSuffix]:a.NegativeNumberFormat.OuterSuffix,[i.NegativeNumberFormat.InnerPrefix]:a.NegativeNumberFormat.InnerPrefix,[i.NegativeNumberFormat.InnerSuffix]:a.NegativeNumberFormat.InnerSuffix}),o.extensionMode=new n.EnumConverter({[i.ExtensionMode.Authoring]:a.ExtensionMode.Authoring,[i.ExtensionMode.Viewing]:a.ExtensionMode.Viewing}),o.exportedMediaType=new n.EnumConverter({[i.ExportedMediaType.Image]:a.ExportedMediaType.Image,[i.ExportedMediaType.Pdf]:a.ExportedMediaType.Pdf,[i.ExportedMediaType.Svg]:a.ExportedMediaType.Svg,[i.ExportedMediaType.Html]:a.ExportedMediaType.Html,[i.ExportedMediaType.PowerPoint]:a.ExportedMediaType.PowerPoint,[i.ExportedMediaType.Excel]:a.ExportedMediaType.Excel}),o.columnType=new n.EnumConverter({[i.ColumnType.Continuous]:a.ColumnType.Continuous,[i.ColumnType.Discrete]:a.ColumnType.Discrete,[i.ColumnType.Unknown]:a.ColumnType.Unknown}),o.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}),o.fieldRoleType=new n.EnumConverter({[i.FieldRoleType.Dimension]:a.FieldRoleType.Dimension,[i.FieldRoleType.Measure]:a.FieldRoleType.Measure,[i.FieldRoleType.Unknown]:a.FieldRoleType.Unknown}),o.sheetType=new n.EnumConverter({[i.SheetType.Dashboard]:a.SheetType.Dashboard,[i.SheetType.Story]:a.SheetType.Story,[i.SheetType.Worksheet]:a.SheetType.Worksheet}),o.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}),o.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}),o.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}),o.allowableValues=new n.EnumConverter({[i.DomainRestrictionType.All]:a.ParameterValueType.All,[i.DomainRestrictionType.List]:a.ParameterValueType.List,[i.DomainRestrictionType.Range]:a.ParameterValueType.Range}),o.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,[i.DateStepPeriod.IsoYears]:a.PeriodType.IsoYears,[i.DateStepPeriod.IsoQuarters]:a.PeriodType.IsoQuarters,[i.DateStepPeriod.IsoWeeks]:a.PeriodType.IsoWeeks}),o.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}),o.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),o.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}),o.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}),o.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}),o.annotationType=new n.EnumConverter({[i.AnnotateEnum.Area]:a.AnnotationType.Area,[i.AnnotateEnum.Mark]:a.AnnotationType.Mark,[i.AnnotateEnum.Point]:a.AnnotationType.Point}),o.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})},6835:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.AskDataAttributes=void 0,function(e){e.Origin="origin",e.ShowEmbed="show-embed",e.ShowPin="show-pin",e.ShowSave="show-save",e.ShowShare="show-share"}(r||(t.AskDataAttributes=r={}))},6877:(e,t)=>{"use strict";var r,a,i,n;Object.defineProperty(t,"__esModule",{value:!0}),t.WebComponentChildElementAttributes=t.WebComponentChildElements=t.EmbeddedIframeAttributes=t.WebComponentAttributes=void 0,function(e){e.Src="src",e.Width="width",e.Height="height",e.Token="token",e.Debug="debug",e.IframeAuth="iframe-auth",e.OnVizLoadError="onvizloaderror",e.ForceTokenSync="force-token-sync"}(r||(t.WebComponentAttributes=r={})),function(e){e.Loading="iframe-attr-loading",e.Style="iframe-attr-style",e.Class="iframe-attr-class"}(a||(t.EmbeddedIframeAttributes=a={})),function(e){e.CustomParameter="custom-parameter",e.IframeStyle="iframe-style"}(i||(t.WebComponentChildElements=i={})),function(e){e.Field="field",e.Value="value",e.Name="name"}(n||(t.WebComponentChildElementAttributes=n={}))},6879:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},6944:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ParameterChangedEvent=void 0;const a=r(5691),i=r(7464),n=r(5231),o=r(8518),s=r(964);class l extends s.TableauSheetEvent{constructor(e,t){super(a.TableauEventType.ParameterChanged,t),this._globalFieldName=e}getParameterAsync(){return i.ApiServiceRegistry.get(o.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},6950:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ShortLivedDeferred=void 0;const a=r(5691),i=r(3267),n=r(6658);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)}}},7039:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SummaryDataChangedEvent=void 0;const a=r(5691),i=r(769);class n extends i.TableauWorksheetEvent{constructor(e){super(a.TableauEventType.SummaryDataChanged,e)}}t.SummaryDataChangedEvent=n},7193:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.ParameterId=void 0,function(e){e.ActiveTablesInfo="active-tables-info",e.AnchorDate="anchor-date",e.AnnotateEnum="annotate-enum",e.AnnotationList="annotation-list",e.ApplyWorksheetFormatting="apply-worksheet-formatting",e.CategoricalDomain="categorical-domain",e.ClickThroughEnabled="click-through-enabled",e.Columns="columns",e.ColumnsToInclude="columns-to-include",e.ColumnsToIncludeById="columns-to-include-by-id",e.ConnectionDescriptionSummaries="connection-description-summaries",e.CurrentSheetType="current-sheet-type",e.CustomView="custom-view",e.CustomViewIsDefault="custom-view-is-default",e.CustomViewIsPublic="custom-view-is-public",e.CustomViewLuid="custom-view-luid",e.CustomViewName="custom-view-name",e.CustomViews="custom-views",e.Dashboard="dashboard",e.DashboardFilters="dashboard-filters",e.DashboardName="dashboard",e.DashboardObjectPositionAndSizeUpdate="dashboard-object-position-and-size-update",e.DashboardObjectPositionAndSizeUpdateList="dashboard-object-position-and-size-update-list",e.DataRowIndex="data-row-index",e.DataSchema="data-schema",e.DataSource="data-source",e.DataSourceDataTable="data-source-data-table",e.DataSourceId="data-source-id",e.DataSourceName="data-source-name",e.DataTable="data-table",e.DataTableReader="data-table-reader",e.DateRangeType="date-range-type",e.DeleteCount="delete-count",e.DeltaTimeMs="delta-time-ms",e.DimValSelectionModels="dimensionValueSelectionModels",e.DomainType="domain-type",e.EmbeddingAbstractQuery="embedding-abstract-query",e.EmbeddingBootstrapInfo="embedding-bootstrap-info",e.EncodingType="encoding-type",e.ExportCrosstabSheetMap="export-crosstab-sheet-map",e.ExportFile="export-file",e.ExportOriginUrl="export-origin-url",e.ExportPdfOptions="export-pdf-options",e.ExtensionBootstrapInfo="extension-bootstrap-info",e.ExtensionContextMenuIds="extension-context-menu-ids",e.ExtensionDialogH="extension-dialog-height",e.ExtensionDialogMessage="extension-dialog-message",e.ExtensionDialogPayload="extension-dialog-payload",e.ExtensionDialogResult="extension-dialog-result",e.ExtensionDialogStyle="extension-dialog-style",e.ExtensionDialogUrl="extension-dialog-url",e.ExtensionDialogUrlSource="extension-dialog-url-source",e.ExtensionDialogW="extension-dialog-width",e.ExtensionLocator="extension-locator",e.ExtensionSettingsInfo="extension-settings-info",e.ExtensionZoneId="extension-zone-id",e.ExtensionMediaBlob="extension-media-blob",e.HasExtensionRenderingTimedOut="has-extension-rendering-timed-out",e.ExternalMenuDescription="external-menu-description",e.ExternalMenuHeader="external-menu-header",e.ExternalMenuItemDisplayName="external-menu-item-display-name",e.ExternalMenuItemId="external-menu-item-id",e.Field="field",e.FieldCount="field-count",e.FieldId="field-id",e.FieldName="field-name",e.FilterLevels="filter-levels",e.FilterRangeMax="filter-range-max",e.FilterRangeMin="filter-range-min",e.FilterRangeNullOption="filter-range-null-option",e.FilterUpdateType="filter-update-type",e.FilterValues="filter-values",e.FontNameListItems="font-name-list-items",e.FormattedText="formatted-text",e.FunctionName="function-name",e.FromIndex="from-index",e.HierValSelectionModels="hierarchicalValueSelectionModels",e.HighlightedData="highlighted-data",e.HoverTupleInteraction="hover-tuple-interaction",e.IgnoreAliases="ignore-aliases",e.IgnoreSelection="ignore-selection",e.IncludeAllColumns="include-all-columns",e.InvalidAggFieldName="invalid-agg-field-name",e.InvalidDates="invalid-dates",e.InvalidFieldCaption="invalid-field-caption",e.InvalidFields="invalid-fields",e.InvalidValues="invalid-values",e.IsAnalyticsAssistantAvailable="is-analytics-assistant-available",e.IsExcludeMode="is-exclude",e.IsExtensionDialog="is-extension-dialog",e.IsFromCalcDialog="is-from-calc-dialog",e.JoinDescription="join-description",e.LogicalTableId="logical-table-id",e.LogicalTableInfoList="logical-table-info-list",e.MarksCardIndex="marks-card-index",e.MaxHeight="max-height",e.MaxRows="max-rows",e.MaxWidth="max-width",e.MinHeight="min-height",e.MinWidth="min-width",e.PageRowCount="page-row-count",e.ParameterCaption="paremeter-caption",e.ParameterError="parameter-error",e.ParameterFieldName="parameter-field-name",e.ParameterInfo="parameter-info",e.ParameterInfos="parameter-infos",e.ParameterValue="parameter-value",e.PeriodType="period-type",e.PulseFieldName="fieldName",e.PulseFieldNames="fieldNames",e.PulseFilterDomainType="domainType",e.PulseFilterDomainSearchTerm="searchTerm",e.PulsePageSize="pageSize",e.PulseNextPageToken="nextPageToken",e.PulseFilters="filters",e.PulseTimeDimension="timeDimension",e.QuantitativeDomain="quantitative-dmain",e.QuantRangeSelectionModels="quantativeRangeSelectionModels",e.RangeN="range-n",e.ReplaySpeed="replay-speed",e.SelectedData="selected-data",e.SelectedSheetNames="selected-sheet-names",e.Selection="selection",e.SelectionList="selection-list",e.SelectionUpdateType="selectionUpdateType",e.SelectTuplesInteraction="select-tuples-interaction",e.SendNotifications="send-notifications",e.SettingsValues="settings-values",e.SharedFilterSheets="shared-filter-sheets",e.SharedFiltersInfo="shared-filters-info",e.SheetIdentifier="sheet-identifier",e.SheetName="sheet-name",e.SheetPath="sheet-path",e.ShouldRefreshDS="should-refresh-ds",e.ShowDataTableFormat="show-data-table-format",e.StartIndex="start-index",e.State="state",e.StoryPointIndex="story-point-index",e.StoryPointInfo="story-point-info",e.SwitchToSheetName="switch-to-sheet-name",e.TargetPoint="target-point",e.TestConversionParameter="test-conversion-parameter",e.Text="formatted-text",e.ToIndex="to-index",e.TooltipContext="tooltip-context",e.TooltipTextRequest="tooltip-text-request",e.TooltipText="tooltip-text",e.UnderlyingDataTable="underlying-data-table",e.UnderlyingSummaryDataTable="underlying-summary-data-table",e.Url="url",e.UseTabDelimiters="use-tab-delimiters",e.ViewDataTableCacheId="view-data-table-cache-id",e.ViewDataTableId="view-data-table-id",e.VisualId="visual-id",e.VisualSpecification="visual-specification",e.VizAPIInputJson="vizapi-input-json",e.VizAPIStateWithDataModel="vizapi-state-with-data-model",e.VizAPIStateWarningMsg="vizapi-state-warning-msg",e.VizAPISVG="vizapi-svg",e.WorksheetName="worksheet-name",e.WorksheetFilters="worksheet-filters",e.ZoneIdsVisibilityMap="zone-ids-visibility-map"}(r||(t.ParameterId=r={}))},7316:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},7464:function(e,t,r){"use strict";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,i)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),i=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.VersionedExternalApiDispatcher=t.VersionNumber=t.SheetUtils=t.ExportHelpers=t.ErrorHelpers=t.Deferred=t.TableauError=t.StoryActivationServiceImpl=t.SizeServiceImpl=t.ServiceImplBase=t.Registration=t.NotificationServiceImplBase=t.NotificationServiceImpl=t.ClientInfoServiceImpl=t.Point=t.WorksheetImpl=t.WorkbookImpl=t.StoryPointInfoImpl=t.StoryPointImpl=t.StoryImpl=t.SingleEventManagerImpl=t.SheetInfoImpl=t.SheetImpl=t.ParameterImpl=t.DataSourceImpl=t.DashboardObjectImpl=t.DashboardImpl=t.CustomViewImpl=t.Field=t.EventListenerManager=t.InternalToExternalEnumMappings=t.ExternalToInternalEnumMappings=t.DataSource=t.CrossFrameDispatcher=t.ApiVersion=void 0;var n=r(9279);Object.defineProperty(t,"ApiVersion",{enumerable:!0,get:function(){return n.ApiVersion}}),i(r(9188),t);var o=r(4941);Object.defineProperty(t,"CrossFrameDispatcher",{enumerable:!0,get:function(){return o.CrossFrameDispatcher}});var s=r(4602);Object.defineProperty(t,"DataSource",{enumerable:!0,get:function(){return s.DataSource}});var l=r(4369);Object.defineProperty(t,"ExternalToInternalEnumMappings",{enumerable:!0,get:function(){return l.ExternalToInternalEnumMappings}});var d=r(6753);Object.defineProperty(t,"InternalToExternalEnumMappings",{enumerable:!0,get:function(){return d.InternalToExternalEnumMappings}});var c=r(8904);Object.defineProperty(t,"EventListenerManager",{enumerable:!0,get:function(){return c.EventListenerManager}});var u=r(8127);Object.defineProperty(t,"Field",{enumerable:!0,get:function(){return u.Field}});var p=r(3092);Object.defineProperty(t,"CustomViewImpl",{enumerable:!0,get:function(){return p.CustomViewImpl}});var m=r(2632);Object.defineProperty(t,"DashboardImpl",{enumerable:!0,get:function(){return m.DashboardImpl}});var h=r(9531);Object.defineProperty(t,"DashboardObjectImpl",{enumerable:!0,get:function(){return h.DashboardObjectImpl}});var g=r(7887);Object.defineProperty(t,"DataSourceImpl",{enumerable:!0,get:function(){return g.DataSourceImpl}});var y=r(3443);Object.defineProperty(t,"ParameterImpl",{enumerable:!0,get:function(){return y.ParameterImpl}});var v=r(8935);Object.defineProperty(t,"SheetImpl",{enumerable:!0,get:function(){return v.SheetImpl}});var I=r(9735);Object.defineProperty(t,"SheetInfoImpl",{enumerable:!0,get:function(){return I.SheetInfoImpl}});var S=r(5885);Object.defineProperty(t,"SingleEventManagerImpl",{enumerable:!0,get:function(){return S.SingleEventManagerImpl}});var f=r(9661);Object.defineProperty(t,"StoryImpl",{enumerable:!0,get:function(){return f.StoryImpl}});var b=r(7663);Object.defineProperty(t,"StoryPointImpl",{enumerable:!0,get:function(){return b.StoryPointImpl}});var T=r(1471);Object.defineProperty(t,"StoryPointInfoImpl",{enumerable:!0,get:function(){return T.StoryPointInfoImpl}});var P=r(770);Object.defineProperty(t,"WorkbookImpl",{enumerable:!0,get:function(){return P.WorkbookImpl}});var E=r(3964);Object.defineProperty(t,"WorksheetImpl",{enumerable:!0,get:function(){return E.WorksheetImpl}});var A=r(9357);Object.defineProperty(t,"Point",{enumerable:!0,get:function(){return A.Point}}),i(r(5493),t),i(r(2140),t);var _=r(1615);Object.defineProperty(t,"ClientInfoServiceImpl",{enumerable:!0,get:function(){return _.ClientInfoServiceImpl}});var D=r(1611);Object.defineProperty(t,"NotificationServiceImpl",{enumerable:!0,get:function(){return D.NotificationServiceImpl}});var w=r(8194);Object.defineProperty(t,"NotificationServiceImplBase",{enumerable:!0,get:function(){return w.NotificationServiceImplBase}}),Object.defineProperty(t,"Registration",{enumerable:!0,get:function(){return w.Registration}});var F=r(1891);Object.defineProperty(t,"ServiceImplBase",{enumerable:!0,get:function(){return F.ServiceImplBase}});var C=r(6261);Object.defineProperty(t,"SizeServiceImpl",{enumerable:!0,get:function(){return C.SizeServiceImpl}});var x=r(9753);Object.defineProperty(t,"StoryActivationServiceImpl",{enumerable:!0,get:function(){return x.StoryActivationServiceImpl}});var M=r(3267);Object.defineProperty(t,"TableauError",{enumerable:!0,get:function(){return M.TableauError}});var N=r(6658);Object.defineProperty(t,"Deferred",{enumerable:!0,get:function(){return N.Deferred}});var O=r(2782);Object.defineProperty(t,"ErrorHelpers",{enumerable:!0,get:function(){return O.ErrorHelpers}});var k=r(4706);Object.defineProperty(t,"ExportHelpers",{enumerable:!0,get:function(){return k.ExportHelpers}});var R=r(633);Object.defineProperty(t,"SheetUtils",{enumerable:!0,get:function(){return R.SheetUtils}});var V=r(2570);Object.defineProperty(t,"VersionNumber",{enumerable:!0,get:function(){return V.VersionNumber}});var z=r(9730);Object.defineProperty(t,"VersionedExternalApiDispatcher",{enumerable:!0,get:function(){return z.VersionedExternalApiDispatcher}})},7515:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},7640:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ZoneServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(4369),o=r(2782),s=r(720),l=r(1891);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 s.Param.convertParameterToMap(r,"zoneVisibilityMap").forEach((e,r)=>{o.ErrorHelpers.verifyZoneIsValid(t,Number.parseInt(r,10)),o.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=>{o.ErrorHelpers.verifyZoneIsValidAndFloating(t,e.dashboardObjectID),o.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(e)}),this.execute(i.VerbId.MoveAndResizeZones,a).then(e=>{})}}t.ZoneServiceImpl=d},7663:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StoryPointImpl=void 0;const a=r(5691),i=r(3267),n=r(633),o=r(2632),s=r(9735),l=r(3964);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,p=d?d.url:"",m=new s.SheetInfoImpl(e.name,n.SheetUtils.getSheetTypeEnum(e.sheetType),c,-1,!1,u,p);let h;switch(m.sheetType){case a.SheetType.Worksheet:{const e={worksheet:m.name};h=new l.WorksheetImpl(m,r,e,null,this);break}case a.SheetType.Dashboard:{const t={sheetName:m.name,isDashboard:!0};h=new o.DashboardImpl(m,e.dashboardZones,t,r,this);break}default:throw new i.TableauError(a.SharedErrorCodes.ServerError,"Invalid SheetType")}return h}}},7664:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.PulseOptionNames=void 0,function(e){e.embed="embed",e.token="token",e.disableExploreFilter="disableExploreFilter",e.layout="embed_layout",e.theme="embed_theme",e.ApiExternalVersion=":apiExternalVersion",e.ApiInternalVersion=":apiInternalVersion",e.EmbedCount=":embcount",e.PulseWebComponent=":pulseWebComponent"}(r||(t.PulseOptionNames=r={}))},7708:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorksheetFormattingChangedEvent=void 0;const a=r(5691),i=r(769);class n extends i.TableauWorksheetEvent{constructor(e,t){super(a.TableauEventType.WorksheetFormattingChanged,e),this._formatting=t}get formatting(){return this._formatting}}t.WorksheetFormattingChangedEvent=n},7736:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.registerAllExtensionsServices=function(e){a.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new n.SettingsServiceImpl(e,s.ExtensionsRegistryId)),a.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new o.UIServiceImpl(e,s.ExtensionsRegistryId))},t.registerInitializationExtensionsServices=function(e){a.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new i.InitializationServiceImpl(e,s.ExtensionsRegistryId))};const a=r(7464),i=r(5204),n=r(407),o=r(2594),s=r(8518)},7742:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ParametersServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(3443),o=r(3267),s=r(1891);class l extends s.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 o.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},7750:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},7832:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FieldImpl=void 0;const a=r(5691),i=r(6636),n=r(6753);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)&&void 0!==e?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}get semanticRole(){return this._fieldInfo.semanticRole}get dataFormat(){return this._fieldInfo.dataFormat}}},7852: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 o(e){try{l(a.next(e))}catch(e){n(e)}}function s(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(o,s)}l((a=a.apply(e,t||[])).next())})};Object.defineProperty(t,"__esModule",{value:!0}),t.FilterServiceImpl=void 0;const i=r(5691),n=r(6636),o=r(6636),s=r(7464),l=r(4369),d=r(6753),c=r(5520),u=r(9012),p=r(720),m=r(1891);class h extends m.ServiceImplBase{get serviceName(){return"filter-service"}applyFilterAsync(e,t,r,a,n){const d=o.VerbId.ApplyCategoricalFilter,c={[o.ParameterId.FunctionName]:"applyFilterAsync"};if(c[o.ParameterId.VisualId]=e,c[o.ParameterId.FieldName]=t,!Array.isArray(r))throw new s.TableauError(i.ErrorCodes.InvalidParameter,"values parameter for applyFilterAsync must be an array");return c[o.ParameterId.FilterValues]=r,c[o.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(a),c[o.ParameterId.IsExcludeMode]=void 0!==n&&void 0!==n.isExcludeMode&&n.isExcludeMode,this.execute(d,c).then(e=>t)}applyRangeFilterAsync(e,t,r){const a=o.VerbId.ApplyRangeFilter,i={[o.ParameterId.FunctionName]:"applyRangeFilterAsync"};if(void 0!==r.min&&null!==r.min){let e;e=r.min instanceof Date?p.Param.serializeDateForPlatform(r.min):r.min,i[o.ParameterId.FilterRangeMin]=e}if(void 0!==r.max&&null!==r.max){let e;e=r.max instanceof Date?p.Param.serializeDateForPlatform(r.max):r.max,i[o.ParameterId.FilterRangeMax]=e}return r.nullOption&&(i[o.ParameterId.FilterRangeNullOption]=l.ExternalToInternalEnumMappings.nullOptions.convert(r.nullOption)),i[o.ParameterId.FieldName]=t,i[o.ParameterId.VisualId]=e,this.execute(a,i).then(e=>(this.apiFilterHandlerCheckForCommandError(e.result),t))}applyHierarchicalFilterAsync(e,t,r,a,i){const n=o.VerbId.HierarchicalFilter,s={[o.ParameterId.FunctionName]:"applyHierarchicalFilterAsync"};s[o.ParameterId.VisualId]=e,s[o.ParameterId.FieldName]=t;const d=r.levels;return Array.isArray(d)&&d.length>0?s[o.ParameterId.FilterLevels]=d:r.length>0?s[o.ParameterId.FilterValues]=r:s[o.ParameterId.FilterLevels]=[],s[o.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(a),s[o.ParameterId.IsExcludeMode]=i&&!!i.isExcludeMode,this.execute(n,s).then(e=>t)}clearFilterAsync(e,t){const r=o.VerbId.ClearFilter,a={[o.ParameterId.FunctionName]:"clearFilterAsync"};return a[o.ParameterId.VisualId]=e,a[o.ParameterId.FieldName]=t,this.execute(r,a).then(e=>t)}applyRelativeDateFilterAsync(e,t,r){const a=o.VerbId.ApplyRelativeDateFilter,n={[o.ParameterId.FunctionName]:"applyRelativeDateFilterAsync"};if(n[o.ParameterId.VisualId]=e,n[o.ParameterId.FieldName]=t,n[o.ParameterId.PeriodType]=l.ExternalToInternalEnumMappings.periodType.convert(r.periodType),n[o.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 s.TableauError(i.EmbeddingErrorCodes.MissingRangeNForRelativeDateFilters,"Missing rangeN field for a relative date filter of LASTN or NEXTN.");n[o.ParameterId.RangeN]=r.rangeN}return void 0!==r.anchorDate&&null!==r.anchorDate&&(n[o.ParameterId.AnchorDate]=this.convertAnchorDate(r.anchorDate)),this.execute(a,n).then(e=>e.result)}getFiltersAsync(e){const t=o.VerbId.GetFilters,r={[o.ParameterId.FunctionName]:"getFiltersAsync"};return r[o.ParameterId.VisualId]=e,this.execute(t,r).then(e=>{const t=e.result;return this.convertDomainFilters(t)})}getCategoricalDomainAsync(e,t,r){const a=o.VerbId.GetCategoricalDomain,i={[o.ParameterId.FunctionName]:"getCategoricalDomainAsync"};return i[o.ParameterId.VisualId]={worksheet:e},i[o.ParameterId.FieldId]=t,i[o.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=o.VerbId.GetRangeDomain,i={[o.ParameterId.FunctionName]:"getRangeDomainAsync"};return i[o.ParameterId.VisualId]={worksheet:e},i[o.ParameterId.FieldId]=t,i[o.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=o.VerbId.GetDashboardFilters,t={[o.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=o.VerbId.DashboardCategoricalFilter,n={[o.ParameterId.FunctionName]:"applyDashboardFilterAsync"};return n[o.ParameterId.FieldName]=e,n[o.ParameterId.FilterValues]=t,n[o.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(r),n[o.ParameterId.IsExcludeMode]=a&&!!a.isExcludeMode,this.execute(i,n).then(e=>e.result)}getAppliedWorksheetsAsync(e,t){return a(this,void 0,void 0,function*(){var r;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 s.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 s.TableauError(i.SharedErrorCodes.InternalError,"No active worksheet");if(!n.includes(d))throw new s.TableauError(i.SharedErrorCodes.InternalError,`${d} must be included in the applied worksheets`);n.forEach(e=>{if(!l.includes(e))throw new s.TableauError(i.SharedErrorCodes.InternalError,`The field ${t} isn't applicable to the worksheet ${e}`)});const c=o.VerbId.ChangeSharedFilter,u={};return u[o.ParameterId.FunctionName]="setAppliedWorksheetsAsync",u[o.ParameterId.VisualId]={worksheet:e},u[o.ParameterId.FieldId]=r,u[o.ParameterId.SharedFilterSheets]=n,this.execute(c,u).then(e=>n)})}executeGetAppliedWorksheets(e,t,r){const a=o.VerbId.GetSharedFilter,i={};return i[o.ParameterId.FunctionName]=r,i[o.ParameterId.VisualId]={worksheet:e},i[o.ParameterId.FieldId]=t,this.execute(a,i).then(e=>e.result)}convertDomainFilters(e){const t=[];return e.forEach(e=>{switch(e.filterType){case o.FilterType.Categorical:{const r=e;if(!r)throw new Error("Invalid Categorical Filter");t.push(this.convertCategoricalFilter(r));break}case o.FilterType.Hierarchical:{const r=e;if(!r)throw new Error("Invalid Hierarchical Filter");t.push(this.convertHierarchicalFilter(r));break}case o.FilterType.Range:{const r=e;if(!r)throw new Error("Invalid Range Filter");t.push(this.convertRangeFilter(r));break}case o.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,i.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,i.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,i.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(),o=e.getUTCMinutes(),l=e.getUTCSeconds();if(isNaN(t)||isNaN(r)||isNaN(a)||isNaN(n)||isNaN(o)||isNaN(l))throw new s.TableauError(i.EmbeddingErrorCodes.InvalidDateParameter,"Invalid date parameter: anchorDate");return`${t}-${r}-${a} ${n}:${o}:${l}`}apiFilterHandlerCheckForCommandError(e){if(e[n.ParameterId.ParameterError]){if(e[n.ParameterId.InvalidFieldCaption])throw new s.TableauError(i.SharedErrorCodes.InvalidFilterFieldName,e[n.ParameterId.InvalidFieldCaption]);if(e[n.ParameterId.InvalidValues])throw new s.TableauError(i.SharedErrorCodes.InvalidFilterFieldValue,e[n.ParameterId.InvalidValues]);if(e[n.ParameterId.InvalidAggFieldName])throw new s.TableauError(i.SharedErrorCodes.InvalidAggregationFieldName,e[n.ParameterId.InvalidAggFieldName]);throw new s.TableauError(i.SharedErrorCodes.ServerError,"Server Error")}}}t.FilterServiceImpl=h},7879:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Environment=void 0;const a=r(7464),i=r(4524),n=r(8484);t.Environment=class{constructor(e){this._apiVersion=a.ApiVersion.Instance&&a.ApiVersion.Instance.formattedValue,this._context=a.InternalToExternalEnumMappings.extensionContext.convert(e.extensionContext),this._isExporting=e.isExporting,this._formatting=n.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.workbookFormatting),this._language=e.extensionLanguage,this._country=e.extensionCountry,this._locale=e.extensionLocale,this._workbookLocale=e.workbookLocale,this._mode=a.InternalToExternalEnumMappings.extensionMode.convert(e.extensionMode),this._operatingSystem=e.operatingSystem,this._tableauVersion=e.tableauVersion,this._uniqueUserId=e.uniqueUserId,this._exportedMediaType=e.exportedMediaType?a.InternalToExternalEnumMappings.exportedMediaType.convert(e.exportedMediaType):void 0,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 workbookLocale(){return this._workbookLocale}get mode(){return this._mode}get operatingSystem(){return this._operatingSystem}get tableauVersion(){return this._tableauVersion}get uniqueUserId(){return this._uniqueUserId}get isExporting(){return this._isExporting}get exportedMediaType(){return this._exportedMediaType}}},7887:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataSourceImpl=void 0;const a=r(5691),i=r(8395),n=r(8127),o=r(8810),s=r(2140),l=r(1871),d=r(2782),c=r(7832);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 s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").refreshAsync(this._dataSourceInfo.id)}getConnectionSummariesAsync(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getConnectionSummariesAsync(this._dataSourceInfo.id).then(e=>e.map(e=>new i.ConnectionSummary(e)))}getActiveTablesAsync(){return s.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||{},s.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||{},s.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||{},s.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 s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getLogicalTablesAsync(this.id).then(e=>e.map(e=>new o.LogicalTable(e)))}}},7944:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Dashboard=void 0;const a=r(5691),i=r(6636),n=r(7464),o=r(9385),s=r(636),l=r(8518),d=r(895),c=r(751),u=r(9680);class p 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 o.DashboardLayoutChangedEvent(t))}),e.push(r);const d=new n.SingleEventManagerImpl(a.TableauEventType.WorkbookFormattingChanged);return t.registerHandler(i.NotificationId.WorkbookFormattingChanged,()=>!0,e=>{d.triggerEvent(()=>new s.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=p},8013:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SettingsImpl=void 0;const a=r(5691),i=r(6636),n=r(7464),o=r(9577),s=r(8518);class l extends o.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(s.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(s.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new n.SingleEventManagerImpl(a.TableauEventType.SettingsChanged);return t.registerHandler(i.NotificationId.SettingsChanged,()=>!0,e=>{var t;this._currentSettings=null!==(t=e.newSettings)&&void 0!==t?t:{},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."},8127:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Field=void 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}get semanticRole(){return this._fieldImpl.semanticRole}get dataFormat(){return this._fieldImpl.dataFormat}}},8194:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.NotificationServiceImplBase=t.Registration=void 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))}}},8347:e=>{"use strict";e.exports=JSON.parse('{"major":1,"minor":196,"fix":0}')},8395:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ConnectionSummary=void 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}}},8413:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorksheetContent=void 0,t.WorksheetContent=class{constructor(e){this._worksheet=e}get worksheet(){return this._worksheet}}},8484:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorkbookFormattingEnvUtil=void 0;const a=r(7464);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})}}}},8518:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExtensionsRegistryId=void 0,t.ExtensionsRegistryId=0},8531:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isMessage=s,t.isVersion=l,t.isInitMessage=function(e){if(!s(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(!s(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(!s(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(!s(e))return!1;const t=e;return t.msgType===n.MessageType.Notification&&(!(!t.data&&!o.has(t.notificationId))&&!(!t.notificationId||"string"!=typeof t.notificationId))},t.isHandshakeMessage=function(e){return!!s(e)&&e.msgType===n.MessageType.Handshake};const a=r(1966),i=r(6677),n=r(8709),o=new Set([i.NotificationId.EditButtonClicked,i.NotificationId.EditInDesktopButtonClicked,i.NotificationId.WorkbookPublished,i.NotificationId.WorkbookReadyToClose,i.NotificationId.ReadyToReceiveAuthToken]);function s(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}},8709:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.MessageType=void 0,function(e){e.Initialize="initialize",e.Notification="notification",e.Command="command",e.CommandResponse="command-response",e.Handshake="v-handshake",e.Ack="v-ack"}(r||(t.MessageType=r={}))},8810:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LogicalTable=void 0,t.LogicalTable=class{constructor(e){this._logicalTable=e}get id(){return this._logicalTable.id}get caption(){return this._logicalTable.caption}}},8904:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EventListenerManager=void 0;const a=r(5691),i=r(3267);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}}},8935:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SheetImpl=void 0;const a=r(5691),i=r(2140),n=r(3267),o=r(2782),s=r(720),l=r(633);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 o.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),o=r.behavior===a.SheetSizeBehavior.Automatic;if(!o&&!r.minSize&&!r.maxSize)throw t;if(!o&&this.sheetType===a.SheetType.Worksheet)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSizeBehaviorOnWorksheet,"Only SheetSizeBehavior.Automatic is allowed on Worksheets");if(o&&this.getSheetSize().behavior===r.behavior)return Promise.resolve(e);const s=this.processNewSize(r);return i.ApiServiceRegistry.get(this._registryId).getService("size-service").changeSizeAsync(this.name,s).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 o.ErrorHelpers.verifyEnumValue(t,a.SheetSizeBehavior,"SheetSizeBehavior"),{behavior:t,minSize:d.parseDimensions(e.minSize),maxSize:d.parseDimensions(e.maxSize)}}processNewSize(e){const{behavior:t,minSize:r,maxSize:i}=e,o=!s.Param.isNullOrUndefined(null==r?void 0:r.width),l=!s.Param.isNullOrUndefined(null==r?void 0:r.height),d=!s.Param.isNullOrUndefined(null==i?void 0:i.width),c=!s.Param.isNullOrUndefined(null==i?void 0:i.height),u=o&&l,p=d&&c;switch(t){case a.SheetSizeBehavior.Automatic:return{behavior:t};case a.SheetSizeBehavior.AtMost:{if(!i||!p)throw new n.TableauError(a.EmbeddingErrorCodes.MissingMaxSize,"Missing maxSize for SheetSizeBehavior.AtMost");const e={width:i.width,height:i.height};if(e.width<0||e.height<0)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:t,maxSize:e}}case a.SheetSizeBehavior.AtLeast:{if(!r||!u)throw new n.TableauError(a.EmbeddingErrorCodes.MissingMinSize,"Missing minSize for SheetSizeBehavior.AtLeast");const e={width:r.width,height:r.height};if(e.width<0||e.height<0)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:t,minSize:e}}case a.SheetSizeBehavior.Range:{if(!(r&&i&&u&&p))throw new n.TableauError(a.EmbeddingErrorCodes.MissingMinMaxSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");const e={width:r.width,height:r.height},o={width:i.width,height:i.height};if(e.width<0||e.height<0||o.width<0||o.height<0||e.width>o.width||e.height>o.height)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");return{behavior:t,minSize:e,maxSize:o}}case a.SheetSizeBehavior.Exactly:if(r&&i){if(u&&p){const e={width:r.width,height:r.height},o={width:i.width,height:i.height};if(e.width!==o.width||e.height!==o.height)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Conflicting size values for SheetSizeBehavior.Exactly");return{behavior:t,minSize:e,maxSize:o}}if(u){const e={width:r.width,height:r.height};return{behavior:t,minSize:e,maxSize:e}}if(p){const e={width:i.width,height:i.height};return{behavior:t,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: ${t}`)}}}t.SheetImpl=d,d.parseDimensions=e=>{const t={width:void 0,height:void 0};if(!e)return t;const{success:r,parsed:a}=s.Param.tryParseNumber(e.width),{success:i,parsed:n}=s.Param.tryParseNumber(e.height);return r&&i?{width:a,height:n}:r?{width:a}:i?{height:n}:t}},9012:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataValueFactory=void 0;const a=r(6636),i=r(608);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)}}},9074:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AccessibilityServiceImpl=void 0;const a=r(6636),i=r(1592),n=r(1891);class o 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=o},9153:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AnnotationServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(6753),o=r(1990),s=r(3267),l=r(1891);class d extends l.ServiceImplBase{get serviceName(){return"annotation-service"}annotateMarkAsync(e,t,r){const a=this.parseMarkSelectionIds([t]),n=`${r}`,o={[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,o).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 o.SelectionModelsContainer;if(e.forEach(e=>{const r=e.tupleId;if(!(null!=r&&r>0))throw new s.TableauError(a.ErrorCodes.InternalError,"invalid tupleId");t.push(r.toString())}),0!==t.length){const e=new o.TupleSelectionModel;e.selectionType="tuples",e.objectIds=t,r.selection=e}return r}parseAnnotationSelectionIds(e){const t=[],r=new o.SelectionModelsContainer;if(e.forEach(e=>{const r=e.annotationId;if(!(null!=r&&r>=0))throw new s.TableauError(a.ErrorCodes.InternalError,"invalid annotationId");t.push(r.toString())}),0!==t.length){const e=new o.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},9188:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.doCrossFrameBootstrap=function(e,t,r){return new Promise((n,o)=>{let s;s=function(e){try{return e.self!==e.parent}catch(e){return!0}}(e)?e.parent:e.opener,s||o("This extension is not running inside an iframe, desktop, or popup window. Initialization failed.");const l=new a.CrossFrameMessenger(e,s,"*"),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()})};const a=r(6636),i=r(4941)},9216:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SelectionServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(1990),o=r(3267),s=r(720),l=r(1891);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 o.TableauError(a.ErrorCodes.InvalidParameter,"Selection criteria missing for selecting marks by value");const n=this.validateSelectionUpdateType(r),s=this.parseSelectionMarks(t),l={[i.ParameterId.FunctionName]:"selectMarksByValueAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.SelectionUpdateType]:n};return s.hierModelArr&&s.hierModelArr.length&&(l[i.ParameterId.HierValSelectionModels]=s.hierModelArr),s.quantModelArr&&s.quantModelArr.length&&(l[i.ParameterId.QuantRangeSelectionModels]=s.quantModelArr),s.dimModelArr&&s.dimModelArr.length&&(l[i.ParameterId.DimValSelectionModels]=s.dimModelArr),this.execute(i.VerbId.SelectByValue,l).then(e=>{this.apiFilterHandlerCheckForCommandError(e.result)})}hoverTupleAsync(e,t,r,a){let o=new n.HoverTupleInteractionModel(e,this.ensureTupleIDIsNonNegative(t),r,a);const s={[i.ParameterId.FunctionName]:"hoverTupleAsync",[i.ParameterId.HoverTupleInteraction]:o};return this.execute(i.VerbId.RaiseHoverTupleNotification,s).then(e=>{})}selectTuplesAsync(e,t,r,a){let o=new n.SelectTuplesInteractionModel(e,t,r,a);const s={[i.ParameterId.FunctionName]:"selectTuplesAsync",[i.ParameterId.SelectTuplesInteraction]:o};return this.execute(i.VerbId.RaiseSelectTuplesNotification,s).then(e=>{})}apiFilterHandlerCheckForCommandError(e){if(e[i.ParameterId.ParameterError]){if(e[i.ParameterId.InvalidFields])throw new o.TableauError(a.SharedErrorCodes.InvalidSelectionFieldName,e[i.ParameterId.InvalidFields]);if(e[i.ParameterId.InvalidValues])throw new o.TableauError(a.SharedErrorCodes.InvalidSelectionValue,e[i.ParameterId.InvalidValues]);if(e[i.ParameterId.InvalidDates])throw new o.TableauError(a.SharedErrorCodes.InvalidSelectionDate,e[i.ParameterId.InvalidDates])}}selectMarksByIdAsync(e,t,r){if(0===t.length)throw new o.TableauError(a.ErrorCodes.InvalidParameter,"Marks info missing for selecting marks by Id");const n=this.validateSelectionUpdateType(r),s=this.parseSelectionIds(t),l={[i.ParameterId.FunctionName]:"selectMarksByIdAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.SelectionUpdateType]:n,[i.ParameterId.Selection]:s.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},9279:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ApiVersion=void 0;const a=r(2570);class i{static get Instance(){return i._instance}static SetVersionNumber(e,t){i._instance=new a.VersionNumber(e,t)}}t.ApiVersion=i},9336:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},9357:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Point=void 0,t.Point=class{constructor(e,t){this._x=e,this._y=t}get x(){return this._x}get y(){return this._y}}},9385:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardLayoutChangedEvent=void 0;const a=r(5691),i=r(9577);class n extends i.TableauEvent{constructor(e){super(a.TableauEventType.DashboardLayoutChanged),this._dashboardLayoutChangeDetails=e}get dashboardLayoutChangeDetails(){return this._dashboardLayoutChangeDetails}}t.DashboardLayoutChangedEvent=n},9435:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StackingVersionConverter=void 0,t.StackingVersionConverter=class{static fromData(e,t,r,a,i){return new this(e.major,t.major,r,a,i)}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}`)}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}}},9531:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardObjectImpl=void 0,t.DashboardObjectImpl=class{constructor(e,t,r,a,i,n,o,s,l,d){this._dashboardImpl=e,this._type=t,this._position=r,this._size=a,this._worksheetImpl=i,this._name=n,this._isFloating=o,this._isVisible=s,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}}},9577:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauEvent=void 0,t.TableauEvent=class{constructor(e){this._type=e}get type(){return this._type}}},9605:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.VizServiceImpl=void 0;const a=r(6636),i=r(3092),n=r(1891);class o 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=>{const t=e.result;return(null==t?void 0:t.luid)?new i.CustomViewImpl(t,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=o},9640: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 o(e){try{l(a.next(e))}catch(e){n(e)}}function s(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(o,s)}l((a=a.apply(e,t||[])).next())})};Object.defineProperty(t,"__esModule",{value:!0}),t.ExportServiceImpl=void 0;const i=r(5691),n=r(6636),o=r(4369),s=r(3267),l=r(2782),d=r(4706),c=r(1891);class u extends c.ServiceImplBase{get serviceName(){return"export-service"}getExportCrosstabSheetMapAsync(e){const t=n.VerbId.GetExportCrosstabSheetMap,r={[n.ParameterId.FunctionName]:"getExportCrosstabSheetMapAsync",[n.ParameterId.CurrentSheetType]:o.ExternalToInternalEnumMappings.sheetType.convert(e)};return this.execute(t,r).then(e=>e.result)}exportCrosstabAsync(e,t,r,o){return a(this,void 0,void 0,function*(){l.ErrorHelpers.verifySheetName(r,e),l.ErrorHelpers.verifyEnumValue(t,i.CrosstabFileFormat,"CrosstabFileFormat");const a=yield this.getExportCrosstabSheetMapAsync(o);if(!a[e])throw new s.TableauError(i.SharedErrorCodes.InternalError,"missing sheet doc id from sheetMap");const d={[n.ParameterId.FunctionName]:"exportCrosstabAsync",[n.ParameterId.SheetIdentifier]:a[e],[n.ParameterId.SendNotifications]:!0};let c;switch(t){case i.CrosstabFileFormat.CSV:c=n.VerbId.ExportCrosstabCsvDownload,d[n.ParameterId.UseTabDelimiters]=!0;break;case i.CrosstabFileFormat.Excel:c=n.VerbId.ExportCrosstabExcelDownload;break;default:throw new s.TableauError(i.SharedErrorCodes.InternalError,"unsupported Crosstab file format.")}return this.execute(c,d).then(e=>e.result).catch(()=>{throw new s.TableauError(i.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),o=Array.from(a),d=n.VerbId.ExportDataDownload,c={[n.ParameterId.FunctionName]:"exportDataAsync",[n.ParameterId.VisualId]:e,[n.ParameterId.IgnoreAliases]:null!==(r=t.ignoreAliases)&&void 0!==r&&r,[n.ParameterId.ColumnsToIncludeById]:o};return this.execute(d,c).then(()=>{}).catch(()=>{throw new s.TableauError(i.SharedErrorCodes.DataCreationError,"An unexpected error occurred while generating the document.")})}exportPowerPointAsync(e,t){l.ErrorHelpers.verifySheetNamesForPDFAndPPT(e,t);const r=n.VerbId.ExportPowerpointDownload,a={[n.ParameterId.FunctionName]:"exportPowerPointAsync",[n.ParameterId.ExportOriginUrl]:"",[n.ParameterId.SelectedSheetNames]:e};return this.execute(r,a).then(e=>e.result).catch(()=>{throw new s.TableauError(i.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();d.ExportHelpers.updateInternalExportPDFOptions(a,t,e);const o=n.VerbId.ExportPdfDownload,c={[n.ParameterId.FunctionName]:"exportPDFAsync",[n.ParameterId.ExportPdfOptions]:a};return this.execute(o,c).then(e=>e.result).catch(()=>{throw new s.TableauError(i.SharedErrorCodes.PDFCreationError,"Unable to create PDF because something went wrong. Try again.")})})}getExportPDFOptionsAsync(){const e=n.VerbId.GetExportPdfOptions,t={[n.ParameterId.FunctionName]:"getExportPdfOptionsAsync"};return this.execute(e,t).then(e=>e.result)}reportExtensionRenderComplete(e){const t={[n.ParameterId.FunctionName]:n.VerbId.ReportExtensionRenderComplete,[n.ParameterId.HasExtensionRenderingTimedOut]:!1};return e&&(t[n.ParameterId.ExtensionMediaBlob]=e),this.execute(n.VerbId.ReportExtensionRenderComplete,t).then(()=>{})}}t.ExportServiceImpl=u},9661:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StoryImpl=void 0;const a=r(5691),i=r(2140),n=r(3267),o=r(2782),s=r(6950),l=r(8935),d=r(7663),c=r(1471);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 s.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(o.ErrorHelpers.verifyParameter(e,"index"),o.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(o.ErrorHelpers.verifyParameter(e,"index"),o.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},9680:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Worksheet=void 0;const a=r(5691),i=r(5691),n=r(6636),o=r(7464),s=r(4641),l=r(4858),d=r(7039),c=r(7708),u=r(8518),p=r(7944),m=r(751);class h extends m.Sheet{constructor(e){super(e),this._worksheetImpl=e,this.initializeEvents().forEach(e=>this.addNewEventType(e))}get parentDashboard(){if(null==this._worksheetImpl.parentDashboard)throw new o.TableauError(a.SharedErrorCodes.ImplementationError,"Parent dashboard not implemented");return new p.Dashboard(this._worksheetImpl.parentDashboard)}get backgroundColor(){if(null==this._worksheetImpl.backgroundColor)throw new o.TableauError(a.SharedErrorCodes.ImplementationError,"Worksheet background color is not available");return this._worksheetImpl.backgroundColor}get formatting(){if(null==this._worksheetImpl.formatting)throw new o.TableauError(a.SharedErrorCodes.ImplementationError,"Worksheet formatting information is not available");return this._worksheetImpl.formatting}initializeEvents(){const e=new Array;let t;try{t=o.ApiServiceRegistry.get(u.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new o.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 o.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 s.FilterChangedEvent(this,e.fieldName,e.fieldId))});const p=new o.SingleEventManagerImpl(i.TableauEventType.SummaryDataChanged);t.registerHandler(n.NotificationId.SummaryDataChanged,e=>{const t=e;return this._worksheetImpl.visualId.worksheet===t.visualId.worksheet},e=>{p.triggerEvent(()=>new d.SummaryDataChangedEvent(this))});const m=new o.SingleEventManagerImpl(i.TableauEventType.WorksheetFormattingChanged);return t.registerHandler(n.NotificationId.WorksheetFormattingChanged,e=>{const t=e;return this._worksheetImpl.visualId.worksheet===t.visualId.worksheet},e=>{m.triggerEvent(()=>new c.WorksheetFormattingChangedEvent(this,e))}),e.push(r),e.push(a),e.push(p),e.push(m),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=h},9730:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.VersionedExternalApiDispatcher=void 0;const a=r(6636);t.VersionedExternalApiDispatcher=class{constructor(e,t){this._apiDelegateDispatcher=e,this._versionConverter=(0,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(0,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)}}},9735:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SheetInfoImpl=void 0;const a=r(5691);t.SheetInfoImpl=class{constructor(e,t,r,a,i,n,o){this._name=e,this._sheetType=t,this._sheetSize=r,this._index=a,this._isActive=i,this._isHidden=n,this._url=o}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}}},9745:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},9753:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StoryActivationServiceImpl=void 0;const a=r(6636),i=r(1891);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},9770:function(e,t,r){"use strict";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,i)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),i=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.ZoneVisibilityType=t.TrendLineModelType=t.SortDirection=t.SheetType=t.SelectOptions=t.SelectionUpdateType=t.ReplaySpeedType=t.QuickTableCalcType=t.PeriodType=t.ParameterValueType=t.NumberFormatUnits=t.NegativeNumberFormat=t.MarkType=t.IncludeDataValuesOption=t.HierarchicalLevelSelectionState=t.FilterUpdateType=t.FilterType=t.FilterNullOption=t.FilterDomainType=t.FieldRoleType=t.FieldAggregationType=t.EncodingType=t.DialogStyle=t.DateRangeType=t.DataType=t.DataFormatType=t.DashboardObjectVisibilityType=t.DashboardObjectType=t.DashboardLayoutChange=t.ColumnType=t.ClassNameKey=t.AnnotationType=t.AnalyticsObjectType=void 0,i(r(6879),t),i(r(3855),t),i(r(7316),t),i(r(370),t),i(r(9745),t),i(r(6300),t);var n=r(6575);Object.defineProperty(t,"AnalyticsObjectType",{enumerable:!0,get:function(){return n.AnalyticsObjectType}}),Object.defineProperty(t,"AnnotationType",{enumerable:!0,get:function(){return n.AnnotationType}}),Object.defineProperty(t,"ClassNameKey",{enumerable:!0,get:function(){return n.ClassNameKey}}),Object.defineProperty(t,"ColumnType",{enumerable:!0,get:function(){return n.ColumnType}}),Object.defineProperty(t,"DashboardLayoutChange",{enumerable:!0,get:function(){return n.DashboardLayoutChange}}),Object.defineProperty(t,"DashboardObjectType",{enumerable:!0,get:function(){return n.DashboardObjectType}}),Object.defineProperty(t,"DashboardObjectVisibilityType",{enumerable:!0,get:function(){return n.DashboardObjectVisibilityType}}),Object.defineProperty(t,"DataFormatType",{enumerable:!0,get:function(){return n.DataFormatType}}),Object.defineProperty(t,"DataType",{enumerable:!0,get:function(){return n.DataType}}),Object.defineProperty(t,"DateRangeType",{enumerable:!0,get:function(){return n.DateRangeType}}),Object.defineProperty(t,"DialogStyle",{enumerable:!0,get:function(){return n.DialogStyle}}),Object.defineProperty(t,"EncodingType",{enumerable:!0,get:function(){return n.EncodingType}}),Object.defineProperty(t,"FieldAggregationType",{enumerable:!0,get:function(){return n.FieldAggregationType}}),Object.defineProperty(t,"FieldRoleType",{enumerable:!0,get:function(){return n.FieldRoleType}}),Object.defineProperty(t,"FilterDomainType",{enumerable:!0,get:function(){return n.FilterDomainType}}),Object.defineProperty(t,"FilterNullOption",{enumerable:!0,get:function(){return n.FilterNullOption}}),Object.defineProperty(t,"FilterType",{enumerable:!0,get:function(){return n.FilterType}}),Object.defineProperty(t,"FilterUpdateType",{enumerable:!0,get:function(){return n.FilterUpdateType}}),Object.defineProperty(t,"HierarchicalLevelSelectionState",{enumerable:!0,get:function(){return n.HierarchicalLevelSelectionState}}),Object.defineProperty(t,"IncludeDataValuesOption",{enumerable:!0,get:function(){return n.IncludeDataValuesOption}}),Object.defineProperty(t,"MarkType",{enumerable:!0,get:function(){return n.MarkType}}),Object.defineProperty(t,"NegativeNumberFormat",{enumerable:!0,get:function(){return n.NegativeNumberFormat}}),Object.defineProperty(t,"NumberFormatUnits",{enumerable:!0,get:function(){return n.NumberFormatUnits}}),Object.defineProperty(t,"ParameterValueType",{enumerable:!0,get:function(){return n.ParameterValueType}}),Object.defineProperty(t,"PeriodType",{enumerable:!0,get:function(){return n.PeriodType}}),Object.defineProperty(t,"QuickTableCalcType",{enumerable:!0,get:function(){return n.QuickTableCalcType}}),Object.defineProperty(t,"ReplaySpeedType",{enumerable:!0,get:function(){return n.ReplaySpeedType}}),Object.defineProperty(t,"SelectionUpdateType",{enumerable:!0,get:function(){return n.SelectionUpdateType}}),Object.defineProperty(t,"SelectOptions",{enumerable:!0,get:function(){return n.SelectOptions}}),Object.defineProperty(t,"SheetType",{enumerable:!0,get:function(){return n.SheetType}}),Object.defineProperty(t,"SortDirection",{enumerable:!0,get:function(){return n.SortDirection}}),Object.defineProperty(t,"TrendLineModelType",{enumerable:!0,get:function(){return n.TrendLineModelType}}),Object.defineProperty(t,"ZoneVisibilityType",{enumerable:!0,get:function(){return n.ZoneVisibilityType}}),i(r(3658),t),i(r(6743),t),i(r(7750),t),i(r(3069),t)},9875:(e,t)=>{"use strict";var r,a,i,n,o,s,l,d,c,u,p,m,h,g,y,v,I,S,f,b,T,P,E,A,_,D,w,F,C,x,M,N,O,k,R,V,z,j;Object.defineProperty(t,"__esModule",{value:!0}),t.NegativeNumberFormat=t.NumberFormatUnits=t.DataFormatType=t.PulseErrorMessageVisibility=t.PulseTimeDimension=t.EncodingType=t.FitPages=t.PageScalingOption=t.ScaleMode=t.PageOrientation=t.PageSizeOption=t.ApiShowDataTableFormat=t.ExtensionDialogResult=t.DateRangeType=t.FilterType=t.MarkType=t.HierarchicalLevelSelectionState=t.QuantitativeIncludedValues=t.SelectOptions=t.SelectionUpdateType=t.FilterDomainType=t.FilterNullOption=t.DateStepPeriod=t.DomainRestrictionType=t.SheetType=t.FilterUpdateType=t.FieldRoleType=t.FieldAggregationType=t.ErrorCodes=t.EncodedDataType=t.DialogStyle=t.DataType=t.DashboardObjectType=t.ColumnType=t.AnnotateEnum=t.ExportedMediaType=t.ExtensionMode=t.ExtensionContext=void 0,function(e){e.Desktop="desktop",e.Server="server",e.Unknown="unknown",e.Cloud="cloud",e.PublicWeb="public-web",e.PublicDesktop="public-desktop"}(r||(t.ExtensionContext=r={})),function(e){e.Authoring="authoring",e.Viewing="viewing",e.Unknown="unknown"}(a||(t.ExtensionMode=a={})),function(e){e.Image="image",e.Pdf="pdf",e.Svg="svg",e.Html="html",e.PowerPoint="powerpoint",e.Excel="excel"}(i||(t.ExportedMediaType=i={})),function(e){e.Mark="mark",e.Point="point",e.Area="area"}(n||(t.AnnotateEnum=n={})),function(e){e.Discrete="discrete",e.Continuous="continuous",e.Unknown="unknown"}(o||(t.ColumnType=o={})),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"}(s||(t.DashboardObjectType=s={})),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"}(l||(t.DataType=l={})),function(e){e.Window="window",e.Modal="modal",e.Modeless="modeless"}(d||(t.DialogStyle=d={})),function(e){e.Number="number",e.String="string",e.Date="date",e.Boolean="boolean"}(c||(t.EncodedDataType=c={})),function(e){e.INITIALIZATION_ERROR="initialization-error",e.INTERNAL_ERROR="internal-error",e.MISSING_ENUM_MAPPING="missing-enum-mapping",e.MISSING_PARAMETER="missing-parameter",e.PERMISSION_DENIED="permission-denied",e.PRES_MODEL_PARSING_ERROR="pres-model-parsing-error",e.VERSION_NOT_CONFIGURED="version-not-configured",e.VISIBILITY_ERROR="visibility-error",e.UNKNOWN_VERB_ID="unknown-verb-id"}(u||(t.ErrorCodes=u={})),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"}(p||(t.FieldAggregationType=p={})),function(e){e.Dimension="dimension",e.Measure="measure",e.Unknown="unknown"}(m||(t.FieldRoleType=m={})),function(e){e.Add="add",e.All="all",e.Replace="replace",e.Remove="remove"}(h||(t.FilterUpdateType=h={})),function(e){e.Dashboard="dashboard",e.Story="story",e.Worksheet="worksheet"}(g||(t.SheetType=g={})),function(e){e.All="all",e.List="list",e.Range="range"}(y||(t.DomainRestrictionType=y={})),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",e.IsoYears="iso-years",e.IsoQuarters="iso-quarters",e.IsoWeeks="iso-weeks"}(v||(t.DateStepPeriod=v={})),function(e){e.NullValues="nullvalues",e.NonNullValues="nonnullvalues",e.AllValues="allvalues"}(I||(t.FilterNullOption=I={})),function(e){e.Relevant="relevant",e.Database="database"}(S||(t.FilterDomainType=S={})),function(e){e.Replace="select-replace",e.Add="select-add",e.Remove="select-remove"}(f||(t.SelectionUpdateType=f={})),function(e){e.Simple="select-options-simple",e.Toggle="select-options-toggle",e.Menu="select-options-menu",e.Range="select-options-range",e.Search="select-options-search"}(b||(t.SelectOptions=b={})),function(e){e.IncludeNull="include-null",e.IncludeNonNull="include-non-null",e.IncludeAll="include-all"}(T||(t.QuantitativeIncludedValues=T={})),function(e){e.AllSelected="all-selected",e.NoneSelected="none-selected",e.SomeSelected="some-selected",e.UnknownSelected="unknown-selected"}(P||(t.HierarchicalLevelSelectionState=P={})),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"}(E||(t.MarkType=E={})),function(e){e.Categorical="categorical",e.Range="range",e.RelativeDate="relativeDate",e.Hierarchical="hierarchical"}(A||(t.FilterType=A={})),function(e){e.Last="last",e.LastN="lastN",e.Next="next",e.NextN="nextN",e.Current="current",e.ToDate="toDate"}(_||(t.DateRangeType=_={})),function(e){e.DialogAlreadyOpen="dialog-already-open",e.InvalidDomain="invalid-domain",e.Success="success"}(D||(t.ExtensionDialogResult=D={})),function(e){e.NativeValuesOnly="native-values-only",e.FormattedValuesOnly="formatted-values-only",e.NativeAndFormattedValues="native-and-formatted-values"}(w||(t.ApiShowDataTableFormat=w={})),function(e){e.Letter="letter",e.Legal="legal",e.Note="note",e.Folio="folio",e.Tabloid="tabloid",e.Ledger="ledger",e.Statement="statement",e.Executive="executive",e.A3="a3",e.A4="a4",e.A5="a5",e.B4="b4",e.B5="b5",e.Quarto="quarto",e.Unspecified="unspecified"}(F||(t.PageSizeOption=F={})),function(e){e.Printer="printer",e.Portrait="portrait",e.Landscape="landscape"}(C||(t.PageOrientation=C={})),function(e){e.ScaleAuto="auto",e.ScalePercentage="percent",e.ScaleFitPages="fit-pages"}(x||(t.ScaleMode=x={})),function(e){e.ScalePctAuto="auto",e.ScalePct400="pct400",e.ScalePct200="pct200",e.ScalePct100="pct100",e.ScalePct90="pct90",e.ScalePct80="pct80",e.ScalePct75="pct75",e.ScalePct60="pct60",e.ScalePct50="pct50",e.ScalePct25="pct25"}(M||(t.PageScalingOption=M={})),function(e){e.FitOneHigh="fit0x1",e.FitTwoHigh="fit0x2",e.FitOneWide="fit1x0",e.FitTwoWide="fit2x0"}(N||(t.FitPages=N={})),function(e){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"}(O||(t.EncodingType=O={})),function(e){e.Today="Today",e.Yesterday="Yesterday",e.WeekToDate="WeekToDate",e.LastWeek="LastWeek",e.MonthToDate="MonthToDate",e.LastMonth="LastMonth",e.QuarterToDate="QuarterToDate",e.LastQuarter="LastQuarter",e.YearToDate="YearToDate",e.LastYear="LastYear"}(k||(t.PulseTimeDimension=k={})),function(e){e.Visible="visible",e.Hidden="hidden",e.Suppressed="suppressed"}(R||(t.PulseErrorMessageVisibility=R={})),function(e){e.AutoFormat="auto-format",e.SystemNumber="system-number",e.SystemCurrency="system-currency",e.SystemLongDate="system-long-date",e.SystemShortDate="system-short-date",e.SystemTime="system-time",e.Custom="custom",e.CustomNumber="custom-number",e.CustomCurrency="custom-currency",e.CustomScientific="custom-scientific",e.CustomPercentage="custom-percentage"}(V||(t.DataFormatType=V={})),function(e){e.None="units-none",e.Thousands="units-thousands",e.Millions="units-millions",e.BillionsEnglish="units-billions-english",e.BillionsStandard="units-billions-standard"}(z||(t.NumberFormatUnits=z={})),function(e){e.Automatic="automatic",e.Parentheses="parentheses",e.OuterPrefix="outer-prefix",e.OuterSuffix="outer-suffix",e.InnerPrefix="inner-prefix",e.InnerSuffix="inner-suffix"}(j||(t.NegativeNumberFormat=j={}))}},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}),e.ZoneVisibilityType=e.VizImageSortDirectionType=e.VizImageSizeSettingType=e.VizImageSizeSettingAlignmentType=e.VizImagePaletteType=e.VizImageEncodingType=e.TrendLineModelType=e.TableauEventType=e.SortDirection=e.SheetType=e.SelectOptions=e.SelectionUpdateType=e.ReplaySpeedType=e.QuickTableCalcType=e.PeriodType=e.ParameterValueType=e.MarkType=e.IncludeDataValuesOption=e.HierarchicalLevelSelectionState=e.FilterUpdateType=e.FilterType=e.FilterNullOption=e.FilterDomainType=e.FieldRoleType=e.FieldAggregationType=e.ExtensionMode=e.ExtensionContext=e.ExportedMediaType=e.ErrorCodes=e.EncodingType=e.DialogStyle=e.DateRangeType=e.DataType=e.DashboardObjectVisibilityType=e.DashboardObjectType=e.DashboardLayoutChange=e.ColumnType=e.ClassNameKey=e.AnnotationType=e.AnalyticsObjectType=e.extensions=void 0;const t=r(7464),i=r(74),n=r(6538),o="undefined"!=typeof VERSION_IS_ALPHA&&VERSION_IS_ALPHA;t.ApiVersion.SetVersionNumber("1.17.0-pre.8",o);const s=new i.ExtensionsImpl;e.extensions=new n.Extensions(s);var l=r(5691);Object.defineProperty(e,"AnalyticsObjectType",{enumerable:!0,get:function(){return l.AnalyticsObjectType}}),Object.defineProperty(e,"AnnotationType",{enumerable:!0,get:function(){return l.AnnotationType}}),Object.defineProperty(e,"ClassNameKey",{enumerable:!0,get:function(){return l.ClassNameKey}}),Object.defineProperty(e,"ColumnType",{enumerable:!0,get:function(){return l.ColumnType}}),Object.defineProperty(e,"DashboardLayoutChange",{enumerable:!0,get:function(){return l.DashboardLayoutChange}}),Object.defineProperty(e,"DashboardObjectType",{enumerable:!0,get:function(){return l.DashboardObjectType}}),Object.defineProperty(e,"DashboardObjectVisibilityType",{enumerable:!0,get:function(){return l.DashboardObjectVisibilityType}}),Object.defineProperty(e,"DataType",{enumerable:!0,get:function(){return l.DataType}}),Object.defineProperty(e,"DateRangeType",{enumerable:!0,get:function(){return l.DateRangeType}}),Object.defineProperty(e,"DialogStyle",{enumerable:!0,get:function(){return l.DialogStyle}}),Object.defineProperty(e,"EncodingType",{enumerable:!0,get:function(){return l.EncodingType}}),Object.defineProperty(e,"ErrorCodes",{enumerable:!0,get:function(){return l.ErrorCodes}}),Object.defineProperty(e,"ExportedMediaType",{enumerable:!0,get:function(){return l.ExportedMediaType}}),Object.defineProperty(e,"ExtensionContext",{enumerable:!0,get:function(){return l.ExtensionContext}}),Object.defineProperty(e,"ExtensionMode",{enumerable:!0,get:function(){return l.ExtensionMode}}),Object.defineProperty(e,"FieldAggregationType",{enumerable:!0,get:function(){return l.FieldAggregationType}}),Object.defineProperty(e,"FieldRoleType",{enumerable:!0,get:function(){return l.FieldRoleType}}),Object.defineProperty(e,"FilterDomainType",{enumerable:!0,get:function(){return l.FilterDomainType}}),Object.defineProperty(e,"FilterNullOption",{enumerable:!0,get:function(){return l.FilterNullOption}}),Object.defineProperty(e,"FilterType",{enumerable:!0,get:function(){return l.FilterType}}),Object.defineProperty(e,"FilterUpdateType",{enumerable:!0,get:function(){return l.FilterUpdateType}}),Object.defineProperty(e,"HierarchicalLevelSelectionState",{enumerable:!0,get:function(){return l.HierarchicalLevelSelectionState}}),Object.defineProperty(e,"IncludeDataValuesOption",{enumerable:!0,get:function(){return l.IncludeDataValuesOption}}),Object.defineProperty(e,"MarkType",{enumerable:!0,get:function(){return l.MarkType}}),Object.defineProperty(e,"ParameterValueType",{enumerable:!0,get:function(){return l.ParameterValueType}}),Object.defineProperty(e,"PeriodType",{enumerable:!0,get:function(){return l.PeriodType}}),Object.defineProperty(e,"QuickTableCalcType",{enumerable:!0,get:function(){return l.QuickTableCalcType}}),Object.defineProperty(e,"ReplaySpeedType",{enumerable:!0,get:function(){return l.ReplaySpeedType}}),Object.defineProperty(e,"SelectionUpdateType",{enumerable:!0,get:function(){return l.SelectionUpdateType}}),Object.defineProperty(e,"SelectOptions",{enumerable:!0,get:function(){return l.SelectOptions}}),Object.defineProperty(e,"SheetType",{enumerable:!0,get:function(){return l.SheetType}}),Object.defineProperty(e,"SortDirection",{enumerable:!0,get:function(){return l.SortDirection}}),Object.defineProperty(e,"TableauEventType",{enumerable:!0,get:function(){return l.TableauEventType}}),Object.defineProperty(e,"TrendLineModelType",{enumerable:!0,get:function(){return l.TrendLineModelType}}),Object.defineProperty(e,"VizImageEncodingType",{enumerable:!0,get:function(){return l.VizImageEncodingType}}),Object.defineProperty(e,"VizImagePaletteType",{enumerable:!0,get:function(){return l.VizImagePaletteType}}),Object.defineProperty(e,"VizImageSizeSettingAlignmentType",{enumerable:!0,get:function(){return l.VizImageSizeSettingAlignmentType}}),Object.defineProperty(e,"VizImageSizeSettingType",{enumerable:!0,get:function(){return l.VizImageSizeSettingType}}),Object.defineProperty(e,"VizImageSortDirectionType",{enumerable:!0,get:function(){return l.VizImageSortDirectionType}}),Object.defineProperty(e,"ZoneVisibilityType",{enumerable:!0,get:function(){return l.ZoneVisibilityType}})})(),window.tableau=a})(); +//# sourceMappingURL=tableau.extensions.1.17.0-pre.8.min.js.map \ No newline at end of file diff --git a/lib/tableau.extensions.1.latest.js b/lib/tableau.extensions.1.latest.js index 05ac9d48..a3383044 100644 --- a/lib/tableau.extensions.1.latest.js +++ b/lib/tableau.extensions.1.latest.js @@ -74,2205 +74,1043 @@ /***/ }), -/***/ "./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js": -/*!*********************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js ***! - \*********************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +/***/ "../../node_modules/uuid/dist/esm-browser/index.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 */ "../../node_modules/uuid/dist/esm-browser/v1.js"); +/* harmony import */ var _v3_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./v3.js */ "../../node_modules/uuid/dist/esm-browser/v3.js"); +/* harmony import */ var _v4_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./v4.js */ "../../node_modules/uuid/dist/esm-browser/v4.js"); +/* harmony import */ var _v5_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./v5.js */ "../../node_modules/uuid/dist/esm-browser/v5.js"); +/* harmony import */ var _nil_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./nil.js */ "../../node_modules/uuid/dist/esm-browser/nil.js"); +/* harmony import */ var _version_js__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! ./version.js */ "../../node_modules/uuid/dist/esm-browser/version.js"); +/* harmony import */ var _validate_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./validate.js */ "../../node_modules/uuid/dist/esm-browser/validate.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! ./stringify.js */ "../../node_modules/uuid/dist/esm-browser/stringify.js"); +/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(/*! ./parse.js */ "../../node_modules/uuid/dist/esm-browser/parse.js"); -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__) => { +/***/ "../../node_modules/uuid/dist/esm-browser/md5.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 -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"; + bytes = new Uint8Array(msg.length); -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); + for (var i = 0; i < msg.length; ++i) { + bytes[i] = msg.charCodeAt(i); } -} -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; - } + return md5ToHexEncodedArray(wordsToMd5(bytesToWords(bytes), bytes.length * 8)); } -exports.TableauEvent = TableauEvent; - +/* + * Convert an array of little-endian words to an array of bytes + */ -/***/ }), -/***/ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js": -/*!***********************************************************!*\ - !*** ./lib/src/ExtensionsApi/Events/TableauSheetEvent.js ***! - \***********************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +function md5ToHexEncodedArray(input) { + var output = []; + var length32 = input.length * 32; + var hexTab = '0123456789abcdef'; -"use strict"; + 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); + } -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; - } + return output; } -exports.TableauSheetEvent = TableauSheetEvent; - - -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js": -/*!***************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Events/TableauWorksheetEvent.js ***! - \***************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +/** + * Calculate output length with padding and bit length + */ -"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; - } +function getOutputLength(inputLength8) { + return (inputLength8 + 64 >>> 9 << 4) + 14 + 1; } -exports.TableauWorksheetEvent = TableauWorksheetEvent; +/* + * Calculate the MD5 of an array of little-endian words, and a bit length. + */ -/***/ }), - -/***/ "./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js": -/*!************************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Events/WorkbookFormattingChangedEvent.js ***! - \************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +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; -"use strict"; + 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); + } -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; - } + return [a, b, c, d]; } -exports.WorkbookFormattingChangedEvent = WorkbookFormattingChangedEvent; +/* + * 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 []; + } -/***/ "./lib/src/ExtensionsApi/Events/WorksheetFormattingChangedEvent.js": -/*!*************************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Events/WorksheetFormattingChangedEvent.js ***! - \*************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + var length8 = input.length * 8; + var output = new Uint32Array(getOutputLength(length8)); -"use strict"; + for (var i = 0; i < length8; i += 8) { + output[i >> 5] |= (input[i / 8] & 0xff) << i % 32; + } -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; - } + return output; } -exports.WorksheetFormattingChangedEvent = WorksheetFormattingChangedEvent; +/* + * 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. + */ -/***/ "./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js": -/*!*******************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Impl/BentonSansFontNameConstants.js ***! - \*******************************************************************/ -/***/ ((__unused_webpack_module, exports) => { -"use strict"; +function bitRotateLeft(num, cnt) { + return num << cnt | num >>> 32 - cnt; +} +/* + * These functions implement the four basic operations the algorithm uses. + */ -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, -]; +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); /***/ }), -/***/ "./lib/src/ExtensionsApi/Impl/ConnectedServer.js": +/***/ "../../node_modules/uuid/dist/esm-browser/nil.js": /*!*******************************************************!*\ - !*** ./lib/src/ExtensionsApi/Impl/ConnectedServer.js ***! + !*** ../../node_modules/uuid/dist/esm-browser/nil.js ***! \*******************************************************/ -/***/ ((__unused_webpack_module, exports) => { +/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { "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; - +__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'); /***/ }), -/***/ "./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js": -/*!*************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Impl/ExtensionWorkbookImpl.js ***! - \*************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +/***/ "../../node_modules/uuid/dist/esm-browser/parse.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 */ "../../node_modules/uuid/dist/esm-browser/validate.js"); -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; - } + +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; } -exports.ExtensionWorkbookImpl = ExtensionWorkbookImpl; +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (parse); /***/ }), -/***/ "./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js": -/*!******************************************************!*\ - !*** ./lib/src/ExtensionsApi/Impl/ExtensionsImpl.js ***! - \******************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +/***/ "../../node_modules/uuid/dist/esm-browser/regex.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); -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, isExtensionDialog: isExtensionDialog }; - // 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; +/***/ }), + +/***/ "../../node_modules/uuid/dist/esm-browser/rng.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'); } - createVizImageAsync(inputSpec) { - const vizService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("viz-service" /* Viz */); - return vizService.createVizImageAsync(inputSpec); + } + + return getRandomValues(rnds8); +} + +/***/ }), + +/***/ "../../node_modules/uuid/dist/esm-browser/sha1.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)); } - setClickThroughAsync(clickThroughEnabled) { - const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); - return uiService.setClickThroughAsync(clickThroughEnabled, this.extensionZoneId); + } 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]; } - 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; + + 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]; } - 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(isExtensionDialog)); - 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}.'`); - } + + for (var _t = 16; _t < 80; ++_t) { + W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1); } - 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}.'`); - } + + 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]; } -exports.ExtensionsImpl = ExtensionsImpl; +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (sha1); /***/ }), -/***/ "./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js": -/*!*************************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js ***! - \*************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +/***/ "../../node_modules/uuid/dist/esm-browser/stringify.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 */ "../../node_modules/uuid/dist/esm-browser/validate.js"); -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 + * Convert array of 16 byte values to UUID string format of the form: + * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX */ -// 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 = {})); +var byteToHex = []; -/***/ }), +for (var i = 0; i < 256; ++i) { + byteToHex.push((i + 0x100).toString(16).substr(1)); +} -/***/ "./lib/src/ExtensionsApi/Impl/SettingsImpl.js": -/*!****************************************************!*\ - !*** ./lib/src/ExtensionsApi/Impl/SettingsImpl.js ***! - \****************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +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 -"use strict"; + if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { + throw TypeError('Stringified UUID is invalid'); + } -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); - } - } + return uuid; } -exports.SettingsImpl = SettingsImpl; -SettingsImpl.ASYNC_SAVE_IN_PROGRESS = 'Async Save is in progress, updating settings is not allowed.'; +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (stringify); /***/ }), -/***/ "./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js": -/*!********************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js ***! - \********************************************************************/ -/***/ ((__unused_webpack_module, exports) => { +/***/ "../../node_modules/uuid/dist/esm-browser/v1.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 */ "../../node_modules/uuid/dist/esm-browser/rng.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "../../node_modules/uuid/dist/esm-browser/stringify.js"); -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, -]; + // **`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 -/***/ "./lib/src/ExtensionsApi/Impl/UIImpl.js": -/*!**********************************************!*\ - !*** ./lib/src/ExtensionsApi/Impl/UIImpl.js ***! - \**********************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { -"use strict"; +var _lastMSecs = 0; +var _lastNSecs = 0; // See https://github.com/uuidjs/uuid for API details -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, sourceDialogUrl) { - super(Contract.TableauEventType.DialogMessageReceived); - this.message = message; - this.sourceDialogUrl = sourceDialogUrl; - } -} -exports.DialogMessageEvent = DialogMessageEvent; -/** - * Custom error class that extends the TableauError object. - * Includes context for which dialog caused the exception via its url. - */ -class TableauDialogError extends api_shared_js_1.TableauError { - constructor(_errorCode, message) { - super(_errorCode, message); - /*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, TableauDialogError.prototype); +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]]; } -} -exports.TableauDialogError = TableauDialogError; -class UIImpl { - constructor(isExtensionDialog) { - this.isExtensionDialog = isExtensionDialog; + + if (clockseq == null) { + // Per 4.2.2, randomize (14 bit) clockseq + clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; } - 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 || '', this.isExtensionDialog, 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 TableauDialogError(Contract.ErrorCodes.InternalError, 'closePayload is undefined'); - } - resolve(event.closePayload); - } - else { - reject(new TableauDialogError(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); - } - sendDialogMessageToParentAsync(message) { - if (!this.isExtensionDialog) { - throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'sendDialogMessageToParentAsync can only be called from an extension dialog.'); - } - const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); - uiService.sendDialogMessageToParentAsync(message); - } - closeDialog(payload, dialogUrl) { - const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* UIService */); - uiService.closeDialog(payload, dialogUrl); - } - /** - * 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, event.sourceDialogUrl)); - }); - results.push(dialogMessageEvent); - return results; - } -} -exports.UIImpl = UIImpl; + } // 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 -/***/ "./lib/src/ExtensionsApi/Models/Dashboard.js": -/*!***************************************************!*\ - !*** ./lib/src/ExtensionsApi/Models/Dashboard.js ***! - \***************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + var nsecs = options.nsecs !== undefined ? options.nsecs : _lastNSecs + 1; // Time since last uuid creation (in msecs) -"use strict"; + var dt = msecs - _lastMSecs + (nsecs - _lastNSecs) / 10000; // Per 4.2.1.2, Bump clockseq on clock regression -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); - } + 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); } -exports.Dashboard = Dashboard; +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v1); /***/ }), -/***/ "./lib/src/ExtensionsApi/Models/DashboardObject.js": -/*!*********************************************************!*\ - !*** ./lib/src/ExtensionsApi/Models/DashboardObject.js ***! - \*********************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +/***/ "../../node_modules/uuid/dist/esm-browser/v3.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 */ "../../node_modules/uuid/dist/esm-browser/v35.js"); +/* harmony import */ var _md5_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./md5.js */ "../../node_modules/uuid/dist/esm-browser/md5.js"); -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; +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); /***/ }), -/***/ "./lib/src/ExtensionsApi/Models/Parameter.js": -/*!***************************************************!*\ - !*** ./lib/src/ExtensionsApi/Models/Parameter.js ***! - \***************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +/***/ "../../node_modules/uuid/dist/esm-browser/v35.js": +/*!*******************************************************!*\ + !*** ../../node_modules/uuid/dist/esm-browser/v35.js ***! + \*******************************************************/ +/***/ ((__unused_webpack_module, __webpack_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; +__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 */ "../../node_modules/uuid/dist/esm-browser/stringify.js"); +/* harmony import */ var _parse_js__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./parse.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); } - changeValueAsync(newValue) { - return this.parameterImpl.changeValueAsync(newValue); + + if (typeof namespace === 'string') { + namespace = (0,_parse_js__WEBPACK_IMPORTED_MODULE_0__["default"])(namespace); } - /** - * 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; + + 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; } -} -exports.Parameter = Parameter; + + 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; +} + /***/ }), -/***/ "./lib/src/ExtensionsApi/Models/Sheet.js": -/*!***********************************************!*\ - !*** ./lib/src/ExtensionsApi/Models/Sheet.js ***! - \***********************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +/***/ "../../node_modules/uuid/dist/esm-browser/v4.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 */ "../../node_modules/uuid/dist/esm-browser/rng.js"); +/* harmony import */ var _stringify_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./stringify.js */ "../../node_modules/uuid/dist/esm-browser/stringify.js"); -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); - }); - }); + + +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); } -exports.Sheet = Sheet; +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (v4); /***/ }), -/***/ "./lib/src/ExtensionsApi/Models/Workbook.js": -/*!**************************************************!*\ - !*** ./lib/src/ExtensionsApi/Models/Workbook.js ***! - \**************************************************/ -/***/ ((__unused_webpack_module, exports) => { +/***/ "../../node_modules/uuid/dist/esm-browser/v5.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 */ "../../node_modules/uuid/dist/esm-browser/v35.js"); +/* harmony import */ var _sha1_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./sha1.js */ "../../node_modules/uuid/dist/esm-browser/sha1.js"); -Object.defineProperty(exports, "__esModule", ({ value: true })); -class Workbook { - constructor(_workbookImpl) { - this._workbookImpl = _workbookImpl; - } - getAllDataSourcesAsync() { - return this._workbookImpl.getAllDataSourcesAsync(); - } + +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); + +/***/ }), + +/***/ "../../node_modules/uuid/dist/esm-browser/validate.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 */ "../../node_modules/uuid/dist/esm-browser/regex.js"); + + +function validate(uuid) { + return typeof uuid === 'string' && _regex_js__WEBPACK_IMPORTED_MODULE_0__["default"].test(uuid); } -exports.Workbook = Workbook; +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (validate); /***/ }), -/***/ "./lib/src/ExtensionsApi/Models/Worksheet.js": -/*!***************************************************!*\ - !*** ./lib/src/ExtensionsApi/Models/Worksheet.js ***! - \***************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +/***/ "../../node_modules/uuid/dist/esm-browser/version.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 */ "../../node_modules/uuid/dist/esm-browser/validate.js"); -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); - } + +function version(uuid) { + if (!(0,_validate_js__WEBPACK_IMPORTED_MODULE_0__["default"])(uuid)) { + throw TypeError('Invalid UUID'); + } + + return parseInt(uuid.substr(14, 1), 16); } -exports.Worksheet = Worksheet; +/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (version); /***/ }), -/***/ "./lib/src/ExtensionsApi/Namespaces/DashboardContent.js": -/*!**************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Namespaces/DashboardContent.js ***! - \**************************************************************/ -/***/ ((__unused_webpack_module, exports) => { +/***/ "../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js": +/*!***************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js ***! + \***************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; +// This file re-exports everything which is part of the extensions api public interface +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; 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; +exports.Toolbar = exports.TableauDialogType = exports.SheetSizeBehavior = exports.PulseTimeDimension = exports.PulseLayout = exports.PulseErrorMessageVisibility = exports.PrintScaling = exports.PrintPageSize = exports.PrintOrientation = exports.EmbeddingTableauEventType = exports.EmbeddingErrorCodes = exports.DeviceType = exports.CrosstabFileFormat = exports.ApiMenuType = void 0; +__exportStar(__webpack_require__(/*! ./ExternalContract/Embedding/AskDataInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/AskDataInterfaces.js"), exports); +var Enums_1 = __webpack_require__(/*! ./ExternalContract/Embedding/Enums */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/Enums.js"); +Object.defineProperty(exports, "ApiMenuType", ({ enumerable: true, get: function () { return Enums_1.ApiMenuType; } })); +Object.defineProperty(exports, "CrosstabFileFormat", ({ enumerable: true, get: function () { return Enums_1.CrosstabFileFormat; } })); +Object.defineProperty(exports, "DeviceType", ({ enumerable: true, get: function () { return Enums_1.DeviceType; } })); +Object.defineProperty(exports, "EmbeddingErrorCodes", ({ enumerable: true, get: function () { return Enums_1.EmbeddingErrorCodes; } })); +Object.defineProperty(exports, "EmbeddingTableauEventType", ({ enumerable: true, get: function () { return Enums_1.TableauEventType; } })); +Object.defineProperty(exports, "PrintOrientation", ({ enumerable: true, get: function () { return Enums_1.PrintOrientation; } })); +Object.defineProperty(exports, "PrintPageSize", ({ enumerable: true, get: function () { return Enums_1.PrintPageSize; } })); +Object.defineProperty(exports, "PrintScaling", ({ enumerable: true, get: function () { return Enums_1.PrintScaling; } })); +Object.defineProperty(exports, "PulseErrorMessageVisibility", ({ enumerable: true, get: function () { return Enums_1.PulseErrorMessageVisibility; } })); +Object.defineProperty(exports, "PulseLayout", ({ enumerable: true, get: function () { return Enums_1.PulseLayout; } })); +Object.defineProperty(exports, "PulseTimeDimension", ({ enumerable: true, get: function () { return Enums_1.PulseTimeDimension; } })); +Object.defineProperty(exports, "SheetSizeBehavior", ({ enumerable: true, get: function () { return Enums_1.SheetSizeBehavior; } })); +Object.defineProperty(exports, "TableauDialogType", ({ enumerable: true, get: function () { return Enums_1.TableauDialogType; } })); +Object.defineProperty(exports, "Toolbar", ({ enumerable: true, get: function () { return Enums_1.Toolbar; } })); +__exportStar(__webpack_require__(/*! ./ExternalContract/Embedding/PulseInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/PulseInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Embedding/TableauError */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/TableauError.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Embedding/VizInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/VizInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Embedding/VizQLDataServiceInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/VizQLDataServiceInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Embedding/WebComponentInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Embedding/WebComponentInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./SharedApiExternalContract */ "../api-external-contract-js/lib/src/SharedApiExternalContract.js"), exports); /***/ }), -/***/ "./lib/src/ExtensionsApi/Namespaces/Environment.js": -/*!*********************************************************!*\ - !*** ./lib/src/ExtensionsApi/Namespaces/Environment.js ***! - \*********************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +/***/ "../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js": +/*!****************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js ***! + \****************************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; +// This file re-exports everything which is part of the extensions api public interface +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; 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; +exports.VizImageSortDirectionType = exports.VizImageSizeSettingType = exports.VizImageSizeSettingAlignmentType = exports.VizImagePaletteType = exports.VizImageEncodingType = exports.TableauEventType = exports.ExtensionMode = exports.ExtensionContext = exports.ExportedMediaType = exports.ErrorCodes = void 0; +__exportStar(__webpack_require__(/*! ./ExternalContract/Extensions/EventInterface */ "../api-external-contract-js/lib/src/ExternalContract/Extensions/EventInterface.js"), exports); +var Tableau_1 = __webpack_require__(/*! ./ExternalContract/Extensions/Namespaces/Tableau */ "../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/Tableau.js"); +Object.defineProperty(exports, "ErrorCodes", ({ enumerable: true, get: function () { return Tableau_1.ErrorCodes; } })); +Object.defineProperty(exports, "ExportedMediaType", ({ enumerable: true, get: function () { return Tableau_1.ExportedMediaType; } })); +Object.defineProperty(exports, "ExtensionContext", ({ enumerable: true, get: function () { return Tableau_1.ExtensionContext; } })); +Object.defineProperty(exports, "ExtensionMode", ({ enumerable: true, get: function () { return Tableau_1.ExtensionMode; } })); +Object.defineProperty(exports, "TableauEventType", ({ enumerable: true, get: function () { return Tableau_1.TableauEventType; } })); +Object.defineProperty(exports, "VizImageEncodingType", ({ enumerable: true, get: function () { return Tableau_1.VizImageEncodingType; } })); +Object.defineProperty(exports, "VizImagePaletteType", ({ enumerable: true, get: function () { return Tableau_1.VizImagePaletteType; } })); +Object.defineProperty(exports, "VizImageSizeSettingAlignmentType", ({ enumerable: true, get: function () { return Tableau_1.VizImageSizeSettingAlignmentType; } })); +Object.defineProperty(exports, "VizImageSizeSettingType", ({ enumerable: true, get: function () { return Tableau_1.VizImageSizeSettingType; } })); +Object.defineProperty(exports, "VizImageSortDirectionType", ({ enumerable: true, get: function () { return Tableau_1.VizImageSortDirectionType; } })); +__exportStar(__webpack_require__(/*! ./ExternalContract/Extensions/Namespaces/UI */ "../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/UI.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Extensions/ParameterInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Extensions/ParameterInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Extensions/TableauError */ "../api-external-contract-js/lib/src/ExternalContract/Extensions/TableauError.js"), exports); +__exportStar(__webpack_require__(/*! ./SharedApiExternalContract */ "../api-external-contract-js/lib/src/SharedApiExternalContract.js"), exports); /***/ }), -/***/ "./lib/src/ExtensionsApi/Namespaces/Extensions.js": -/*!********************************************************!*\ - !*** ./lib/src/ExtensionsApi/Namespaces/Extensions.js ***! - \********************************************************/ -/***/ ((__unused_webpack_module, exports) => { +/***/ "../api-external-contract-js/lib/src/ExternalContract.js": +/*!***************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract.js ***! + \***************************************************************/ +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; -Object.defineProperty(exports, "__esModule", ({ value: true })); /** - * Implementation of the external Extensions namespace. + * 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. */ -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"; - +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; 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; +__exportStar(__webpack_require__(/*! ./EmbeddingApiExternalContract */ "../api-external-contract-js/lib/src/EmbeddingApiExternalContract.js"), exports); +__exportStar(__webpack_require__(/*! ./ExtensionsApiExternalContract */ "../api-external-contract-js/lib/src/ExtensionsApiExternalContract.js"), exports); /***/ }), -/***/ "./lib/src/ExtensionsApi/Namespaces/UI.js": -/*!************************************************!*\ - !*** ./lib/src/ExtensionsApi/Namespaces/UI.js ***! - \************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +/***/ "../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 })); -const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../api-shared-js/lib/src/ApiShared.js"); +exports.AskDataAttributes = void 0; /** - * Implementation of the external UI namespace. + * The names of the string constants you can use as HTML attributes for the web component. + * @ignore + * @deprecated */ -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); - } - sendDialogMessageToParentAsync(message) { - return this._impl.sendDialogMessageToParentAsync(message); - } - closeDialog(payload, dialogUrl) { - this._impl.closeDialog(payload, dialogUrl); - } -} -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, - }; -} +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 = AskDataAttributes = {})); /***/ }), -/***/ "./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js": -/*!**************************************************************!*\ - !*** ./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js ***! - \**************************************************************/ +/***/ "../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 })); +exports.TableauDialogType = exports.ApiMenuType = exports.TableauEventType = exports.PulseErrorMessageVisibility = exports.PulseTimeDimension = exports.PulseLayout = exports.SheetSizeBehavior = exports.Toolbar = exports.ToolbarButtons = exports.RevertVizSelection = exports.PrintScaling = exports.PrintPageSize = exports.PrintOrientation = exports.EmbeddingErrorCodes = exports.DeviceType = exports.CrosstabFileFormat = void 0; /** - * 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, isExtensionDialog, 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, - }; - // The dialog url source refers to who is opening a new dialog (i.e. the dialog's parent). - // If the host extension is opening a dialog we leave the source url as undefined to help us differentiate from other dialogs. - if (isExtensionDialog) { - parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogUrlSource] = window.location.href; - } - 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, dialogUrl) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'closeDialog', - [api_internal_contract_js_1.ParameterId.ExtensionDialogUrlSource]: window.location.href, - }; - if (payload) { - parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload; - } - if (dialogUrl) { - parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = dialogUrl; - } - 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, - [api_internal_contract_js_1.ParameterId.ExtensionDialogUrlSource]: window.location.href, - }; - if (targetDialogUrl) { - parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = targetDialogUrl; - } - return this.execute(api_internal_contract_js_1.VerbId.SendDialogMessage, parameters).then(() => { - return; - }); - } - sendDialogMessageToParentAsync(message) { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'sendMessageToParent', - [api_internal_contract_js_1.ParameterId.ExtensionDialogMessage]: message, - [api_internal_contract_js_1.ParameterId.ExtensionDialogUrlSource]: window.location.href, - }; - return this.execute(api_internal_contract_js_1.VerbId.SendMessageToParent, 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} + * 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 = {})); +})(CrosstabFileFormat || (exports.CrosstabFileFormat = CrosstabFileFormat = {})); /** * Device types available to use with {@link Viz.device} */ @@ -2282,7 +1120,7 @@ var DeviceType; DeviceType["Desktop"] = "desktop"; DeviceType["Tablet"] = "tablet"; DeviceType["Phone"] = "phone"; -})(DeviceType = exports.DeviceType || (exports.DeviceType = {})); +})(DeviceType || (exports.DeviceType = DeviceType = {})); /** * All error codes used by the Embedding API. */ @@ -2417,7 +1255,7 @@ var EmbeddingErrorCodes; */ EmbeddingErrorCodes["ImplementationError"] = "wrong-implementation"; /** - * @NotImplemented + * @hidden (not implemented) */ EmbeddingErrorCodes["NotImplemented"] = "not-implemented"; /** @@ -2441,20 +1279,12 @@ var EmbeddingErrorCodes; * 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 = {})); +})(EmbeddingErrorCodes || (exports.EmbeddingErrorCodes = EmbeddingErrorCodes = {})); var PrintOrientation; (function (PrintOrientation) { PrintOrientation["Portrait"] = "portrait"; PrintOrientation["Landscape"] = "landscape"; -})(PrintOrientation = exports.PrintOrientation || (exports.PrintOrientation = {})); +})(PrintOrientation || (exports.PrintOrientation = PrintOrientation = {})); var PrintPageSize; (function (PrintPageSize) { PrintPageSize["Letter"] = "letter"; @@ -2472,7 +1302,7 @@ var PrintPageSize; PrintPageSize["B5"] = "B5"; PrintPageSize["Quarto"] = "quarto"; PrintPageSize["Unspecified"] = "unspecified"; -})(PrintPageSize = exports.PrintPageSize || (exports.PrintPageSize = {})); +})(PrintPageSize || (exports.PrintPageSize = PrintPageSize = {})); var PrintScaling; (function (PrintScaling) { PrintScaling["Automatic"] = "automatic"; @@ -2489,7 +1319,7 @@ var PrintScaling; 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 = {})); +})(PrintScaling || (exports.PrintScaling = PrintScaling = {})); var RevertVizSelection; (function (RevertVizSelection) { RevertVizSelection["All"] = "all"; @@ -2497,7 +1327,7 @@ var RevertVizSelection; RevertVizSelection["Filters"] = "filters"; RevertVizSelection["Sorts"] = "sorts"; RevertVizSelection["Shelves"] = "shelves"; -})(RevertVizSelection = exports.RevertVizSelection || (exports.RevertVizSelection = {})); +})(RevertVizSelection || (exports.RevertVizSelection = RevertVizSelection = {})); var ToolbarButtons; (function (ToolbarButtons) { ToolbarButtons["Alerts"] = "alerts"; @@ -2506,13 +1336,13 @@ var ToolbarButtons; ToolbarButtons["DataDetails"] = "dataDetails"; ToolbarButtons["Share"] = "share"; ToolbarButtons["Subscribe"] = "subscribe"; -})(ToolbarButtons = exports.ToolbarButtons || (exports.ToolbarButtons = {})); +})(ToolbarButtons || (exports.ToolbarButtons = ToolbarButtons = {})); var Toolbar; (function (Toolbar) { Toolbar["Top"] = "top"; Toolbar["Bottom"] = "bottom"; Toolbar["Hidden"] = "hidden"; -})(Toolbar = exports.Toolbar || (exports.Toolbar = {})); +})(Toolbar || (exports.Toolbar = Toolbar = {})); var SheetSizeBehavior; (function (SheetSizeBehavior) { SheetSizeBehavior["Automatic"] = "automatic"; @@ -2520,13 +1350,13 @@ var SheetSizeBehavior; SheetSizeBehavior["Range"] = "range"; SheetSizeBehavior["AtLeast"] = "atleast"; SheetSizeBehavior["AtMost"] = "atmost"; -})(SheetSizeBehavior = exports.SheetSizeBehavior || (exports.SheetSizeBehavior = {})); +})(SheetSizeBehavior || (exports.SheetSizeBehavior = SheetSizeBehavior = {})); var PulseLayout; (function (PulseLayout) { PulseLayout["Default"] = "default"; PulseLayout["Card"] = "card"; PulseLayout["Ban"] = "ban"; -})(PulseLayout = exports.PulseLayout || (exports.PulseLayout = {})); +})(PulseLayout || (exports.PulseLayout = PulseLayout = {})); var PulseTimeDimension; (function (PulseTimeDimension) { PulseTimeDimension["Today"] = "Today"; @@ -2539,13 +1369,13 @@ var PulseTimeDimension; PulseTimeDimension["LastQuarter"] = "LastQuarter"; PulseTimeDimension["YearToDate"] = "YearToDate"; PulseTimeDimension["LastYear"] = "LastYear"; -})(PulseTimeDimension = exports.PulseTimeDimension || (exports.PulseTimeDimension = {})); +})(PulseTimeDimension || (exports.PulseTimeDimension = PulseTimeDimension = {})); var PulseErrorMessageVisibility; (function (PulseErrorMessageVisibility) { PulseErrorMessageVisibility["Visible"] = "visible"; PulseErrorMessageVisibility["Hidden"] = "hidden"; PulseErrorMessageVisibility["Suppressed"] = "suppressed"; -})(PulseErrorMessageVisibility = exports.PulseErrorMessageVisibility || (exports.PulseErrorMessageVisibility = {})); +})(PulseErrorMessageVisibility || (exports.PulseErrorMessageVisibility = 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. @@ -2727,7 +1557,7 @@ var TableauEventType; * @category Pulse */ TableauEventType["PulseUrlChanged"] = "pulseurlchanged"; -})(TableauEventType = exports.TableauEventType || (exports.TableauEventType = {})); +})(TableauEventType || (exports.TableauEventType = TableauEventType = {})); /** * Represents the location of a context menu where users can add external menu items. */ @@ -2735,7 +1565,7 @@ var ApiMenuType; (function (ApiMenuType) { /** External menu item will be injected in ubertip dialog */ ApiMenuType["Ubertip"] = "ubertip"; -})(ApiMenuType = exports.ApiMenuType || (exports.ApiMenuType = {})); +})(ApiMenuType || (exports.ApiMenuType = ApiMenuType = {})); /** You can use this type with a {@link Viz} object. */ var TableauDialogType; (function (TableauDialogType) { @@ -2763,7 +1593,7 @@ var TableauDialogType; * Used to display the Share dialog. */ TableauDialogType["Share"] = "share"; -})(TableauDialogType = exports.TableauDialogType || (exports.TableauDialogType = {})); +})(TableauDialogType || (exports.TableauDialogType = TableauDialogType = {})); /***/ }), @@ -2777,6 +1607,7 @@ var TableauDialogType; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.PulseChildElementAttributes = exports.PulseChildElements = exports.PulseAttributes = void 0; /** * The names of the string constants you can use as HTML attributes for the web component. * @ignore @@ -2795,7 +1626,7 @@ var PulseAttributes; PulseAttributes["OnPulseUrlChanged"] = "onPulseUrlChanged"; PulseAttributes["TimeDimension"] = "time-dimension"; PulseAttributes["TokenOptional"] = "token-optional"; -})(PulseAttributes = exports.PulseAttributes || (exports.PulseAttributes = {})); +})(PulseAttributes || (exports.PulseAttributes = PulseAttributes = {})); /** * The names of the string constants you can use as child tags for TableauPulse custom element. */ @@ -2813,7 +1644,7 @@ var PulseChildElements; * Contains a list of filter parameters. */ PulseChildElements["PulseFilter"] = "pulse-filter"; -})(PulseChildElements = exports.PulseChildElements || (exports.PulseChildElements = {})); +})(PulseChildElements || (exports.PulseChildElements = PulseChildElements = {})); /** * The attributes of the child elements of . */ @@ -2823,7 +1654,20 @@ var PulseChildElementAttributes; PulseChildElementAttributes["Field"] = "field"; PulseChildElementAttributes["Value"] = "value"; PulseChildElementAttributes["Type"] = "type"; -})(PulseChildElementAttributes = exports.PulseChildElementAttributes || (exports.PulseChildElementAttributes = {})); +})(PulseChildElementAttributes || (exports.PulseChildElementAttributes = PulseChildElementAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/TableauError.js": +/*!**************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/TableauError.js ***! + \**************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), @@ -2837,6 +1681,7 @@ var PulseChildElementAttributes; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VizChildElementAttributes = exports.VizChildElements = exports.VizAuthoringAttributes = exports.VizAttributes = exports.VizSharedAttributes = void 0; /** * The shared string constants you can use as HTML attributes for the and web component. * @ignore @@ -2850,7 +1695,7 @@ var VizSharedAttributes; VizSharedAttributes["OnEditInDesktopButtonClicked"] = "onEditInDesktopButtonClicked"; VizSharedAttributes["OnFirstVizSizeKnown"] = "onFirstVizSizeKnown"; VizSharedAttributes["OnFirstInteractive"] = "onFirstInteractive"; -})(VizSharedAttributes = exports.VizSharedAttributes || (exports.VizSharedAttributes = {})); +})(VizSharedAttributes || (exports.VizSharedAttributes = VizSharedAttributes = {})); /** * The names of the string constants you can use as HTML attributes for the web component. * @ignore @@ -2878,7 +1723,7 @@ var VizAttributes; VizAttributes["OnStoryPointSwitched"] = "onStoryPointSwitched"; VizAttributes["OnSummaryDataChanged"] = "onSummaryDataChanged"; VizAttributes["OnReadyToReceiveAuthToken"] = "onReadyToReceiveAuthToken"; -})(VizAttributes = exports.VizAttributes || (exports.VizAttributes = {})); +})(VizAttributes || (exports.VizAttributes = VizAttributes = {})); /** * The names of the string constants you can use as HTML attributes for the web component. * @ignore @@ -2889,7 +1734,7 @@ var VizAuthoringAttributes; VizAuthoringAttributes["OnWorkbookPublishedAs"] = "onWorkbookPublishedAs"; VizAuthoringAttributes["OnWorkbookReadyToClose"] = "onWorkbookReadyToClose"; VizAuthoringAttributes["HideCloseButton"] = "hide-close-button"; -})(VizAuthoringAttributes = exports.VizAuthoringAttributes || (exports.VizAuthoringAttributes = {})); +})(VizAuthoringAttributes || (exports.VizAuthoringAttributes = VizAuthoringAttributes = {})); /** * The names of the string constants you can use as child tags for TableauViz and TableauAuthoringViz custom elements. */ @@ -2911,13 +1756,26 @@ var VizChildElements; * 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 = {})); +})(VizChildElements || (exports.VizChildElements = VizChildElements = {})); var VizChildElementAttributes; (function (VizChildElementAttributes) { VizChildElementAttributes["Field"] = "field"; VizChildElementAttributes["Value"] = "value"; VizChildElementAttributes["Name"] = "name"; -})(VizChildElementAttributes = exports.VizChildElementAttributes || (exports.VizChildElementAttributes = {})); +})(VizChildElementAttributes || (exports.VizChildElementAttributes = VizChildElementAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Embedding/VizQLDataServiceInterfaces.js": +/*!****************************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Embedding/VizQLDataServiceInterfaces.js ***! + \****************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), @@ -2931,6 +1789,7 @@ var VizChildElementAttributes; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.WebComponentChildElementAttributes = exports.WebComponentChildElements = exports.EmbeddedIframeAttributes = exports.WebComponentAttributes = void 0; /** * The names of the common string constants you can use as HTML attributes for the tableau web component. * @ignore @@ -2945,7 +1804,7 @@ var WebComponentAttributes; WebComponentAttributes["IframeAuth"] = "iframe-auth"; WebComponentAttributes["OnVizLoadError"] = "onvizloaderror"; WebComponentAttributes["ForceTokenSync"] = "force-token-sync"; -})(WebComponentAttributes = exports.WebComponentAttributes || (exports.WebComponentAttributes = {})); +})(WebComponentAttributes || (exports.WebComponentAttributes = WebComponentAttributes = {})); /** * The names of the embedded iframe attributes whose values can be controlled. * @ignore @@ -2955,7 +1814,7 @@ var EmbeddedIframeAttributes; EmbeddedIframeAttributes["Loading"] = "iframe-attr-loading"; EmbeddedIframeAttributes["Style"] = "iframe-attr-style"; EmbeddedIframeAttributes["Class"] = "iframe-attr-class"; -})(EmbeddedIframeAttributes = exports.EmbeddedIframeAttributes || (exports.EmbeddedIframeAttributes = {})); +})(EmbeddedIframeAttributes || (exports.EmbeddedIframeAttributes = EmbeddedIframeAttributes = {})); /** * The names of the string constants you can use as child tags for TableauViz, TableauAuthoringViz and TableauAskData custom elements. * @ignore @@ -2970,13 +1829,26 @@ var WebComponentChildElements; * Custom styles applicable to the embedded iframe element itself (not inside it). */ WebComponentChildElements["IframeStyle"] = "iframe-style"; -})(WebComponentChildElements = exports.WebComponentChildElements || (exports.WebComponentChildElements = {})); +})(WebComponentChildElements || (exports.WebComponentChildElements = WebComponentChildElements = {})); var WebComponentChildElementAttributes; (function (WebComponentChildElementAttributes) { WebComponentChildElementAttributes["Field"] = "field"; WebComponentChildElementAttributes["Value"] = "value"; WebComponentChildElementAttributes["Name"] = "name"; -})(WebComponentChildElementAttributes = exports.WebComponentChildElementAttributes || (exports.WebComponentChildElementAttributes = {})); +})(WebComponentChildElementAttributes || (exports.WebComponentChildElementAttributes = WebComponentChildElementAttributes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Extensions/EventInterface.js": +/*!*****************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Extensions/EventInterface.js ***! + \*****************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), @@ -3019,7 +1891,7 @@ var Tableau; */ ErrorCodes["InternalError"] = "internal-error"; /** - * A dialog must start on the same domain as the parent extenion. + * A dialog must start on the same domain as the parent extension. */ ErrorCodes["InvalidDomainDialog"] = "invalid-dialog-domain"; /** @@ -3070,6 +1942,18 @@ var Tableau; ExtensionMode["Authoring"] = "authoring"; ExtensionMode["Viewing"] = "viewing"; })(ExtensionMode = Tableau.ExtensionMode || (Tableau.ExtensionMode = {})); + /** + * The media type of the exported content. + */ + let ExportedMediaType; + (function (ExportedMediaType) { + ExportedMediaType["Image"] = "image"; + ExportedMediaType["Pdf"] = "pdf"; + ExportedMediaType["Svg"] = "svg"; + ExportedMediaType["Html"] = "html"; + ExportedMediaType["PowerPoint"] = "powerpoint"; + ExportedMediaType["Excel"] = "excel"; + })(ExportedMediaType = Tableau.ExportedMediaType || (Tableau.ExportedMediaType = {})); /** * Represents the type of event that can be listened for. */ @@ -3087,9 +1971,9 @@ var Tableau; /** 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. */ + /** A parameter has had its value modified. You can use this event type with {@link Parameter} objects. */ TableauEventType["ParameterChanged"] = "parameter-changed"; - /** Settings have been changed for this extension. You can use this event type with [[Settings]] objects. */ + /** Settings have been changed for this extension. You can use this event type with {@link Settings} objects. */ TableauEventType["SettingsChanged"] = "settings-changed"; /** The dashboard layout has changed * @category Dashboard Extensions @@ -3154,6 +2038,84 @@ var Tableau; module.exports = Tableau; +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/UI.js": +/*!****************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Extensions/Namespaces/UI.js ***! + \****************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Extensions/ParameterInterfaces.js": +/*!**********************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Extensions/ParameterInterfaces.js ***! + \**********************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Extensions/TableauError.js": +/*!***************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Extensions/TableauError.js ***! + \***************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/AnnotationInterfaces.js": +/*!*******************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/AnnotationInterfaces.js ***! + \*******************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/DataSourceInterfaces.js": +/*!*******************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/DataSourceInterfaces.js ***! + \*******************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/DataTableInterfaces.js": +/*!******************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/DataTableInterfaces.js ***! + \******************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + /***/ }), /***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js": @@ -3165,6 +2127,7 @@ module.exports = Tableau; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SharedErrorCodes = void 0; var SharedErrorCodes; (function (SharedErrorCodes) { /** @@ -3240,7 +2203,33 @@ var SharedErrorCodes; * Can occur when an api call times out. */ SharedErrorCodes["Timeout"] = "timeout"; -})(SharedErrorCodes = exports.SharedErrorCodes || (exports.SharedErrorCodes = {})); +})(SharedErrorCodes || (exports.SharedErrorCodes = SharedErrorCodes = {})); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/EnvironmentInterfaces.js": +/*!********************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/EnvironmentInterfaces.js ***! + \********************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/FilterInterfaces.js": +/*!***************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/FilterInterfaces.js ***! + \***************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), @@ -3532,6 +2521,37 @@ var Tableau; MarkType["Heatmap"] = "heatmap"; MarkType["VizExtension"] = "viz-extension"; })(MarkType = Tableau.MarkType || (Tableau.MarkType = {})); + let DataFormatType; + (function (DataFormatType) { + DataFormatType["AutoFormat"] = "auto-format"; + DataFormatType["SystemNumber"] = "system-number"; + DataFormatType["SystemCurrency"] = "system-currency"; + DataFormatType["SystemLongDate"] = "system-long-date"; + DataFormatType["SystemShortDate"] = "system-short-date"; + DataFormatType["SystemTime"] = "system-time"; + DataFormatType["Custom"] = "custom"; + DataFormatType["CustomNumber"] = "custom-number"; + DataFormatType["CustomCurrency"] = "custom-currency"; + DataFormatType["CustomScientific"] = "custom-scientific"; + DataFormatType["CustomPercentage"] = "custom-percentage"; + })(DataFormatType = Tableau.DataFormatType || (Tableau.DataFormatType = {})); + let NumberFormatUnits; + (function (NumberFormatUnits) { + NumberFormatUnits["None"] = "units-none"; + NumberFormatUnits["Thousands"] = "units-thousands"; + NumberFormatUnits["Millions"] = "units-millions"; + NumberFormatUnits["BillionsEnglish"] = "units-billions-english"; + NumberFormatUnits["BillionsStandard"] = "units-billions-standard"; + })(NumberFormatUnits = Tableau.NumberFormatUnits || (Tableau.NumberFormatUnits = {})); + let NegativeNumberFormat; + (function (NegativeNumberFormat) { + NegativeNumberFormat["Automatic"] = "automatic"; + NegativeNumberFormat["Parentheses"] = "parentheses"; + NegativeNumberFormat["OuterPrefix"] = "outer-prefix"; + NegativeNumberFormat["OuterSuffix"] = "outer-suffix"; + NegativeNumberFormat["InnerPrefix"] = "inner-prefix"; + NegativeNumberFormat["InnerSuffix"] = "inner-suffix"; + })(NegativeNumberFormat = Tableau.NegativeNumberFormat || (Tableau.NegativeNumberFormat = {})); /** * An enumeration describing the different types of allowable values. * This is used for restricting the domain of a parameter @@ -3647,62 +2667,149 @@ var Tableau; module.exports = Tableau; +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/SelectionInterfaces.js": +/*!******************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/SelectionInterfaces.js ***! + \******************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/SheetInterfaces.js": +/*!**************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/SheetInterfaces.js ***! + \**************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/VisualModelInterface.js": +/*!*******************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/VisualModelInterface.js ***! + \*******************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-external-contract-js/lib/src/ExternalContract/Shared/WorkbookFormattingInterfaces.js": +/*!***************************************************************************************************!*\ + !*** ../api-external-contract-js/lib/src/ExternalContract/Shared/WorkbookFormattingInterfaces.js ***! + \***************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + /***/ }), /***/ "../api-external-contract-js/lib/src/SharedApiExternalContract.js": /*!************************************************************************!*\ !*** ../api-external-contract-js/lib/src/SharedApiExternalContract.js ***! \************************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +/***/ (function(__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]; -} +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; Object.defineProperty(exports, "__esModule", ({ value: true })); -__export(__webpack_require__(/*! ./ExternalContract/Shared/Enums */ "../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js")); +exports.ZoneVisibilityType = exports.TrendLineModelType = exports.SortDirection = exports.SheetType = exports.SelectOptions = exports.SelectionUpdateType = exports.ReplaySpeedType = exports.QuickTableCalcType = exports.PeriodType = exports.ParameterValueType = exports.NumberFormatUnits = exports.NegativeNumberFormat = exports.MarkType = exports.IncludeDataValuesOption = exports.HierarchicalLevelSelectionState = exports.FilterUpdateType = exports.FilterType = exports.FilterNullOption = exports.FilterDomainType = exports.FieldRoleType = exports.FieldAggregationType = exports.EncodingType = exports.DialogStyle = exports.DateRangeType = exports.DataType = exports.DataFormatType = exports.DashboardObjectVisibilityType = exports.DashboardObjectType = exports.DashboardLayoutChange = exports.ColumnType = exports.ClassNameKey = exports.AnnotationType = exports.AnalyticsObjectType = void 0; +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/AnnotationInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Shared/AnnotationInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/DataSourceInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Shared/DataSourceInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/DataTableInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Shared/DataTableInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/Enums */ "../api-external-contract-js/lib/src/ExternalContract/Shared/Enums.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/EnvironmentInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Shared/EnvironmentInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/FilterInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Shared/FilterInterfaces.js"), exports); 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.SelectionUpdateType = Tableau_1.SelectionUpdateType; -exports.SelectOptions = Tableau_1.SelectOptions; -exports.SheetType = Tableau_1.SheetType; -exports.SortDirection = Tableau_1.SortDirection; -exports.TrendLineModelType = Tableau_1.TrendLineModelType; -exports.ZoneVisibilityType = Tableau_1.ZoneVisibilityType; +Object.defineProperty(exports, "AnalyticsObjectType", ({ enumerable: true, get: function () { return Tableau_1.AnalyticsObjectType; } })); +Object.defineProperty(exports, "AnnotationType", ({ enumerable: true, get: function () { return Tableau_1.AnnotationType; } })); +Object.defineProperty(exports, "ClassNameKey", ({ enumerable: true, get: function () { return Tableau_1.ClassNameKey; } })); +Object.defineProperty(exports, "ColumnType", ({ enumerable: true, get: function () { return Tableau_1.ColumnType; } })); +Object.defineProperty(exports, "DashboardLayoutChange", ({ enumerable: true, get: function () { return Tableau_1.DashboardLayoutChange; } })); +Object.defineProperty(exports, "DashboardObjectType", ({ enumerable: true, get: function () { return Tableau_1.DashboardObjectType; } })); +Object.defineProperty(exports, "DashboardObjectVisibilityType", ({ enumerable: true, get: function () { return Tableau_1.DashboardObjectVisibilityType; } })); +Object.defineProperty(exports, "DataFormatType", ({ enumerable: true, get: function () { return Tableau_1.DataFormatType; } })); +Object.defineProperty(exports, "DataType", ({ enumerable: true, get: function () { return Tableau_1.DataType; } })); +Object.defineProperty(exports, "DateRangeType", ({ enumerable: true, get: function () { return Tableau_1.DateRangeType; } })); +Object.defineProperty(exports, "DialogStyle", ({ enumerable: true, get: function () { return Tableau_1.DialogStyle; } })); +Object.defineProperty(exports, "EncodingType", ({ enumerable: true, get: function () { return Tableau_1.EncodingType; } })); +Object.defineProperty(exports, "FieldAggregationType", ({ enumerable: true, get: function () { return Tableau_1.FieldAggregationType; } })); +Object.defineProperty(exports, "FieldRoleType", ({ enumerable: true, get: function () { return Tableau_1.FieldRoleType; } })); +Object.defineProperty(exports, "FilterDomainType", ({ enumerable: true, get: function () { return Tableau_1.FilterDomainType; } })); +Object.defineProperty(exports, "FilterNullOption", ({ enumerable: true, get: function () { return Tableau_1.FilterNullOption; } })); +Object.defineProperty(exports, "FilterType", ({ enumerable: true, get: function () { return Tableau_1.FilterType; } })); +Object.defineProperty(exports, "FilterUpdateType", ({ enumerable: true, get: function () { return Tableau_1.FilterUpdateType; } })); +Object.defineProperty(exports, "HierarchicalLevelSelectionState", ({ enumerable: true, get: function () { return Tableau_1.HierarchicalLevelSelectionState; } })); +Object.defineProperty(exports, "IncludeDataValuesOption", ({ enumerable: true, get: function () { return Tableau_1.IncludeDataValuesOption; } })); +Object.defineProperty(exports, "MarkType", ({ enumerable: true, get: function () { return Tableau_1.MarkType; } })); +Object.defineProperty(exports, "NegativeNumberFormat", ({ enumerable: true, get: function () { return Tableau_1.NegativeNumberFormat; } })); +Object.defineProperty(exports, "NumberFormatUnits", ({ enumerable: true, get: function () { return Tableau_1.NumberFormatUnits; } })); +Object.defineProperty(exports, "ParameterValueType", ({ enumerable: true, get: function () { return Tableau_1.ParameterValueType; } })); +Object.defineProperty(exports, "PeriodType", ({ enumerable: true, get: function () { return Tableau_1.PeriodType; } })); +Object.defineProperty(exports, "QuickTableCalcType", ({ enumerable: true, get: function () { return Tableau_1.QuickTableCalcType; } })); +Object.defineProperty(exports, "ReplaySpeedType", ({ enumerable: true, get: function () { return Tableau_1.ReplaySpeedType; } })); +Object.defineProperty(exports, "SelectionUpdateType", ({ enumerable: true, get: function () { return Tableau_1.SelectionUpdateType; } })); +Object.defineProperty(exports, "SelectOptions", ({ enumerable: true, get: function () { return Tableau_1.SelectOptions; } })); +Object.defineProperty(exports, "SheetType", ({ enumerable: true, get: function () { return Tableau_1.SheetType; } })); +Object.defineProperty(exports, "SortDirection", ({ enumerable: true, get: function () { return Tableau_1.SortDirection; } })); +Object.defineProperty(exports, "TrendLineModelType", ({ enumerable: true, get: function () { return Tableau_1.TrendLineModelType; } })); +Object.defineProperty(exports, "ZoneVisibilityType", ({ enumerable: true, get: function () { return Tableau_1.ZoneVisibilityType; } })); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/SelectionInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Shared/SelectionInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/SheetInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Shared/SheetInterfaces.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/VisualModelInterface */ "../api-external-contract-js/lib/src/ExternalContract/Shared/VisualModelInterface.js"), exports); +__exportStar(__webpack_require__(/*! ./ExternalContract/Shared/WorkbookFormattingInterfaces */ "../api-external-contract-js/lib/src/ExternalContract/Shared/WorkbookFormattingInterfaces.js"), exports); +/***/ }), + +/***/ "../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":196,"fix":0}'); + /***/ }), /***/ "../api-internal-contract-js/lib/src/JsApiInternalContract.js": /*!********************************************************************!*\ !*** ../api-internal-contract-js/lib/src/JsApiInternalContract.js ***! \********************************************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +/***/ (function(__unused_webpack_module, exports, __webpack_require__) { "use strict"; @@ -3711,28 +2818,50 @@ exports.ZoneVisibilityType = Tableau_1.ZoneVisibilityType; * * 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]; -} +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.MESSAGING_VERSION = exports.INTERNAL_CONTRACT_VERSION = void 0; // 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")); +__exportStar(__webpack_require__(/*! ./contract/DataTypeConverter */ "../api-internal-contract-js/lib/src/contract/DataTypeConverter.js"), exports); +__exportStar(__webpack_require__(/*! ./contract/Enums */ "../api-internal-contract-js/lib/src/contract/Enums.js"), exports); +__exportStar(__webpack_require__(/*! ./contract/Models */ "../api-internal-contract-js/lib/src/contract/Models.js"), exports); +__exportStar(__webpack_require__(/*! ./contract/Notifications */ "../api-internal-contract-js/lib/src/contract/Notifications.js"), exports); +__exportStar(__webpack_require__(/*! ./contract/Parameters */ "../api-internal-contract-js/lib/src/contract/Parameters.js"), exports); +__exportStar(__webpack_require__(/*! ./contract/Verbs */ "../api-internal-contract-js/lib/src/contract/Verbs.js"), exports); +__exportStar(__webpack_require__(/*! ./interface/AskDataInterface */ "../api-internal-contract-js/lib/src/interface/AskDataInterface.js"), exports); +__exportStar(__webpack_require__(/*! ./interface/InitializationOptions */ "../api-internal-contract-js/lib/src/interface/InitializationOptions.js"), exports); +__exportStar(__webpack_require__(/*! ./interface/InternalApiDispatcher */ "../api-internal-contract-js/lib/src/interface/InternalApiDispatcher.js"), exports); +__exportStar(__webpack_require__(/*! ./interface/PulseInterface */ "../api-internal-contract-js/lib/src/interface/PulseInterface.js"), exports); +__exportStar(__webpack_require__(/*! ./interface/VersionNumber */ "../api-internal-contract-js/lib/src/interface/VersionNumber.js"), exports); +__exportStar(__webpack_require__(/*! ./interface/VqlInterface */ "../api-internal-contract-js/lib/src/interface/VqlInterface.js"), exports); +__exportStar(__webpack_require__(/*! ./messaging/CrossFrameMessenger */ "../api-internal-contract-js/lib/src/messaging/CrossFrameMessenger.js"), exports); +__exportStar(__webpack_require__(/*! ./messaging/interface/MessageDispatcher */ "../api-internal-contract-js/lib/src/messaging/interface/MessageDispatcher.js"), exports); +__exportStar(__webpack_require__(/*! ./messaging/interface/MessageListener */ "../api-internal-contract-js/lib/src/messaging/interface/MessageListener.js"), exports); +__exportStar(__webpack_require__(/*! ./messaging/interface/MessageTypes */ "../api-internal-contract-js/lib/src/messaging/interface/MessageTypes.js"), exports); +__exportStar(__webpack_require__(/*! ./messaging/interface/Messenger */ "../api-internal-contract-js/lib/src/messaging/interface/Messenger.js"), exports); +__exportStar(__webpack_require__(/*! ./messaging/interface/PreparedMessage */ "../api-internal-contract-js/lib/src/messaging/interface/PreparedMessage.js"), exports); +__exportStar(__webpack_require__(/*! ./versioning/external/ExternalContractVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalContractVersionConverter.js"), exports); +__exportStar(__webpack_require__(/*! ./versioning/external/ExternalIdentityVersionConverter */ "../api-internal-contract-js/lib/src/versioning/external/ExternalIdentityVersionConverter.js"), exports); +__exportStar(__webpack_require__(/*! ./versioning/external/ExternalVersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/external/ExternalVersionConverterFactory.js"), exports); +__exportStar(__webpack_require__(/*! ./versioning/InternalContractVersionConverter */ "../api-internal-contract-js/lib/src/versioning/InternalContractVersionConverter.js"), exports); +__exportStar(__webpack_require__(/*! ./versioning/VersionConverterFactory */ "../api-internal-contract-js/lib/src/versioning/VersionConverterFactory.js"), exports); // 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 = { @@ -3753,6 +2882,7 @@ exports.MESSAGING_VERSION = { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DataTypeConverter = void 0; const Enums_1 = __webpack_require__(/*! ./Enums */ "../api-internal-contract-js/lib/src/contract/Enums.js"); class DataTypeConverter { static isSpecial(valueAsString) { @@ -3883,6 +3013,7 @@ DataTypeConverter.specialValueIndicator = '%null%'; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.NegativeNumberFormat = exports.NumberFormatUnits = exports.DataFormatType = exports.PulseErrorMessageVisibility = exports.PulseTimeDimension = exports.EncodingType = exports.FitPages = exports.PageScalingOption = exports.ScaleMode = exports.PageOrientation = exports.PageSizeOption = exports.ApiShowDataTableFormat = exports.ExtensionDialogResult = exports.DateRangeType = exports.FilterType = exports.MarkType = exports.HierarchicalLevelSelectionState = exports.QuantitativeIncludedValues = exports.SelectOptions = exports.SelectionUpdateType = exports.FilterDomainType = exports.FilterNullOption = exports.DateStepPeriod = exports.DomainRestrictionType = exports.SheetType = exports.FilterUpdateType = exports.FieldRoleType = exports.FieldAggregationType = exports.ErrorCodes = exports.EncodedDataType = exports.DialogStyle = exports.DataType = exports.DashboardObjectType = exports.ColumnType = exports.AnnotateEnum = exports.ExportedMediaType = exports.ExtensionMode = exports.ExtensionContext = void 0; var ExtensionContext; (function (ExtensionContext) { ExtensionContext["Desktop"] = "desktop"; @@ -3891,25 +3022,34 @@ var ExtensionContext; ExtensionContext["Cloud"] = "cloud"; ExtensionContext["PublicWeb"] = "public-web"; ExtensionContext["PublicDesktop"] = "public-desktop"; -})(ExtensionContext = exports.ExtensionContext || (exports.ExtensionContext = {})); +})(ExtensionContext || (exports.ExtensionContext = ExtensionContext = {})); var ExtensionMode; (function (ExtensionMode) { ExtensionMode["Authoring"] = "authoring"; ExtensionMode["Viewing"] = "viewing"; ExtensionMode["Unknown"] = "unknown"; -})(ExtensionMode = exports.ExtensionMode || (exports.ExtensionMode = {})); +})(ExtensionMode || (exports.ExtensionMode = ExtensionMode = {})); +var ExportedMediaType; +(function (ExportedMediaType) { + ExportedMediaType["Image"] = "image"; + ExportedMediaType["Pdf"] = "pdf"; + ExportedMediaType["Svg"] = "svg"; + ExportedMediaType["Html"] = "html"; + ExportedMediaType["PowerPoint"] = "powerpoint"; + ExportedMediaType["Excel"] = "excel"; +})(ExportedMediaType || (exports.ExportedMediaType = ExportedMediaType = {})); var AnnotateEnum; (function (AnnotateEnum) { AnnotateEnum["Mark"] = "mark"; AnnotateEnum["Point"] = "point"; AnnotateEnum["Area"] = "area"; -})(AnnotateEnum = exports.AnnotateEnum || (exports.AnnotateEnum = {})); +})(AnnotateEnum || (exports.AnnotateEnum = AnnotateEnum = {})); var ColumnType; (function (ColumnType) { ColumnType["Discrete"] = "discrete"; ColumnType["Continuous"] = "continuous"; ColumnType["Unknown"] = "unknown"; -})(ColumnType = exports.ColumnType || (exports.ColumnType = {})); +})(ColumnType || (exports.ColumnType = ColumnType = {})); var DashboardObjectType; (function (DashboardObjectType) { DashboardObjectType["Blank"] = "blank"; @@ -3923,7 +3063,7 @@ var DashboardObjectType; DashboardObjectType["Image"] = "image"; DashboardObjectType["WebPage"] = "web-page"; DashboardObjectType["Extension"] = "extension"; -})(DashboardObjectType = exports.DashboardObjectType || (exports.DashboardObjectType = {})); +})(DashboardObjectType || (exports.DashboardObjectType = DashboardObjectType = {})); var DataType; (function (DataType) { DataType["String"] = "string"; @@ -3934,20 +3074,20 @@ var DataType; DataType["DateTime"] = "date-time"; DataType["Spatial"] = "spatial"; DataType["Unknown"] = "unknown"; -})(DataType = exports.DataType || (exports.DataType = {})); +})(DataType || (exports.DataType = DataType = {})); var DialogStyle; (function (DialogStyle) { DialogStyle["Window"] = "window"; DialogStyle["Modal"] = "modal"; DialogStyle["Modeless"] = "modeless"; -})(DialogStyle = exports.DialogStyle || (exports.DialogStyle = {})); +})(DialogStyle || (exports.DialogStyle = DialogStyle = {})); var EncodedDataType; (function (EncodedDataType) { EncodedDataType["Number"] = "number"; EncodedDataType["String"] = "string"; EncodedDataType["Date"] = "date"; EncodedDataType["Boolean"] = "boolean"; -})(EncodedDataType = exports.EncodedDataType || (exports.EncodedDataType = {})); +})(EncodedDataType || (exports.EncodedDataType = EncodedDataType = {})); var ErrorCodes; (function (ErrorCodes) { ErrorCodes["INITIALIZATION_ERROR"] = "initialization-error"; @@ -3959,7 +3099,7 @@ var ErrorCodes; ErrorCodes["VERSION_NOT_CONFIGURED"] = "version-not-configured"; ErrorCodes["VISIBILITY_ERROR"] = "visibility-error"; ErrorCodes["UNKNOWN_VERB_ID"] = "unknown-verb-id"; -})(ErrorCodes = exports.ErrorCodes || (exports.ErrorCodes = {})); +})(ErrorCodes || (exports.ErrorCodes = ErrorCodes = {})); var FieldAggregationType; (function (FieldAggregationType) { FieldAggregationType["Sum"] = "sum"; @@ -4002,13 +3142,13 @@ var FieldAggregationType; FieldAggregationType["Kurtosis"] = "kurtosis"; FieldAggregationType["InOut"] = "in-out"; FieldAggregationType["User"] = "user"; -})(FieldAggregationType = exports.FieldAggregationType || (exports.FieldAggregationType = {})); +})(FieldAggregationType || (exports.FieldAggregationType = FieldAggregationType = {})); var FieldRoleType; (function (FieldRoleType) { FieldRoleType["Dimension"] = "dimension"; FieldRoleType["Measure"] = "measure"; FieldRoleType["Unknown"] = "unknown"; -})(FieldRoleType = exports.FieldRoleType || (exports.FieldRoleType = {})); +})(FieldRoleType || (exports.FieldRoleType = FieldRoleType = {})); /** * The different update types for applying filter. */ @@ -4018,19 +3158,19 @@ var FilterUpdateType; FilterUpdateType["All"] = "all"; FilterUpdateType["Replace"] = "replace"; FilterUpdateType["Remove"] = "remove"; -})(FilterUpdateType = exports.FilterUpdateType || (exports.FilterUpdateType = {})); +})(FilterUpdateType || (exports.FilterUpdateType = FilterUpdateType = {})); var SheetType; (function (SheetType) { SheetType["Dashboard"] = "dashboard"; SheetType["Story"] = "story"; SheetType["Worksheet"] = "worksheet"; -})(SheetType = exports.SheetType || (exports.SheetType = {})); +})(SheetType || (exports.SheetType = SheetType = {})); var DomainRestrictionType; (function (DomainRestrictionType) { DomainRestrictionType["All"] = "all"; DomainRestrictionType["List"] = "list"; DomainRestrictionType["Range"] = "range"; -})(DomainRestrictionType = exports.DomainRestrictionType || (exports.DomainRestrictionType = {})); +})(DomainRestrictionType || (exports.DomainRestrictionType = DomainRestrictionType = {})); var DateStepPeriod; (function (DateStepPeriod) { DateStepPeriod["Years"] = "years"; @@ -4044,7 +3184,7 @@ var DateStepPeriod; DateStepPeriod["IsoYears"] = "iso-years"; DateStepPeriod["IsoQuarters"] = "iso-quarters"; DateStepPeriod["IsoWeeks"] = "iso-weeks"; -})(DateStepPeriod = exports.DateStepPeriod || (exports.DateStepPeriod = {})); +})(DateStepPeriod || (exports.DateStepPeriod = DateStepPeriod = {})); /** * The option for specifying which values to include for filtering. */ @@ -4053,7 +3193,7 @@ var FilterNullOption; FilterNullOption["NullValues"] = "nullvalues"; FilterNullOption["NonNullValues"] = "nonnullvalues"; FilterNullOption["AllValues"] = "allvalues"; -})(FilterNullOption = exports.FilterNullOption || (exports.FilterNullOption = {})); +})(FilterNullOption || (exports.FilterNullOption = FilterNullOption = {})); /** * The type of filter domain */ @@ -4061,7 +3201,7 @@ var FilterDomainType; (function (FilterDomainType) { FilterDomainType["Relevant"] = "relevant"; FilterDomainType["Database"] = "database"; -})(FilterDomainType = exports.FilterDomainType || (exports.FilterDomainType = {})); +})(FilterDomainType || (exports.FilterDomainType = FilterDomainType = {})); /** * Internal enum for specifying the selection type for select marks api. */ @@ -4070,7 +3210,7 @@ var SelectionUpdateType; SelectionUpdateType["Replace"] = "select-replace"; SelectionUpdateType["Add"] = "select-add"; SelectionUpdateType["Remove"] = "select-remove"; -})(SelectionUpdateType = exports.SelectionUpdateType || (exports.SelectionUpdateType = {})); +})(SelectionUpdateType || (exports.SelectionUpdateType = SelectionUpdateType = {})); /** * Internal enum for specifying the select option for the select tuples api. */ @@ -4081,7 +3221,7 @@ var SelectOptions; SelectOptions["Menu"] = "select-options-menu"; SelectOptions["Range"] = "select-options-range"; SelectOptions["Search"] = "select-options-search"; -})(SelectOptions = exports.SelectOptions || (exports.SelectOptions = {})); +})(SelectOptions || (exports.SelectOptions = SelectOptions = {})); /** * Internal enum for specifying the included values type for range selection. */ @@ -4090,7 +3230,7 @@ var QuantitativeIncludedValues; QuantitativeIncludedValues["IncludeNull"] = "include-null"; QuantitativeIncludedValues["IncludeNonNull"] = "include-non-null"; QuantitativeIncludedValues["IncludeAll"] = "include-all"; -})(QuantitativeIncludedValues = exports.QuantitativeIncludedValues || (exports.QuantitativeIncludedValues = {})); +})(QuantitativeIncludedValues || (exports.QuantitativeIncludedValues = QuantitativeIncludedValues = {})); /** * Internal enum for specifying a hierarchical level selection state. */ @@ -4100,7 +3240,7 @@ var HierarchicalLevelSelectionState; HierarchicalLevelSelectionState["NoneSelected"] = "none-selected"; HierarchicalLevelSelectionState["SomeSelected"] = "some-selected"; HierarchicalLevelSelectionState["UnknownSelected"] = "unknown-selected"; -})(HierarchicalLevelSelectionState = exports.HierarchicalLevelSelectionState || (exports.HierarchicalLevelSelectionState = {})); +})(HierarchicalLevelSelectionState || (exports.HierarchicalLevelSelectionState = HierarchicalLevelSelectionState = {})); /** * Type of mark for a given marks card in a viz. */ @@ -4119,7 +3259,7 @@ var MarkType; MarkType["Polygon"] = "polygon"; MarkType["Heatmap"] = "heatmap"; MarkType["VizExtension"] = "viz-extension"; -})(MarkType = exports.MarkType || (exports.MarkType = {})); +})(MarkType || (exports.MarkType = MarkType = {})); /** * Internal enum for specifying the type of filter */ @@ -4129,7 +3269,7 @@ var FilterType; FilterType["Range"] = "range"; FilterType["RelativeDate"] = "relativeDate"; FilterType["Hierarchical"] = "hierarchical"; -})(FilterType = exports.FilterType || (exports.FilterType = {})); +})(FilterType || (exports.FilterType = FilterType = {})); /** * Internal enum for specifying the DateRangeType of a relative date filter */ @@ -4159,7 +3299,7 @@ var DateRangeType; * 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 = {})); +})(DateRangeType || (exports.DateRangeType = DateRangeType = {})); /** * Used to determine if the launching of an extension dialog succeeded or failed. */ @@ -4168,7 +3308,7 @@ var ExtensionDialogResult; ExtensionDialogResult["DialogAlreadyOpen"] = "dialog-already-open"; ExtensionDialogResult["InvalidDomain"] = "invalid-domain"; ExtensionDialogResult["Success"] = "success"; -})(ExtensionDialogResult = exports.ExtensionDialogResult || (exports.ExtensionDialogResult = {})); +})(ExtensionDialogResult || (exports.ExtensionDialogResult = ExtensionDialogResult = {})); /** * Used to optimize the getSummaryData/getUnderlyingTableData results * Mapped from external IncludeDataValuesOption @@ -4178,7 +3318,7 @@ var ApiShowDataTableFormat; ApiShowDataTableFormat["NativeValuesOnly"] = "native-values-only"; ApiShowDataTableFormat["FormattedValuesOnly"] = "formatted-values-only"; ApiShowDataTableFormat["NativeAndFormattedValues"] = "native-and-formatted-values"; -})(ApiShowDataTableFormat = exports.ApiShowDataTableFormat || (exports.ApiShowDataTableFormat = {})); +})(ApiShowDataTableFormat || (exports.ApiShowDataTableFormat = ApiShowDataTableFormat = {})); /** * Used to set page size for export layout options. */ @@ -4199,7 +3339,7 @@ var PageSizeOption; PageSizeOption["B5"] = "b5"; PageSizeOption["Quarto"] = "quarto"; PageSizeOption["Unspecified"] = "unspecified"; -})(PageSizeOption = exports.PageSizeOption || (exports.PageSizeOption = {})); +})(PageSizeOption || (exports.PageSizeOption = PageSizeOption = {})); /** * Used to set the page orientation mode for export layout options. */ @@ -4208,7 +3348,7 @@ var PageOrientation; PageOrientation["Printer"] = "printer"; PageOrientation["Portrait"] = "portrait"; PageOrientation["Landscape"] = "landscape"; -})(PageOrientation = exports.PageOrientation || (exports.PageOrientation = {})); +})(PageOrientation || (exports.PageOrientation = PageOrientation = {})); /** * Used to set scale mode for export layout options. */ @@ -4217,7 +3357,7 @@ var ScaleMode; ScaleMode["ScaleAuto"] = "auto"; ScaleMode["ScalePercentage"] = "percent"; ScaleMode["ScaleFitPages"] = "fit-pages"; -})(ScaleMode = exports.ScaleMode || (exports.ScaleMode = {})); +})(ScaleMode || (exports.ScaleMode = ScaleMode = {})); /** * Used by setFitAndScaleValues to scale percent values */ @@ -4233,7 +3373,7 @@ var PageScalingOption; PageScalingOption["ScalePct60"] = "pct60"; PageScalingOption["ScalePct50"] = "pct50"; PageScalingOption["ScalePct25"] = "pct25"; -})(PageScalingOption = exports.PageScalingOption || (exports.PageScalingOption = {})); +})(PageScalingOption || (exports.PageScalingOption = PageScalingOption = {})); /** * Used by setFitAndScaleValues to scale fit page values */ @@ -4243,7 +3383,7 @@ var FitPages; FitPages["FitTwoHigh"] = "fit0x2"; FitPages["FitOneWide"] = "fit1x0"; FitPages["FitTwoWide"] = "fit2x0"; -})(FitPages = exports.FitPages || (exports.FitPages = {})); +})(FitPages || (exports.FitPages = FitPages = {})); /** * Used by getVisualSpecificationAsync */ @@ -4259,7 +3399,7 @@ var EncodingType; EncodingType["Angle"] = "angle"; EncodingType["Geometry"] = "geometry"; EncodingType["Custom"] = "custom"; -})(EncodingType = exports.EncodingType || (exports.EncodingType = {})); +})(EncodingType || (exports.EncodingType = EncodingType = {})); var PulseTimeDimension; (function (PulseTimeDimension) { PulseTimeDimension["Today"] = "Today"; @@ -4272,13 +3412,57 @@ var PulseTimeDimension; PulseTimeDimension["LastQuarter"] = "LastQuarter"; PulseTimeDimension["YearToDate"] = "YearToDate"; PulseTimeDimension["LastYear"] = "LastYear"; -})(PulseTimeDimension = exports.PulseTimeDimension || (exports.PulseTimeDimension = {})); +})(PulseTimeDimension || (exports.PulseTimeDimension = PulseTimeDimension = {})); var PulseErrorMessageVisibility; (function (PulseErrorMessageVisibility) { PulseErrorMessageVisibility["Visible"] = "visible"; PulseErrorMessageVisibility["Hidden"] = "hidden"; PulseErrorMessageVisibility["Suppressed"] = "suppressed"; -})(PulseErrorMessageVisibility = exports.PulseErrorMessageVisibility || (exports.PulseErrorMessageVisibility = {})); +})(PulseErrorMessageVisibility || (exports.PulseErrorMessageVisibility = PulseErrorMessageVisibility = {})); +var DataFormatType; +(function (DataFormatType) { + DataFormatType["AutoFormat"] = "auto-format"; + DataFormatType["SystemNumber"] = "system-number"; + DataFormatType["SystemCurrency"] = "system-currency"; + DataFormatType["SystemLongDate"] = "system-long-date"; + DataFormatType["SystemShortDate"] = "system-short-date"; + DataFormatType["SystemTime"] = "system-time"; + DataFormatType["Custom"] = "custom"; + DataFormatType["CustomNumber"] = "custom-number"; + DataFormatType["CustomCurrency"] = "custom-currency"; + DataFormatType["CustomScientific"] = "custom-scientific"; + DataFormatType["CustomPercentage"] = "custom-percentage"; +})(DataFormatType || (exports.DataFormatType = DataFormatType = {})); +var NumberFormatUnits; +(function (NumberFormatUnits) { + NumberFormatUnits["None"] = "units-none"; + NumberFormatUnits["Thousands"] = "units-thousands"; + NumberFormatUnits["Millions"] = "units-millions"; + NumberFormatUnits["BillionsEnglish"] = "units-billions-english"; + NumberFormatUnits["BillionsStandard"] = "units-billions-standard"; +})(NumberFormatUnits || (exports.NumberFormatUnits = NumberFormatUnits = {})); +var NegativeNumberFormat; +(function (NegativeNumberFormat) { + NegativeNumberFormat["Automatic"] = "automatic"; + NegativeNumberFormat["Parentheses"] = "parentheses"; + NegativeNumberFormat["OuterPrefix"] = "outer-prefix"; + NegativeNumberFormat["OuterSuffix"] = "outer-suffix"; + NegativeNumberFormat["InnerPrefix"] = "inner-prefix"; + NegativeNumberFormat["InnerSuffix"] = "inner-suffix"; +})(NegativeNumberFormat || (exports.NegativeNumberFormat = NegativeNumberFormat = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/contract/Models.js": +/*!**************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/contract/Models.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), @@ -4292,6 +3476,7 @@ var PulseErrorMessageVisibility; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.NotificationId = void 0; var NotificationId; (function (NotificationId) { NotificationId["CustomMarkContextMenuClicked"] = "custom-mark-context-menu-clicked"; @@ -4332,7 +3517,7 @@ var NotificationId; NotificationId["TabSwitched"] = "tab-switched"; NotificationId["StoryPointSwitched"] = "story-point-switched"; NotificationId["ReadyToReceiveAuthToken"] = "ready-to-receive-auth-token"; -})(NotificationId = exports.NotificationId || (exports.NotificationId = {})); +})(NotificationId || (exports.NotificationId = NotificationId = {})); /***/ }), @@ -4346,6 +3531,7 @@ var NotificationId; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ParameterId = void 0; // PLEASE KEEP IN ALPHABETICAL ORDER. This helps with visually finding entries, knowing where to put // new ones, and merge conflicts. var ParameterId; @@ -4406,6 +3592,8 @@ var ParameterId; ParameterId["ExtensionLocator"] = "extension-locator"; ParameterId["ExtensionSettingsInfo"] = "extension-settings-info"; ParameterId["ExtensionZoneId"] = "extension-zone-id"; + ParameterId["ExtensionMediaBlob"] = "extension-media-blob"; + ParameterId["HasExtensionRenderingTimedOut"] = "has-extension-rendering-timed-out"; ParameterId["ExternalMenuDescription"] = "external-menu-description"; ParameterId["ExternalMenuHeader"] = "external-menu-header"; ParameterId["ExternalMenuItemDisplayName"] = "external-menu-item-display-name"; @@ -4510,7 +3698,7 @@ var ParameterId; ParameterId["WorksheetName"] = "worksheet-name"; ParameterId["WorksheetFilters"] = "worksheet-filters"; ParameterId["ZoneIdsVisibilityMap"] = "zone-ids-visibility-map"; -})(ParameterId = exports.ParameterId || (exports.ParameterId = {})); +})(ParameterId || (exports.ParameterId = ParameterId = {})); /***/ }), @@ -4524,6 +3712,7 @@ var ParameterId; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VerbId = void 0; // 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 @@ -4625,6 +3814,7 @@ var VerbId; VerbId["RemoveExternalMenuItem"] = "remove-external-menu-item"; VerbId["RenameExternalMenu"] = "rename-external-menu"; VerbId["ReplayAnimation"] = "replay-animation"; + VerbId["ReportExtensionRenderComplete"] = "report-extension-render-complete"; VerbId["RevertStoryPoint"] = "revert-story-point"; VerbId["RevertWorkbook"] = "revert-workbook"; VerbId["SaveExtensionSettings"] = "save-extension-settings"; @@ -4645,7 +3835,7 @@ var VerbId; VerbId["Undo"] = "undo"; VerbId["UpdateCustomView"] = "update-custom-view"; VerbId["VizAPI"] = "viz-api"; -})(VerbId = exports.VerbId || (exports.VerbId = {})); +})(VerbId || (exports.VerbId = VerbId = {})); /***/ }), @@ -4659,6 +3849,7 @@ var VerbId; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AskDataOptionNames = void 0; var AskDataOptionNames; (function (AskDataOptionNames) { AskDataOptionNames["token"] = "token"; @@ -4672,7 +3863,33 @@ var AskDataOptionNames; AskDataOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; AskDataOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; AskDataOptionNames["AskDataWebComponent"] = ":askDataWebComponent"; -})(AskDataOptionNames = exports.AskDataOptionNames || (exports.AskDataOptionNames = {})); +})(AskDataOptionNames || (exports.AskDataOptionNames = AskDataOptionNames = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/InitializationOptions.js": +/*!******************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/InitializationOptions.js ***! + \******************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/InternalApiDispatcher.js": +/*!******************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/InternalApiDispatcher.js ***! + \******************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), @@ -4686,6 +3903,7 @@ var AskDataOptionNames; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.PulseOptionNames = void 0; var PulseOptionNames; (function (PulseOptionNames) { PulseOptionNames["embed"] = "embed"; @@ -4695,8 +3913,22 @@ var PulseOptionNames; PulseOptionNames["theme"] = "embed_theme"; PulseOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; PulseOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; + PulseOptionNames["EmbedCount"] = ":embcount"; PulseOptionNames["PulseWebComponent"] = ":pulseWebComponent"; -})(PulseOptionNames = exports.PulseOptionNames || (exports.PulseOptionNames = {})); +})(PulseOptionNames || (exports.PulseOptionNames = PulseOptionNames = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/interface/VersionNumber.js": +/*!**********************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/interface/VersionNumber.js ***! + \**********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), @@ -4710,6 +3942,7 @@ var PulseOptionNames; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VizOptionNames = void 0; /** * These strings were *manually copied* from the server, * workgroup/src/silos/tableau-server/libraries/tab-controller-vizql/src/com/tableausoftware/ @@ -4784,6 +4017,7 @@ var VqlParameterNames; VqlParameterNames["DX"] = "dx"; VqlParameterNames["DY"] = "dy"; VqlParameterNames["EDIT_DATA_ALERT"] = ":editDataAlert"; + VqlParameterNames["EMBED_COUNT"] = ":embcount"; VqlParameterNames["EMBED"] = ":embed"; VqlParameterNames["EMBEDDED"] = "embedded"; VqlParameterNames["ENCRYPTED"] = "encrypted"; @@ -4971,6 +4205,7 @@ var VizOptionNames; // publicName = internalStringValue VizOptionNames["Size"] = ":size"; VizOptionNames["Embed"] = ":embed"; + VizOptionNames["EmbedCount"] = ":embcount"; VizOptionNames["ApiInternalVersion"] = ":apiInternalVersion"; VizOptionNames["ApiExternalVersion"] = ":apiExternalVersion"; VizOptionNames["ShowVizHome"] = ":showVizHome"; @@ -4990,7 +4225,7 @@ var VizOptionNames; VizOptionNames["hideEditInDesktopButton"] = ":hideEditInDesktopButton"; VizOptionNames["suppressDefaultEditBehavior"] = ":suppressDefaultEditBehavior"; VizOptionNames["hideCloseButton"] = ":hideCloseButton"; -})(VizOptionNames = exports.VizOptionNames || (exports.VizOptionNames = {})); +})(VizOptionNames || (exports.VizOptionNames = VizOptionNames = {})); /***/ }), @@ -5004,6 +4239,7 @@ var VizOptionNames; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CrossFrameMessenger = void 0; 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"); @@ -5149,41 +4385,41 @@ class CrossFrameMessenger { return; } const message = event.data; - if (!MessageTypeChecks_1.isMessage(message)) { + if (!(0, 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) { + if (!(0, 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) { + if (!(0, 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) { + if (!(0, 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) { + if (!(0, 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) { + if (!(0, MessageTypeChecks_1.isHandshakeMessage)(message) || !this.handshakeMessageHandler) { return; } this.handshakeMessageHandler(message, event.source); @@ -5214,6 +4450,7 @@ exports.CrossFrameMessenger = CrossFrameMessenger; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CrossFramePreparedMessage = void 0; /** * Implementation of the PreparedMessage interface used to post messages between * two frames using window.postMessage @@ -5252,6 +4489,13 @@ exports.CrossFramePreparedMessage = CrossFramePreparedMessage; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.isMessage = isMessage; +exports.isVersion = isVersion; +exports.isInitMessage = isInitMessage; +exports.isCommandResponseMessage = isCommandResponseMessage; +exports.isCommandMessage = isCommandMessage; +exports.isNotificationMessage = isNotificationMessage; +exports.isHandshakeMessage = isHandshakeMessage; 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"); @@ -5289,7 +4533,6 @@ function isMessage(data) { } return true; } -exports.isMessage = isMessage; function isVersion(versionNumber) { if (!versionNumber) { return false; @@ -5303,7 +4546,6 @@ function isVersion(versionNumber) { } return true; } -exports.isVersion = isVersion; function isInitMessage(message) { if (!isMessage(message)) { return false; @@ -5320,7 +4562,6 @@ function isInitMessage(message) { } return true; } -exports.isInitMessage = isInitMessage; function isCommandResponseMessage(message) { if (!isMessage(message)) { return false; @@ -5337,7 +4578,6 @@ function isCommandResponseMessage(message) { } return true; } -exports.isCommandResponseMessage = isCommandResponseMessage; function isCommandMessage(message) { if (!isMessage(message)) { return false; @@ -5354,7 +4594,6 @@ function isCommandMessage(message) { } return true; } -exports.isCommandMessage = isCommandMessage; function isNotificationMessage(message) { if (!isMessage(message)) { return false; @@ -5371,7 +4610,6 @@ function isNotificationMessage(message) { } return true; } -exports.isNotificationMessage = isNotificationMessage; function isHandshakeMessage(message) { if (!isMessage(message)) { return false; @@ -5382,7 +4620,32 @@ function isHandshakeMessage(message) { } return true; } -exports.isHandshakeMessage = isHandshakeMessage; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/interface/MessageDispatcher.js": +/*!************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/interface/MessageDispatcher.js ***! + \************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/interface/MessageListener.js": +/*!**********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/interface/MessageListener.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), @@ -5396,6 +4659,7 @@ exports.isHandshakeMessage = isHandshakeMessage; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.MessageType = void 0; /** * Enum defining the 4 different types of messages we have defined */ @@ -5407,7 +4671,33 @@ var MessageType; MessageType["CommandResponse"] = "command-response"; MessageType["Handshake"] = "v-handshake"; MessageType["Ack"] = "v-ack"; -})(MessageType = exports.MessageType || (exports.MessageType = {})); +})(MessageType || (exports.MessageType = MessageType = {})); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/interface/Messenger.js": +/*!****************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/interface/Messenger.js ***! + \****************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/messaging/interface/PreparedMessage.js": +/*!**********************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/messaging/interface/PreparedMessage.js ***! + \**********************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), @@ -5421,6 +4711,7 @@ var MessageType; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.IdentityVersionConverter = void 0; // tslint:disable:no-any /** * This version converter doesn't actually do anything but is useful for testing or when we have @@ -5443,6 +4734,19 @@ class IdentityVersionConverter { exports.IdentityVersionConverter = IdentityVersionConverter; +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/InternalContractVersionConverter.js": +/*!******************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/InternalContractVersionConverter.js ***! + \******************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); + + /***/ }), /***/ "../api-internal-contract-js/lib/src/versioning/StackingVersionConverter.js": @@ -5454,6 +4758,7 @@ exports.IdentityVersionConverter = IdentityVersionConverter; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.StackingVersionConverter = void 0; // tslint:disable:no-any /** * The version converter is designed to allow the platform and external modules @@ -5464,6 +4769,18 @@ Object.defineProperty(exports, "__esModule", ({ value: true })); * downgrade those on the way from platform to external. */ class StackingVersionConverter { + /** + * 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); + } /** * Creates a new instance of the StackingVersionConverter * @@ -5483,18 +4800,6 @@ class StackingVersionConverter { 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 }; @@ -5534,6 +4839,12 @@ exports.StackingVersionConverter = StackingVersionConverter; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.NotificationMinorDowngrades = exports.ExecuteMinorDowngrades = exports.ExecuteMinorUpgrades = void 0; +exports.VersionLessThan = VersionLessThan; +exports.VersionEqualTo = VersionEqualTo; +exports.CreateVersionConverter = CreateVersionConverter; +exports.CreateVersionConverterWithTranslators = CreateVersionConverterWithTranslators; +exports.GetMaximumMinorIndex = GetMaximumMinorIndex; 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"); @@ -5551,7 +4862,6 @@ function VersionLessThan(lhs, rhs) { } return lhs.minor < rhs.minor; } -exports.VersionLessThan = VersionLessThan; /** * @returns true if lhs == rhs (ignoring fix number) * @param lhs @@ -5560,7 +4870,6 @@ exports.VersionLessThan = VersionLessThan; 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. @@ -5569,7 +4878,7 @@ exports.VersionEqualTo = VersionEqualTo; // * If there are translations to add, add them to the version to "upgrade from" or "downgrade to". exports.ExecuteMinorUpgrades = { 1: { - 9: [], + 9: [], // Note that we put upgrades from 1.9 to 1.10 in the [1][9] bucket }, }; exports.ExecuteMinorDowngrades = { @@ -5600,7 +4909,6 @@ exports.NotificationMinorDowngrades = { 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. @@ -5632,7 +4940,6 @@ function CreateVersionConverterWithTranslators(externalVersion, platformVersion, 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++) { @@ -5651,7 +4958,6 @@ function GetNeededTranslations(externalMajorVersion, platformMajorVersion, exter function GetMaximumMinorIndex(minorVersions) { return minorVersions.map((a) => Number(a)).reduce((a, b) => (a > b ? a : b)); } -exports.GetMaximumMinorIndex = GetMaximumMinorIndex; /***/ }), @@ -5665,6 +4971,11 @@ exports.GetMaximumMinorIndex = GetMaximumMinorIndex; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DowngradeWorksheetFomattingNotification175 = exports.DowngradeWorksheetFomatting175 = void 0; +exports.DowngradeWorksheetNames = DowngradeWorksheetNames; +exports.DowngradeFlipboardZoneID = DowngradeFlipboardZoneID; +exports.DowngradeExtensionEnvironmentContext = DowngradeExtensionEnvironmentContext; +exports.DowngradePeriodType = DowngradePeriodType; 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. @@ -5690,7 +5001,6 @@ function DowngradeWorksheetNames(executeResponse) { } 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). @@ -5702,12 +5012,11 @@ function DowngradeFlipboardZoneID(notification) { } return notification; } -exports.DowngradeFlipboardZoneID = DowngradeFlipboardZoneID; // Filter out formatting sheets that are specified in the classNames list function DowngradeWorksheetFormatting(executeResponse, classNames) { - var _a, _b; + var _a; const bootstrapInfo = executeResponse.result; - if ((_b = (_a = bootstrapInfo) === null || _a === void 0 ? void 0 : _a.extensionWorksheetInfo) === null || _b === void 0 ? void 0 : _b.formatting) + if ((_a = bootstrapInfo === null || bootstrapInfo === void 0 ? void 0 : bootstrapInfo.extensionWorksheetInfo) === null || _a === void 0 ? void 0 : _a.formatting) bootstrapInfo.extensionWorksheetInfo.formatting.formattingSheets = bootstrapInfo.extensionWorksheetInfo.formatting.formattingSheets.filter((x) => !classNames.includes(x.classNameKey)); return executeResponse; @@ -5722,9 +5031,11 @@ function DowngradeWorksheetFormattingNotification(notification, classNames) { 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); +const ClassNameKeysToFilter175 = ["tableau-row-dividers" /* ClassNameKey.RowDividers */, "tableau-column-dividers" /* ClassNameKey.ColumnDividers */, "tableau-pane" /* ClassNameKey.Pane */]; +const DowngradeWorksheetFomatting175 = (response) => DowngradeWorksheetFormatting(response, ClassNameKeysToFilter175); +exports.DowngradeWorksheetFomatting175 = DowngradeWorksheetFomatting175; +const DowngradeWorksheetFomattingNotification175 = (notification) => DowngradeWorksheetFormattingNotification(notification, ClassNameKeysToFilter175); +exports.DowngradeWorksheetFomattingNotification175 = DowngradeWorksheetFomattingNotification175; 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. @@ -5740,7 +5051,6 @@ function DowngradeExtensionEnvironmentContext(executeResponse) { } return executeResponse; } -exports.DowngradeExtensionEnvironmentContext = DowngradeExtensionEnvironmentContext; function HandleDowngradePeriodTypeForParameter(parameter) { if (parameter.allowableValuesType === JsApiInternalContract_1.DomainRestrictionType.Range) { if (parameter.dateStepPeriod === JsApiInternalContract_1.DateStepPeriod.IsoYears) { @@ -5767,7 +5077,19 @@ function DowngradePeriodType(executeResponse) { } return executeResponse; } -exports.DowngradePeriodType = DowngradePeriodType; + + +/***/ }), + +/***/ "../api-internal-contract-js/lib/src/versioning/external/ExternalContractVersionConverter.js": +/*!***************************************************************************************************!*\ + !*** ../api-internal-contract-js/lib/src/versioning/external/ExternalContractVersionConverter.js ***! + \***************************************************************************************************/ +/***/ ((__unused_webpack_module, exports) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); /***/ }), @@ -5781,6 +5103,7 @@ exports.DowngradePeriodType = DowngradePeriodType; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ExternalIdentityVersionConverter = void 0; // tslint:disable:no-any /** * This version converter doesn't actually do anything but is useful for testing or when we have @@ -5814,6 +5137,7 @@ exports.ExternalIdentityVersionConverter = ExternalIdentityVersionConverter; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ExternalStackingVersionConverter = void 0; // tslint:disable:no-any /** * The version converter is designed to allow the platform and external modules @@ -5882,6 +5206,9 @@ exports.ExternalStackingVersionConverter = ExternalStackingVersionConverter; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ExecuteMinorUpgradeNotification = exports.ExecuteMinorUpgradeReturnExternal = exports.ExecuteMinorDowngradeCallExternal = void 0; +exports.CreateExternalCompatibleVersionConverter = CreateExternalCompatibleVersionConverter; +exports.CreateExternalCompatibleVersionConverterWithTranslators = CreateExternalCompatibleVersionConverterWithTranslators; 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"); @@ -5893,17 +5220,17 @@ const ExternalStackingVersionConverter_1 = __webpack_require__(/*! ./ExternalSta // * If there are translations to add, add them to the version to 'upgrade from' or 'downgrade to'. exports.ExecuteMinorDowngradeCallExternal = { 1: { - 9: [], + 9: [], // Note that we put downgrades from 1.10 to 1.9 in the [1][9] bucket }, }; exports.ExecuteMinorUpgradeReturnExternal = { 1: { - 9: [], + 9: [], // Note that we put upgrades from 1.9 to 1.10 in the [1][9] bucket }, }; exports.ExecuteMinorUpgradeNotification = { 1: { - 9: [], + 9: [], // Note that we put upgrades from 1.9 to 1.10 in the [1][9] bucket }, }; /** @@ -5918,7 +5245,6 @@ exports.ExecuteMinorUpgradeNotification = { 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. @@ -5938,7 +5264,7 @@ function CreateExternalCompatibleVersionConverterWithTranslators(externalVersion 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)) { + if (externalMajorVersion < platformMajorVersion || (0, 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 @@ -5949,12 +5275,11 @@ function CreateExternalCompatibleVersionConverterWithTranslators(externalVersion 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])); + const maximumMinorVersion = (0, VersionConverterFactory_1.GetMaximumMinorIndex)(Object.keys(majorMinorTranslators[platformMajorVersion])); for (let minor = start; minor <= maximumMinorVersion; minor++) { if (minor in majorMinorTranslators[platformMajorVersion]) { neededTranslations.push(...majorMinorTranslators[platformMajorVersion][minor]); @@ -5971,87 +5296,99 @@ function GetNeededExternalTranslations(platformMajorVersion, platformMinorVersio /*!*********************************************!*\ !*** ../api-shared-js/lib/src/ApiShared.js ***! \*********************************************/ -/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +/***/ (function(__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]; -} +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __exportStar = (this && this.__exportStar) || function(m, exports) { + for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p); +}; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.VersionedExternalApiDispatcher = exports.VersionNumber = exports.SheetUtils = exports.ExportHelpers = exports.ErrorHelpers = exports.Deferred = exports.TableauError = exports.StoryActivationServiceImpl = exports.SizeServiceImpl = exports.ServiceImplBase = exports.Registration = exports.NotificationServiceImplBase = exports.NotificationServiceImpl = exports.ClientInfoServiceImpl = exports.Point = exports.WorksheetImpl = exports.WorkbookImpl = exports.StoryPointInfoImpl = exports.StoryPointImpl = exports.StoryImpl = exports.SingleEventManagerImpl = exports.SheetInfoImpl = exports.SheetImpl = exports.ParameterImpl = exports.DataSourceImpl = exports.DashboardObjectImpl = exports.DashboardImpl = exports.CustomViewImpl = exports.Field = exports.EventListenerManager = exports.InternalToExternalEnumMappings = exports.ExternalToInternalEnumMappings = exports.DataSource = exports.CrossFrameDispatcher = exports.ApiVersion = void 0; 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")); +Object.defineProperty(exports, "ApiVersion", ({ enumerable: true, get: function () { return ApiVersion_1.ApiVersion; } })); +__exportStar(__webpack_require__(/*! ./ApiShared/CrossFrame/CrossFrameBootstrap */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameBootstrap.js"), exports); var CrossFrameDispatcher_1 = __webpack_require__(/*! ./ApiShared/CrossFrame/CrossFrameDispatcher */ "../api-shared-js/lib/src/ApiShared/CrossFrame/CrossFrameDispatcher.js"); -exports.CrossFrameDispatcher = CrossFrameDispatcher_1.CrossFrameDispatcher; +Object.defineProperty(exports, "CrossFrameDispatcher", ({ enumerable: true, get: function () { return CrossFrameDispatcher_1.CrossFrameDispatcher; } })); var DataSource_1 = __webpack_require__(/*! ./ApiShared/DataSource */ "../api-shared-js/lib/src/ApiShared/DataSource.js"); -exports.DataSource = DataSource_1.DataSource; +Object.defineProperty(exports, "DataSource", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "ExternalToInternalEnumMappings", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "InternalToExternalEnumMappings", ({ enumerable: true, get: function () { return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings; } })); var EventListenerManager_1 = __webpack_require__(/*! ./ApiShared/EventListenerManager */ "../api-shared-js/lib/src/ApiShared/EventListenerManager.js"); -exports.EventListenerManager = EventListenerManager_1.EventListenerManager; +Object.defineProperty(exports, "EventListenerManager", ({ enumerable: true, get: function () { return EventListenerManager_1.EventListenerManager; } })); var Field_1 = __webpack_require__(/*! ./ApiShared/Field */ "../api-shared-js/lib/src/ApiShared/Field.js"); -exports.Field = Field_1.Field; +Object.defineProperty(exports, "Field", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "CustomViewImpl", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "DashboardImpl", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "DashboardObjectImpl", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "DataSourceImpl", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "ParameterImpl", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "SheetImpl", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "SheetInfoImpl", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "SingleEventManagerImpl", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "StoryImpl", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "StoryPointImpl", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "StoryPointInfoImpl", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "WorkbookImpl", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "WorksheetImpl", ({ enumerable: true, get: function () { return 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")); +Object.defineProperty(exports, "Point", ({ enumerable: true, get: function () { return Point_1.Point; } })); +__exportStar(__webpack_require__(/*! ./ApiShared/Services/RegisterAllSharedServices */ "../api-shared-js/lib/src/ApiShared/Services/RegisterAllSharedServices.js"), exports); +__exportStar(__webpack_require__(/*! ./ApiShared/Services/ServiceRegistry */ "../api-shared-js/lib/src/ApiShared/Services/ServiceRegistry.js"), exports); var ClientInfoServiceImpl_1 = __webpack_require__(/*! ./ApiShared/Services/impl/ClientInfoServiceImpl */ "../api-shared-js/lib/src/ApiShared/Services/impl/ClientInfoServiceImpl.js"); -exports.ClientInfoServiceImpl = ClientInfoServiceImpl_1.ClientInfoServiceImpl; +Object.defineProperty(exports, "ClientInfoServiceImpl", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "NotificationServiceImpl", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "NotificationServiceImplBase", ({ enumerable: true, get: function () { return NotificationServiceImplBase_1.NotificationServiceImplBase; } })); +Object.defineProperty(exports, "Registration", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "ServiceImplBase", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "SizeServiceImpl", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "StoryActivationServiceImpl", ({ enumerable: true, get: function () { return StoryActivationServiceImpl_1.StoryActivationServiceImpl; } })); var TableauError_1 = __webpack_require__(/*! ./ApiShared/TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.js"); -exports.TableauError = TableauError_1.TableauError; +Object.defineProperty(exports, "TableauError", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "Deferred", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "ErrorHelpers", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "ExportHelpers", ({ enumerable: true, get: function () { return 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; +Object.defineProperty(exports, "SheetUtils", ({ enumerable: true, get: function () { return SheetUtils_1.SheetUtils; } })); var VersionNumber_1 = __webpack_require__(/*! ./ApiShared/VersionNumber */ "../api-shared-js/lib/src/ApiShared/VersionNumber.js"); -exports.VersionNumber = VersionNumber_1.VersionNumber; +Object.defineProperty(exports, "VersionNumber", ({ enumerable: true, get: function () { return VersionNumber_1.VersionNumber; } })); var VersionedExternalApiDispatcher_1 = __webpack_require__(/*! ./VersionedExternalApiDispatcher */ "../api-shared-js/lib/src/VersionedExternalApiDispatcher.js"); -exports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher_1.VersionedExternalApiDispatcher; +Object.defineProperty(exports, "VersionedExternalApiDispatcher", ({ enumerable: true, get: function () { return VersionedExternalApiDispatcher_1.VersionedExternalApiDispatcher; } })); /***/ }), @@ -6065,6 +5402,7 @@ exports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher_1.Versio "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ApiVersion = void 0; const VersionNumber_1 = __webpack_require__(/*! ./VersionNumber */ "../api-shared-js/lib/src/ApiShared/VersionNumber.js"); /** * This is the singleton wrapper of VersionNumber @@ -6094,6 +5432,7 @@ exports.ApiVersion = ApiVersion; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ConnectionSummary = void 0; /** * Implementation of a connection summary. * This does not follow the Impl pattern as it is just a property bag. @@ -6129,6 +5468,7 @@ exports.ConnectionSummary = ConnectionSummary; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.doCrossFrameBootstrap = doCrossFrameBootstrap; 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 @@ -6184,7 +5524,6 @@ function doCrossFrameBootstrap(thisWindow, internalContractVersion, options) { initializationMessage.send(); }); } -exports.doCrossFrameBootstrap = doCrossFrameBootstrap; /***/ }), @@ -6198,6 +5537,7 @@ exports.doCrossFrameBootstrap = doCrossFrameBootstrap; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CrossFrameDispatcher = void 0; 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 @@ -6290,6 +5630,7 @@ exports.CrossFrameDispatcher = CrossFrameDispatcher; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DataSource = void 0; class DataSource { constructor(_dataSourceImpl) { this._dataSourceImpl = _dataSourceImpl; @@ -6354,6 +5695,7 @@ exports.DataSource = DataSource; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ExternalToInternalEnumMappings = void 0; 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"); @@ -6441,6 +5783,7 @@ ExternalToInternalEnumMappings.dialogStyles = new EnumConverter_1.EnumConverter( "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.InternalToExternalEnumMappings = void 0; 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"); @@ -6459,10 +5802,44 @@ InternalToExternalEnumMappings.extensionContext = new EnumConverter_1.EnumConver [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.dataFormatType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.DataFormatType.AutoFormat]: api_external_contract_js_1.DataFormatType.AutoFormat, + [api_internal_contract_js_1.DataFormatType.SystemNumber]: api_external_contract_js_1.DataFormatType.SystemNumber, + [api_internal_contract_js_1.DataFormatType.SystemCurrency]: api_external_contract_js_1.DataFormatType.SystemCurrency, + [api_internal_contract_js_1.DataFormatType.SystemLongDate]: api_external_contract_js_1.DataFormatType.SystemLongDate, + [api_internal_contract_js_1.DataFormatType.SystemShortDate]: api_external_contract_js_1.DataFormatType.SystemShortDate, + [api_internal_contract_js_1.DataFormatType.SystemTime]: api_external_contract_js_1.DataFormatType.SystemTime, + [api_internal_contract_js_1.DataFormatType.Custom]: api_external_contract_js_1.DataFormatType.Custom, + [api_internal_contract_js_1.DataFormatType.CustomNumber]: api_external_contract_js_1.DataFormatType.CustomNumber, + [api_internal_contract_js_1.DataFormatType.CustomCurrency]: api_external_contract_js_1.DataFormatType.CustomCurrency, +}); +InternalToExternalEnumMappings.numberFormatUnits = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.NumberFormatUnits.None]: api_external_contract_js_1.NumberFormatUnits.None, + [api_internal_contract_js_1.NumberFormatUnits.Thousands]: api_external_contract_js_1.NumberFormatUnits.Thousands, + [api_internal_contract_js_1.NumberFormatUnits.Millions]: api_external_contract_js_1.NumberFormatUnits.Millions, + [api_internal_contract_js_1.NumberFormatUnits.BillionsEnglish]: api_external_contract_js_1.NumberFormatUnits.BillionsEnglish, + [api_internal_contract_js_1.NumberFormatUnits.BillionsStandard]: api_external_contract_js_1.NumberFormatUnits.BillionsStandard, +}); +InternalToExternalEnumMappings.negativeNumberFormat = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.NegativeNumberFormat.Automatic]: api_external_contract_js_1.NegativeNumberFormat.Automatic, + [api_internal_contract_js_1.NegativeNumberFormat.Parentheses]: api_external_contract_js_1.NegativeNumberFormat.Parentheses, + [api_internal_contract_js_1.NegativeNumberFormat.OuterPrefix]: api_external_contract_js_1.NegativeNumberFormat.OuterPrefix, + [api_internal_contract_js_1.NegativeNumberFormat.OuterSuffix]: api_external_contract_js_1.NegativeNumberFormat.OuterSuffix, + [api_internal_contract_js_1.NegativeNumberFormat.InnerPrefix]: api_external_contract_js_1.NegativeNumberFormat.InnerPrefix, + [api_internal_contract_js_1.NegativeNumberFormat.InnerSuffix]: api_external_contract_js_1.NegativeNumberFormat.InnerSuffix, +}); 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.exportedMediaType = new EnumConverter_1.EnumConverter({ + [api_internal_contract_js_1.ExportedMediaType.Image]: api_external_contract_js_1.ExportedMediaType.Image, + [api_internal_contract_js_1.ExportedMediaType.Pdf]: api_external_contract_js_1.ExportedMediaType.Pdf, + [api_internal_contract_js_1.ExportedMediaType.Svg]: api_external_contract_js_1.ExportedMediaType.Svg, + [api_internal_contract_js_1.ExportedMediaType.Html]: api_external_contract_js_1.ExportedMediaType.Html, + [api_internal_contract_js_1.ExportedMediaType.PowerPoint]: api_external_contract_js_1.ExportedMediaType.PowerPoint, + [api_internal_contract_js_1.ExportedMediaType.Excel]: api_external_contract_js_1.ExportedMediaType.Excel, +}); 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, @@ -6591,14 +5968,14 @@ InternalToExternalEnumMappings.filterType = new EnumConverter_1.EnumConverter({ [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, + ["tableau-dashboard-title" /* InternalClassNameKey.DashboardTitle */]: api_external_contract_js_1.ClassNameKey.DashboardTitle, + ["tableau-story-title" /* InternalClassNameKey.StoryTitle */]: api_external_contract_js_1.ClassNameKey.StoryTitle, + ["tableau-tooltip" /* InternalClassNameKey.Tooltip */]: api_external_contract_js_1.ClassNameKey.Tooltip, + ["tableau-worksheet" /* InternalClassNameKey.Worksheet */]: api_external_contract_js_1.ClassNameKey.Worksheet, + ["tableau-worksheet-title" /* InternalClassNameKey.WorksheetTitle */]: api_external_contract_js_1.ClassNameKey.WorksheetTitle, + ["tableau-pane" /* InternalClassNameKey.Pane */]: api_external_contract_js_1.ClassNameKey.Pane, + ["tableau-row-dividers" /* InternalClassNameKey.RowDividers */]: api_external_contract_js_1.ClassNameKey.RowDividers, + ["tableau-column-dividers" /* InternalClassNameKey.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, @@ -6649,6 +6026,7 @@ InternalToExternalEnumMappings.markType = new EnumConverter_1.EnumConverter({ "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.EventListenerManager = void 0; 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"); /** @@ -6689,6 +6067,7 @@ exports.EventListenerManager = EventListenerManager; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Field = void 0; class Field { constructor(_fieldImpl) { this._fieldImpl = _fieldImpl; @@ -6735,6 +6114,12 @@ class Field { get isPresentOnPublishedDatasource() { return this._fieldImpl.isPresentOnPublishedDatasource; } + get semanticRole() { + return this._fieldImpl.semanticRole; + } + get dataFormat() { + return this._fieldImpl.dataFormat; + } } exports.Field = Field; @@ -6750,6 +6135,7 @@ exports.Field = Field; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.CustomViewImpl = void 0; const ApiShared_1 = __webpack_require__(/*! ../../ApiShared */ "../api-shared-js/lib/src/ApiShared.js"); class CustomViewImpl { constructor(customViewModel, _registryId) { @@ -6789,7 +6175,7 @@ class CustomViewImpl { return this._url; } saveAsync() { - const service = ApiShared_1.ApiServiceRegistry.get(this._registryId).getService("viz-service" /* Viz */); + const service = ApiShared_1.ApiServiceRegistry.get(this._registryId).getService("viz-service" /* ServiceNames.Viz */); return service.saveAsync(this); } } @@ -6807,6 +6193,7 @@ exports.CustomViewImpl = CustomViewImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DashboardImpl = void 0; 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"); @@ -6891,7 +6278,7 @@ class DashboardImpl extends SheetImpl_1.SheetImpl { } } setDashboardObjectVisibilityAsync(dashboardObjectVisibilityMap) { - const zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */); + const zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* ServiceNames.Zone */); return zoneService.setVisibilityAsync(/*Dashboard Name*/ this.name, this.zoneMap, dashboardObjectVisibilityMap); } getDashboardObjectById(dashboardObjectId) { @@ -6969,16 +6356,16 @@ class DashboardImpl extends SheetImpl_1.SheetImpl { zoneChanges.get(zoneId).push(change); } moveAndResizeDashboardObjectsAsync(dashboardObjectPositionAndSizeUpdateArray) { - const zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* Zone */); + const zoneService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("zone-service" /* ServiceNames.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 */); + const animationService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("animation-service" /* ServiceNames.Animation */); return animationService.replayAsync(replaySpeed); } getFiltersAsync() { this.verifyActiveSheetOrEmbeddedInActiveStoryPoint(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* ServiceNames.Filter */); return service.getDashboardFiltersAsync(); } applyFilterAsync(fieldName, values, updateType, options) { @@ -6988,7 +6375,7 @@ class DashboardImpl extends SheetImpl_1.SheetImpl { 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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* ServiceNames.Filter */); return service.applyDashboardFilterAsync(fieldName, values, updateType, options); } // @W-12986439: remove once initializeWithPublicInterfaces is moved to the constructor for this class @@ -7027,6 +6414,7 @@ exports.DashboardImpl = DashboardImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DashboardObjectImpl = void 0; /** * Implementation of the dashboard objects - the zones in a dashboard. * This does not follow the Impl pattern as it is just a property bag. @@ -7089,6 +6477,7 @@ exports.DashboardObjectImpl = DashboardObjectImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DataSourceImpl = void 0; 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"); @@ -7131,35 +6520,35 @@ class DataSourceImpl { return 10000; } refreshAsync() { - const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* ServiceNames.DataSourceService */); return dataSourceService.refreshAsync(this._dataSourceInfo.id); } getConnectionSummariesAsync() { - const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* ServiceNames.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 */); + const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* ServiceNames.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 */); + const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* ServiceNames.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 */); + const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* ServiceNames.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 */); + const getDataService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* ServiceNames.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); } @@ -7171,7 +6560,7 @@ class DataSourceImpl { }); } getLogicalTablesAsync() { - const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + const dataSourceService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* ServiceNames.DataSourceService */); return dataSourceService.getLogicalTablesAsync(this.id).then((logicalTableInfos) => { return logicalTableInfos.map((logicalTableInfo) => new LogicalTable_1.LogicalTable(logicalTableInfo)); }); @@ -7191,6 +6580,7 @@ exports.DataSourceImpl = DataSourceImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.FieldImpl = void 0; 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"); @@ -7210,7 +6600,7 @@ class FieldImpl { } get dataType() { var _a; - return _a = this._fieldInfo.dataType, (_a !== null && _a !== void 0 ? _a : Contract.DataType.Unknown); + return (_a = this._fieldInfo.dataType) !== null && _a !== void 0 ? _a : Contract.DataType.Unknown; } get aggregation() { return InternalToExternalEnumMappings_1.InternalToExternalEnumMappings.fieldAggregationType.convert(this._fieldInfo.aggregation); @@ -7245,6 +6635,12 @@ class FieldImpl { get isPresentOnPublishedDatasource() { return this._fieldInfo.isPresentOnPublishedDatasource; } + get semanticRole() { + return this._fieldInfo.semanticRole; + } + get dataFormat() { + return this._fieldInfo.dataFormat; + } } exports.FieldImpl = FieldImpl; @@ -7260,6 +6656,7 @@ exports.FieldImpl = FieldImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ParameterImpl = void 0; 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"); @@ -7289,7 +6686,7 @@ class ParameterImpl { 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 */); + const parametersService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* ServiceNames.Parameters */); return parametersService.changeParameterValueAsync(this._globalFieldName, coercedValue).then((parameterInfo) => { this.setParameterInfo(parameterInfo); return this.currentValue; @@ -7338,6 +6735,7 @@ exports.ParameterImpl = ParameterImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SheetImpl = void 0; 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"); @@ -7398,11 +6796,11 @@ class SheetImpl { } findParameterAsync(parameterName) { ErrorHelpers_1.ErrorHelpers.verifyParameter(parameterName, 'parameterName'); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* ServiceNames.Parameters */); return service.findParameterByNameAsync(parameterName); } getParametersAsync() { - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* Parameters */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("parameters-service" /* ServiceNames.Parameters */); return service.getParametersForSheetAsync(this.sheetPath); } changeSizeAsync(newSize) { @@ -7422,9 +6820,9 @@ class SheetImpl { return Promise.resolve(newSize); } const processedNewSize = this.processNewSize(partialSheetSize); - const sizeService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("size-service" /* Size */); + const sizeService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("size-service" /* ServiceNames.Size */); return sizeService.changeSizeAsync(this.name, processedNewSize).then(() => { - const clientInfoService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("client-info-service" /* ClientInfo */); + const clientInfoService = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("client-info-service" /* ServiceNames.ClientInfo */); return clientInfoService.getClientInfoAsync().then((bootstrapInfo) => { const sheet = bootstrapInfo.publishedSheets.find((s) => s.name === this.name); if (!sheet) { @@ -7444,12 +6842,11 @@ class SheetImpl { 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 hasMinWidth = !Param_1.Param.isNullOrUndefined(minSizeMaybe === null || minSizeMaybe === void 0 ? void 0 : minSizeMaybe.width); + const hasMinHeight = !Param_1.Param.isNullOrUndefined(minSizeMaybe === null || minSizeMaybe === void 0 ? void 0 : minSizeMaybe.height); + const hasMaxWidth = !Param_1.Param.isNullOrUndefined(maxSizeMaybe === null || maxSizeMaybe === void 0 ? void 0 : maxSizeMaybe.width); + const hasMaxHeight = !Param_1.Param.isNullOrUndefined(maxSizeMaybe === null || maxSizeMaybe === void 0 ? void 0 : maxSizeMaybe.height); const hasValidMinSize = hasMinWidth && hasMinHeight; const hasValidMaxSize = hasMaxWidth && hasMaxHeight; switch (behavior) { @@ -7551,6 +6948,7 @@ SheetImpl.parseDimensions = (size) => { "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SheetInfoImpl = void 0; 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) { @@ -7581,6 +6979,7 @@ class SheetInfoImpl { return { sheetName: this.name, isDashboard: this.sheetType === api_external_contract_js_1.SheetType.Dashboard, + // TODO - Stories }; } get index() { @@ -7613,6 +7012,7 @@ exports.SheetInfoImpl = SheetInfoImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SingleEventManagerImpl = void 0; /** * This class implements the SingleEventManager interface for a single type of Tableau event * @@ -7662,6 +7062,7 @@ exports.SingleEventManagerImpl = SingleEventManagerImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.StoryImpl = void 0; 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"); @@ -7745,7 +7146,7 @@ class StoryImpl extends SheetImpl_1.SheetImpl { return Promise.resolve(this._activeStoryPointImpl); } let promise = this._deferred.getNewPromiseOrThrowIfBusy(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* ServiceNames.StoryActivation */); service.activateNextStoryPointAsync(); return promise; } @@ -7754,7 +7155,7 @@ class StoryImpl extends SheetImpl_1.SheetImpl { return Promise.resolve(this._activeStoryPointImpl); } let promise = this._deferred.getNewPromiseOrThrowIfBusy(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* ServiceNames.StoryActivation */); service.activatePreviousStoryPointAsync(); return promise; } @@ -7768,7 +7169,7 @@ class StoryImpl extends SheetImpl_1.SheetImpl { return Promise.resolve(this._activeStoryPointImpl); } let promise = this._deferred.getNewPromiseOrThrowIfBusy(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* StoryActivation */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* ServiceNames.StoryActivation */); service.activateStoryPointAsync(index); return promise; } @@ -7778,7 +7179,7 @@ class StoryImpl extends SheetImpl_1.SheetImpl { 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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("story-activation-service" /* ServiceNames.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); @@ -7805,6 +7206,7 @@ exports.StoryImpl = StoryImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.StoryPointImpl = void 0; 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"); @@ -7889,6 +7291,7 @@ exports.StoryPointImpl = StoryPointImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.StoryPointInfoImpl = void 0; class StoryPointInfoImpl { constructor(_caption, _index, _storyPointId, _active, _updated, _parentStoryImpl) { this._caption = _caption; @@ -7943,6 +7346,7 @@ exports.StoryPointInfoImpl = StoryPointInfoImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.WorkbookImpl = void 0; class WorkbookImpl { } exports.WorkbookImpl = WorkbookImpl; @@ -7959,6 +7363,7 @@ exports.WorkbookImpl = WorkbookImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.WorksheetImpl = void 0; 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"); @@ -7999,7 +7404,7 @@ class WorksheetImpl extends SheetImpl_1.SheetImpl { 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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* ServiceNames.Filter */); return service.applyFilterAsync(this.visualId, fieldName, values, updateType, options); } applyRangeFilterAsync(fieldName, filterOptions) { @@ -8012,7 +7417,7 @@ class WorksheetImpl extends SheetImpl_1.SheetImpl { ErrorHelpers_1.ErrorHelpers.verifyRangeParamType(filterOptions.min, filterOptions.max); } this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* ServiceNames.Filter */); return service.applyRangeFilterAsync(this.visualId, fieldName, filterOptions); } applyHierarchicalFilterAsync(fieldName, values, updateType, options) { @@ -8023,13 +7428,13 @@ class WorksheetImpl extends SheetImpl_1.SheetImpl { 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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* ServiceNames.Filter */); return service.clearFilterAsync(this.visualId, fieldName); } applyRelativeDateFilterAsync(fieldName, options) { @@ -8038,12 +7443,12 @@ class WorksheetImpl extends SheetImpl_1.SheetImpl { 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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* ServiceNames.Filter */); return service.applyRelativeDateFilterAsync(this.visualId, fieldName, options); } getDataSourcesAsync() { this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* ServiceNames.DataSourceService */); return service.getDataSourcesAsync(this.visualId).then((result) => { const dataSchema = result; const worksheetDataSourceInfo = dataSchema.worksheetDataSchemaMap[this.name]; @@ -8062,69 +7467,69 @@ class WorksheetImpl extends SheetImpl_1.SheetImpl { } getFiltersAsync() { this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* ServiceNames.Filter */); return service.getFiltersAsync(this.visualId); } getSelectedMarksAsync() { this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* ServiceNames.GetData */); return service.getSelectedMarksAsync(this.visualId); } getHighlightedMarksAsync() { this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* ServiceNames.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))); + 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) !== 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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* ServiceNames.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))); + options.columnsToIncludeById || [], options.includeDataValuesOption || api_external_contract_js_1.IncludeDataValuesOption.AllValues, (_a = options.applyWorksheetFormatting) !== null && _a !== void 0 ? _a : false); } getVisualSpecificationAsync() { this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* ServiceNames.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))); + 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) !== null && _a !== void 0 ? _a : false); } getUnderlyingTablesAsync() { this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* ServiceNames.DataSourceService */); return service.getUnderlyingTablesAsync(this.visualId).then((logicalTableInfos) => { return logicalTableInfos.map((logicalTableInfo) => new LogicalTable_1.LogicalTable(logicalTableInfo)); }); @@ -8132,103 +7537,103 @@ class WorksheetImpl extends SheetImpl_1.SheetImpl { getUnderlyingTableDataAsync(logicalTableId, options) { var _a; this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* ServiceNames.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))); + 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) !== 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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* ServiceNames.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))); + 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) !== null && _a !== void 0 ? _a : false); } clearSelectedMarksAsync() { this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* Selection */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* ServiceNames.Annotation */); return service.annotateMarkAsync(this.visualId, mark, annotationText); } getAnnotationsAsync() { this.verifyActiveSheet(); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* Annotation */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("annotation-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("external-context-menu-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("selection-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("accessibility" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("accessibility" /* ServiceNames.Accessibility */); return service.leaveMarkNavigationAsync(this.visualId); } editAliasesDialogAsync(fieldName) { - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* VisualModel */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("visual-model-service" /* ServiceNames.VisualModel */); return service.editAliasesDialogAsync(fieldName); } createDataSourceFromInfo(dataSourceInfo) { @@ -8269,6 +7674,7 @@ exports.WorksheetImpl = WorksheetImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.LogicalTable = void 0; /** * Implementation of a logical table. * This does not follow the Impl pattern as it is just a property bag. @@ -8298,6 +7704,7 @@ exports.LogicalTable = LogicalTable; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.TooltipTextRequestModel = void 0; class TooltipTextRequestModel { constructor(visualIdPresModel, tupleId) { this.visualIdPresModel = visualIdPresModel; @@ -8318,6 +7725,7 @@ exports.TooltipTextRequestModel = TooltipTextRequestModel; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.RangeDomain = exports.CategoricalDomain = exports.RelativeDateFilter = exports.RangeFilter = exports.HierarchicalFilter = exports.HierarchicalLevelDetail = exports.HierarchicalDataValue = exports.CategoricalFilter = exports.Filter = void 0; 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"); @@ -8342,17 +7750,17 @@ class Filter { return this._filterType; } getFieldAsync() { - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* DataSourceService */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("data-source-service" /* ServiceNames.DataSourceService */); return service.getFieldAsync(this._fieldId); } getAppliedWorksheetsAsync() { - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* ServiceNames.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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* ServiceNames.Filter */); return service.setAppliedWorksheetsAsync(this._worksheetName, this._fieldName, this._fieldId, Array.from(uniqueWorksheets)); } } @@ -8378,7 +7786,7 @@ class CategoricalFilter extends Filter { 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 */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* ServiceNames.Filter */); return service.getCategoricalDomainAsync(this._worksheetName, this._fieldId, domainType); } } @@ -8463,7 +7871,7 @@ class RangeFilter extends Filter { return this._includeNullValues; } getDomainAsync(domainType) { - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* Filter */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("filter-service" /* ServiceNames.Filter */); if (!domainType) { domainType = api_external_contract_js_1.FilterDomainType.Relevant; } @@ -8537,6 +7945,7 @@ exports.RangeDomain = RangeDomain; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DataValue = exports.Column = exports.MarkInfo = exports.DataTable = void 0; class DataTable { constructor(_data, _columns, _totalRowCount, _isTotalRowCountLimited, _isSummaryData, _marksInfo) { this._data = _data; @@ -8660,6 +8069,7 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DataTableReader = void 0; 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 { @@ -8678,7 +8088,7 @@ class DataTableReader { } getPageAsync(pageNumber) { ErrorHelpers_1.ErrorHelpers.verifyRange(pageNumber, 0, this._pageCount); - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* ServiceNames.GetData */); return service.getPageAsync(this._id, pageNumber, this._pageRowCount); } getAllPagesAsync(maxRows) { @@ -8709,7 +8119,7 @@ class DataTableReader { }); } releaseAsync() { - const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* GetData */); + const service = ServiceRegistry_1.ApiServiceRegistry.get(this._registryId).getService("get-data-service" /* ServiceNames.GetData */); return service.releaseAsync(this._id); } } @@ -8727,6 +8137,7 @@ exports.DataTableReader = DataTableReader; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.HoverTupleInteractionModel = exports.SelectTuplesInteractionModel = exports.SelectionModelsContainer = exports.TupleSelectionModel = exports.DimensionSelectionModel = exports.RangeSelectionModel = exports.HierarchicalSelectionModel = exports.ValueSelectionModel = exports.SelectionModel = void 0; /** * Selection Model. */ @@ -8812,6 +8223,7 @@ exports.HoverTupleInteractionModel = HoverTupleInteractionModel; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Point = void 0; class Point { constructor(_x, _y) { this._x = _x; @@ -8838,6 +8250,7 @@ exports.Point = Point; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.GetDataType = void 0; /** * Defines which type of getData call to make. */ @@ -8845,7 +8258,7 @@ var GetDataType; (function (GetDataType) { GetDataType["Summary"] = "summary"; GetDataType["Underlying"] = "underlying"; -})(GetDataType = exports.GetDataType || (exports.GetDataType = {})); +})(GetDataType || (exports.GetDataType = GetDataType = {})); /***/ }), @@ -8859,6 +8272,7 @@ var GetDataType; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.registerAllSharedServices = registerAllSharedServices; 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"); @@ -8892,7 +8306,6 @@ function registerAllSharedServices(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; /***/ }), @@ -8906,6 +8319,7 @@ exports.registerAllSharedServices = registerAllSharedServices; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ApiServiceRegistry = void 0; 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') { @@ -8983,12 +8397,13 @@ exports.ApiServiceRegistry = ApiServiceRegistry; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AccessibilityServiceImpl = void 0; 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 */; + return "accessibility" /* ServiceNames.Accessibility */; } getTooltipTextAsync(visualId, tupleId) { let tooltipTextRequest = new AccessibilityModels_1.TooltipTextRequestModel(visualId, tupleId); @@ -9024,6 +8439,7 @@ exports.AccessibilityServiceImpl = AccessibilityServiceImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AnimationServiceImpl = void 0; 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"); @@ -9031,7 +8447,7 @@ const ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../a 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 */; + return "animation-service" /* ServiceNames.Animation */; } replayAsync(replaySpeed) { const parameters = { @@ -9058,6 +8474,7 @@ exports.AnimationServiceImpl = AnimationServiceImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.AnnotationServiceImpl = void 0; 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"); @@ -9066,7 +8483,7 @@ const TableauError_1 = __webpack_require__(/*! ../../TableauError */ "../api-sha 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 */; + return "annotation-service" /* ServiceNames.Annotation */; } /** * Method to annotate a mark on the given worksheet. @@ -9214,11 +8631,12 @@ exports.AnnotationServiceImpl = AnnotationServiceImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ClientInfoServiceImpl = void 0; 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 */; + return "client-info-service" /* ServiceNames.ClientInfo */; } getClientInfoAsync() { const verb = api_internal_contract_js_1.VerbId.GetEmbeddingClientInfo; @@ -9245,6 +8663,7 @@ exports.ClientInfoServiceImpl = ClientInfoServiceImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DataSourceServiceImpl = void 0; 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"); @@ -9261,7 +8680,7 @@ class DataSourceServiceImpl extends ServiceImplBase_1.ServiceImplBase { super(dispatcher, registryId); } get serviceName() { - return "data-source-service" /* DataSourceService */; + return "data-source-service" /* ServiceNames.DataSourceService */; } refreshAsync(dataSourceId) { const parameters = { @@ -9384,16 +8803,17 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge }); }; 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"); +exports.ExportServiceImpl = void 0; 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 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 ErrorHelpers_1 = __webpack_require__(/*! ../../Utils/ErrorHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js"); +const ExportHelpers_1 = __webpack_require__(/*! ../../Utils/ExportHelpers */ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.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 */; + return "export-service" /* ServiceNames.Export */; } getExportCrosstabSheetMapAsync(currentSheetType) { const verb = api_internal_contract_js_1.VerbId.GetExportCrosstabSheetMap; @@ -9421,7 +8841,7 @@ class ExportServiceImpl extends ServiceImplBase_1.ServiceImplBase { 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, + [api_internal_contract_js_1.ParameterId.SendNotifications]: true, // send notification on pres layer that triggers file download }; // pres layer command invoked depends on the crosstab file format let verb; @@ -9457,7 +8877,7 @@ class ExportServiceImpl extends ServiceImplBase_1.ServiceImplBase { 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.IgnoreAliases]: (_a = options.ignoreAliases) !== null && _a !== void 0 ? _a : false, [api_internal_contract_js_1.ParameterId.ColumnsToIncludeById]: columnsToIncludeById, }; return this.execute(verb, parameters) @@ -9517,6 +8937,18 @@ class ExportServiceImpl extends ServiceImplBase_1.ServiceImplBase { return result; }); } + reportExtensionRenderComplete(mediaBlob) { + const params = { + [api_internal_contract_js_1.ParameterId.FunctionName]: api_internal_contract_js_1.VerbId.ReportExtensionRenderComplete, + [api_internal_contract_js_1.ParameterId.HasExtensionRenderingTimedOut]: false, + }; + if (mediaBlob) { + params[api_internal_contract_js_1.ParameterId.ExtensionMediaBlob] = mediaBlob; + } + return this.execute(api_internal_contract_js_1.VerbId.ReportExtensionRenderComplete, params).then(() => { + return; + }); + } } exports.ExportServiceImpl = ExportServiceImpl; @@ -9532,3559 +8964,4841 @@ exports.ExportServiceImpl = ExportServiceImpl; "use strict"; Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ExternalContextMenuServiceImpl = void 0; 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 */; + return "external-context-menu-service" /* ServiceNames.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 })); +exports.FilterServiceImpl = void 0; +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" /* ServiceNames.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); + }); } - appendContextMenuAsync(sheetName, targetMenu, config) { - const verb = api_internal_contract_js_1.VerbId.AppendExternalMenuItem; + getCategoricalDomainAsync(worksheetName, fieldId, domainType) { + const verb = api_internal_contract_js_1.VerbId.GetCategoricalDomain; 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, + [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 newMenuItemId = response.result; - return newMenuItemId; + const domain = response.result; + return this.convertCategoricalDomain(domain, domainType); }); } - removeContextMenuAsync(sheetName, targetMenu, menuItemId) { - const verb = api_internal_contract_js_1.VerbId.RemoveExternalMenuItem; + getRangeDomainAsync(worksheetName, fieldId, domainType) { + const verb = api_internal_contract_js_1.VerbId.GetRangeDomain; 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, + [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) => { - return; + const domain = response.result; + return this.convertRangeDomain(domain, domainType); }); } - executeContextMenuAsync(sheetName, targetMenu, menuItemId) { - const verb = api_internal_contract_js_1.VerbId.ExecuteExternalMenuItem; + getDashboardFiltersAsync() { + const verb = api_internal_contract_js_1.VerbId.GetDashboardFilters; 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, + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDashboardFiltersAsync', }; return this.execute(verb, parameters).then((response) => { - return; + const filters = response.result; + return this.convertDomainFilters(filters); }); } - renameContextMenuAsync(sheetName, targetMenu, menuHeader, menuDescription) { - const verb = api_internal_contract_js_1.VerbId.RenameExternalMenu; + applyDashboardFilterAsync(fieldName, values, updateType, filterOptions) { + const verb = api_internal_contract_js_1.VerbId.DashboardCategoricalFilter; 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, + [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; + return response.result; + }); + } + getAppliedWorksheetsAsync(worksheetName, fieldId) { + return __awaiter(this, void 0, void 0, function* () { + var _a; + 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_external_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_external_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_external_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.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__) { +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"; -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 })); +exports.GetDataServiceImpl = void 0; 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 uuid_1 = __webpack_require__(/*! uuid */ "../../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 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 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 Param_1 = __webpack_require__(/*! ../../Utils/Param */ "../api-shared-js/lib/src/ApiShared/Utils/Param.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 FilterServiceImpl extends ServiceImplBase_1.ServiceImplBase { +class GetDataServiceImpl extends ServiceImplBase_1.ServiceImplBase { + constructor() { + super(...arguments); + // The extension/embedding instance uses the same cache for all DataTableReaders. + this.viewDataTableCacheId = (0, uuid_1.v4)(); + } get serviceName() { - return "filter-service" /* Filter */; + return "get-data-service" /* ServiceNames.GetData */; } - applyFilterAsync(visualId, fieldName, values, updateType, filterOptions) { - const verb = api_internal_contract_js_1.VerbId.ApplyCategoricalFilter; + 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]: 'applyFilterAsync', + [api_internal_contract_js_1.ParameterId.FunctionName]: functionName, }; 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; + 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) => { - return fieldName; + const responseData = response.result; + return this.processResultsTable(responseData.data, responseData.isSummary); }); } - applyRangeFilterAsync(visualId, fieldName, filterOptions) { - const verb = api_internal_contract_js_1.VerbId.ApplyRangeFilter; + getSummaryDataReaderAsync(visualId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption, applyWorksheetFormatting) { const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyRangeFilterAsync', + [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, }; - 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; + 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); }); } - applyHierarchicalFilterAsync(visualId, fieldName, values, updateType, filterOptions) { - const verb = api_internal_contract_js_1.VerbId.HierarchicalFilter; + 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]: 'applyHierarchicalFilterAsync', + [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, }; - 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; + 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; }); } - clearFilterAsync(visualId, fieldName) { - const verb = api_internal_contract_js_1.VerbId.ClearFilter; + getSelectedMarksAsync(visualId) { const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'clearFilterAsync', + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSelectedMarksAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, }; - 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; + 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)), + }; }); } - applyRelativeDateFilterAsync(visualId, fieldName, options) { - const verb = api_internal_contract_js_1.VerbId.ApplyRelativeDateFilter; + getHighlightedMarksAsync(visualId) { const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyRelativeDateFilterAsync', + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getHighlightedMarksAsync', + [api_internal_contract_js_1.ParameterId.VisualId]: visualId, }; - 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; + 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)), + }; }); } - getFiltersAsync(visualId) { - const verb = api_internal_contract_js_1.VerbId.GetFilters; + getDataSourceDataAsync(dataSourceId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getFiltersAsync', + [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), }; - parameters[api_internal_contract_js_1.ParameterId.VisualId] = visualId; - return this.execute(verb, parameters).then((response) => { - const filters = response.result; - return this.convertDomainFilters(filters); + return this.execute(api_internal_contract_js_1.VerbId.GetDataSourceData, parameters).then((response) => { + const responseData = response.result; + return this.processResultsTable(responseData.data, false); }); } - getCategoricalDomainAsync(worksheetName, fieldId, domainType) { - const verb = api_internal_contract_js_1.VerbId.GetCategoricalDomain; + getLogicalTableDataAsync(datasourceId, logicalTableId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getCategoricalDomainAsync', + [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), }; - parameters[api_internal_contract_js_1.ParameterId.VisualId] = { - worksheet: worksheetName, + 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, }; - 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); + return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableData, parameters).then((response) => { + const responseData = response.result; + return this.processResultsTable(responseData.data, false); }); } - getRangeDomainAsync(worksheetName, fieldId, domainType) { - const verb = api_internal_contract_js_1.VerbId.GetRangeDomain; + 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]: 'getRangeDomainAsync', - }; - parameters[api_internal_contract_js_1.ParameterId.VisualId] = { - worksheet: worksheetName, + [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, }; - 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); + 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); }); } - getDashboardFiltersAsync() { - const verb = api_internal_contract_js_1.VerbId.GetDashboardFilters; + getPageAsync(tableId, pageNumber, pageSize) { const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getDashboardFiltersAsync', + [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(verb, parameters).then((response) => { - const filters = response.result; - return this.convertDomainFilters(filters); + 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); }); } - applyDashboardFilterAsync(fieldName, values, updateType, filterOptions) { - const verb = api_internal_contract_js_1.VerbId.DashboardCategoricalFilter; + releaseAsync(tableId) { const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'applyDashboardFilterAsync', + [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, }; - 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; + return this.execute(api_internal_contract_js_1.VerbId.ReleaseDataTableReader, parameters).then((response) => { + return; }); } - 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; - }); + 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); } - 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; + 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); } - // 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; - } - } + 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); + }); }); - return filters; + 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); } - 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); +} +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 })); +exports.NotificationServiceImpl = void 0; +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" /* ServiceNames.Notification */; } - 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); +} +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 })); +exports.NotificationServiceImplBase = exports.Registration = void 0; +class Registration { + constructor(_filterFn, _callbackFn) { + this._filterFn = _filterFn; + this._callbackFn = _callbackFn; + // Nothing Here } - 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); + onNotification(notificationModel) { + if (this._filterFn(notificationModel)) { + this._callbackFn(notificationModel); + } } - 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); +} +exports.Registration = Registration; +class NotificationServiceImplBase { + constructor(dispatcher) { + this.dispatcher = dispatcher; + this._handlers = {}; + this.dispatcher.registerNotificationHandler(this.onNotification.bind(this)); } - convertCategoricalDomain(domain, domainType) { - const values = domain.values.map((domainDv) => { - return DataValueFactory_1.DataValueFactory.MakeFilterDataValue(domainDv); - }); - return new FilterModels_1.CategoricalDomain(values, domainType); + 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); } - 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); + hasHandlersForNotificationType(id) { + return this._handlers.hasOwnProperty(id); } - 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'); + onNotification(notification) { + if (!this.hasHandlersForNotificationType(notification.notificationId)) { + return; } - const result = `${year}-${month}-${day} ${hh}:${mm}:${sec}`; - return result; + // Go through and check for all the handlers of this particular notification + this._handlers[notification.notificationId].forEach((h) => h.onNotification(notification.data)); } - apiFilterHandlerCheckForCommandError(serverPm) { - if (!serverPm[InternalContract.ParameterId.ParameterError]) { + removeRegistration(id, registration) { + if (!this.hasHandlersForNotificationType(id)) { 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'); + this._handlers[id] = this._handlers[id].filter((reg) => reg !== registration); } } -exports.FilterServiceImpl = FilterServiceImpl; +exports.NotificationServiceImplBase = NotificationServiceImplBase; /***/ }), -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js": -/*!******************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/GetDataServiceImpl.js ***! - \******************************************************************************/ +/***/ "../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 })); +exports.ParametersServiceImpl = void 0; 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 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 GetDataServiceImpl extends ServiceImplBase_1.ServiceImplBase { - constructor() { - super(...arguments); - // The extension/embedding instance uses the same cache for all DataTableReaders. - this.viewDataTableCacheId = uuid_1.v4(); - } +class ParametersServiceImpl extends ServiceImplBase_1.ServiceImplBase { get serviceName() { - return "get-data-service" /* GetData */; - } - getMaxRowLimit() { - return 10000; - } - getViewDataTableCacheId() { - return this.viewDataTableCacheId; + return "parameters-service" /* ServiceNames.Parameters */; } - 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; + getParametersForSheetAsync(sheetPath) { const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: functionName, + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getParametersForSheetAsync', + [api_internal_contract_js_1.ParameterId.SheetPath]: sheetPath, }; - 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); - }); + return this.getParametersAsync(parameters); } - getSummaryDataReaderAsync(visualId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption, applyWorksheetFormatting) { + getAllParametersAsync() { 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, + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getParametersForSheetAsync', }; - 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); - }); + return this.getParametersAsync(parameters); } - 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; + 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); + }); }); } - getSelectedMarksAsync(visualId) { + changeParameterValueAsync(fieldName, newValue) { const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getSelectedMarksAsync', - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [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.GetSelectedMarks, parameters).then((response) => { - const responseData = response.result; - return { - data: responseData.data.map((table) => this.processResultsTable(table, true)), - }; + return this.execute(api_internal_contract_js_1.VerbId.ChangeParameterValue, parameters).then((response) => { + const result = response.result; + return 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((table) => this.processResultsTable(table, true)), - }; - }); + findParameterByNameAsync(name) { + return this.findParameterAsync(name, undefined); } - 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); - }); + findParameterByGlobalFieldNameAsync(fieldName) { + return this.findParameterAsync(undefined, fieldName); } - getLogicalTableDataAsync(datasourceId, logicalTableId, ignoreAliases, maxRows, columnsToInclude, columnsToIncludeById, includeDataValuesOption) { + findParameterAsync(name, fieldName) { 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), + [api_internal_contract_js_1.ParameterId.FunctionName]: 'findParameterAsync', }; - return this.execute(api_internal_contract_js_1.VerbId.GetLogicalTableData, parameters).then((response) => { - const responseData = response.result; - return this.processResultsTable(responseData.data, false); + 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; + } }); } - getLogicalTableDataReaderAsync(datasourceId, logicalTableId, pageRowCount, ignoreAliases, columnsToIncludeById, includeDataValuesOption) { - pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit()); +} +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 })); +exports.SelectionServiceImpl = void 0; +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" /* ServiceNames.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]: '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), + [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.GetLogicalTableDataReader, parameters).then((response) => { - const responseData = response.result; - return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId); + return this.execute(api_internal_contract_js_1.VerbId.ClearSelectedMarks, parameters).then((response) => { + return; // Expecting an empty model and hence the void response. }); } - getUnderlyingTableDataAsync(visualId, logicalTableId, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, maxRows, includeDataValuesOption, applyWorksheetFormatting) { + /** + * 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]: 'getUnderlyingTableDataAsync', + [api_internal_contract_js_1.ParameterId.FunctionName]: 'selectMarksByValueAsync', [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, + [api_internal_contract_js_1.ParameterId.SelectionUpdateType]: selectionType, }; - return this.execute(api_internal_contract_js_1.VerbId.GetUnderlyingTableData, parameters).then((response) => { - const responseData = response.result; - return this.processResultsTable(responseData.data, false); + 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; }); } - getUnderlyingTableDataReaderAsync(visualId, logicalTableId, pageRowCount, ignoreAliases, ignoreSelection, includeAllColumns, columnsToIncludeById, includeDataValuesOption, applyWorksheetFormatting) { - pageRowCount = this.getLimitedMaxRows(pageRowCount, this.getMaxRowLimit()); + /** + * 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]: '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, + [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.GetUnderlyingTableDataReader, parameters).then((response) => { - const responseData = response.result; - return new GetDataTableReaderModels_1.DataTableReader(responseData.id, responseData.totalRowCount, pageRowCount, this._registryId); + return this.execute(api_internal_contract_js_1.VerbId.RaiseHoverTupleNotification, parameters).then((response) => { + return; }); } - getPageAsync(tableId, pageNumber, pageSize) { + /** + * 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]: '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, + [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.GetDataTableReaderPage, parameters).then((response) => { - const responseData = response.result; - return this.processResultsPage(responseData, tableId === GetDataServiceImpl.summaryTableId ? true : false); + return this.execute(api_internal_contract_js_1.VerbId.RaiseSelectTuplesNotification, parameters).then((response) => { + return; }); } - releaseAsync(tableId) { + 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]: 'release', - [api_internal_contract_js_1.ParameterId.ViewDataTableCacheId]: this.getViewDataTableCacheId(), - [api_internal_contract_js_1.ParameterId.ViewDataTableId]: tableId, + [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.ReleaseDataTableReader, parameters).then((response) => { + 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. }); } - 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'); + /** + * 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); } - // Remove any duplicates from the input array - const columnsAsSet = new Set(columns); - return Array.from(columnsAsSet); + if (value.min !== undefined && value.min !== null) { + rangeSelectionModel.minValue = Param_1.Param.serializeParameterValue(value.min); + } + rangeSelectionModel.included = this.validateNullOptionType(value.nullOption); + return rangeSelectionModel; } - 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)); + /** + * Method to validate the selection update type. + * + * @param selectionUpdateType + */ + validateSelectionUpdateType(selectionUpdateType) { + if (selectionUpdateType === Contract.SelectionUpdateType.Replace) { + return api_internal_contract_js_1.SelectionUpdateType.Replace; } - // 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; + else if (selectionUpdateType === Contract.SelectionUpdateType.Add) { + return api_internal_contract_js_1.SelectionUpdateType.Add; } - 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); + else if (selectionUpdateType === Contract.SelectionUpdateType.Remove) { + return api_internal_contract_js_1.SelectionUpdateType.Remove; } - return new GetDataModels_1.DataTable(table, headers, table.length, isTotalRowCountLimited, isSummary); + return api_internal_contract_js_1.SelectionUpdateType.Replace; } - 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)); + /** + * 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; + } } - 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 api_internal_contract_js_1.QuantitativeIncludedValues.IncludeAll; + } + ensureTupleIDIsNonNegative(tupleId) { + if (tupleId && tupleId > 0) { + return tupleId; } - return new GetDataModels_1.DataTable(table, headers, table.length, false, isSummary); + // 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.GetDataServiceImpl = GetDataServiceImpl; -GetDataServiceImpl.summaryTableId = ''; +exports.SelectionServiceImpl = SelectionServiceImpl; /***/ }), -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js": -/*!***********************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImpl.js ***! - \***********************************************************************************/ +/***/ "../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 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.ServiceImplBase = void 0; +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.NotificationServiceImpl = NotificationServiceImpl; +exports.ServiceImplBase = ServiceImplBase; /***/ }), -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js": -/*!***************************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/NotificationServiceImplBase.js ***! - \***************************************************************************************/ -/***/ ((__unused_webpack_module, exports) => { +/***/ "../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 })); -class Registration { - constructor(_filterFn, _callbackFn) { - this._filterFn = _filterFn; - this._callbackFn = _callbackFn; - // Nothing Here +exports.SizeServiceImpl = void 0; +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" /* ServiceNames.Size */; } - onNotification(notificationModel) { - if (this._filterFn(notificationModel)) { - this._callbackFn(notificationModel); - } + 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.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); +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 })); +exports.StoryActivationServiceImpl = void 0; +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" /* ServiceNames.StoryActivation */; } - hasHandlersForNotificationType(id) { - // eslint-disable-next-line no-prototype-builtins - return this._handlers.hasOwnProperty(id); + 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; + }); } - onNotification(notification) { - if (!this.hasHandlersForNotificationType(notification.notificationId)) { + 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; - } - // 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)) { + 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; - } - this._handlers[id] = this._handlers[id].filter((reg) => reg !== registration); + }); + } + 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.NotificationServiceImplBase = NotificationServiceImplBase; +exports.StoryActivationServiceImpl = StoryActivationServiceImpl; /***/ }), -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js": -/*!*********************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ParametersServiceImpl.js ***! - \*********************************************************************************/ +/***/ "../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_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +exports.VisualModelServiceImpl = void 0; 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 { +class VisualModelServiceImpl extends ServiceImplBase_1.ServiceImplBase { get serviceName() { - return "parameters-service" /* Parameters */; + return "visual-model-service" /* ServiceNames.VisualModel */; } - getParametersForSheetAsync(sheetPath) { + getVisualSpecificationAsync(visualId) { const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getParametersForSheetAsync', - [api_internal_contract_js_1.ParameterId.SheetPath]: sheetPath, + [api_internal_contract_js_1.ParameterId.FunctionName]: 'getVisualSpecificationAsync', + [api_internal_contract_js_1.ParameterId.WorksheetName]: visualId.worksheet, }; - return this.getParametersAsync(parameters); + return this.execute(api_internal_contract_js_1.VerbId.GetVisualSpecification, parameters).then((response) => { + const result = response.result; + return result; + }); } - getAllParametersAsync() { + addMarksCardFieldsAsync(visualId, marksCardIndex, encodingType, columns, startIndex) { const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'getParametersForSheetAsync', + [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.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); - }); + return this.execute(api_internal_contract_js_1.VerbId.AddMarksCardFields, parameters).then(() => { + return; }); } - changeParameterValueAsync(fieldName, newValue) { + moveMarksCardFieldAsync(visualId, marksCardIndex, fromIndex, toIndex, fieldCount = 1) { 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, + [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.ChangeParameterValue, parameters).then((response) => { - const result = response.result; - return result; + return this.execute(api_internal_contract_js_1.VerbId.MoveMarksCardField, parameters).then(() => { + return; }); } - findParameterByNameAsync(name) { - return this.findParameterAsync(name, undefined); - } - findParameterByGlobalFieldNameAsync(fieldName) { - return this.findParameterAsync(undefined, fieldName); + 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; + }); } - findParameterAsync(name, fieldName) { + editAliasesDialogAsync(fieldName) { const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'findParameterAsync', + [api_internal_contract_js_1.ParameterId.FunctionName]: 'editAliasesDialogAsync', + [api_internal_contract_js_1.ParameterId.FieldId]: fieldName, }; - 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; - } + return this.execute(api_internal_contract_js_1.VerbId.EditAliasesDialog, parameters).then(() => { + return; }); } } -exports.ParametersServiceImpl = ParametersServiceImpl; +exports.VisualModelServiceImpl = VisualModelServiceImpl; /***/ }), -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js": -/*!********************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/SelectionServiceImpl.js ***! - \********************************************************************************/ +/***/ "../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 Contract = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +exports.VizServiceImpl = void 0; 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 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 SelectionServiceImpl extends ServiceImplBase_1.ServiceImplBase { +class VizServiceImpl extends ServiceImplBase_1.ServiceImplBase { get serviceName() { - return "selection-service" /* Selection */; + return "viz-service" /* ServiceNames.Viz */; } - /** - * Method to clear all the selected marks for the given worksheet. - * - * @param visualId - */ - clearSelectedMarksAsync(visualId) { + createVizImageAsync(inputSpec) { const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'clearSelectedMarksAsync', - [api_internal_contract_js_1.ParameterId.VisualId]: visualId, + [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.ClearSelectedMarks, parameters).then((response) => { - return; // Expecting an empty model and hence the void response. + return this.execute(api_internal_contract_js_1.VerbId.VizAPI, parameters).then((response) => { + const result = response.result; + return result; }); } - /** - * 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); + activateSheetAsync(name) { 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, + [api_internal_contract_js_1.ParameterId.FunctionName]: 'activateSheetAsync', + [api_internal_contract_js_1.ParameterId.SwitchToSheetName]: name, }; - 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 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 || '', // a falsey value means "show original view" + }; + return this.execute(api_internal_contract_js_1.VerbId.ShowCustomView, parameters).then((response) => { + const customView = response.result; + return (customView === null || customView === void 0 ? void 0 : customView.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; }); } - /** - * 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); + 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 })); +exports.ZoneServiceImpl = void 0; +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" /* ServiceNames.Zone */; + } + setVisibilityAsync(dashboard, dashboardZoneMap, zoneVisibilityMap) { const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'hoverTupleAsync', - [api_internal_contract_js_1.ParameterId.HoverTupleInteraction]: interactionModel, + [api_internal_contract_js_1.ParameterId.FunctionName]: 'setVisibilityAsync', + [api_internal_contract_js_1.ParameterId.Dashboard]: dashboard, + [api_internal_contract_js_1.ParameterId.ZoneIdsVisibilityMap]: {}, }; - return this.execute(api_internal_contract_js_1.VerbId.RaiseHoverTupleNotification, parameters).then((response) => { - return; + // 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); }); - } - /** - * 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 this.execute(api_internal_contract_js_1.VerbId.SetZoneVisibility, 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); + moveAndResizeAsync(dashboard, dashboardZoneMap, dashboardObjectPositionAndSizeUpdateArray) { 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, + [api_internal_contract_js_1.ParameterId.Dashboard]: dashboard, + [api_internal_contract_js_1.ParameterId.DashboardObjectPositionAndSizeUpdateList]: dashboardObjectPositionAndSizeUpdateArray, }; - return this.execute(api_internal_contract_js_1.VerbId.SelectByValue, parameters).then((response) => { - // Expecting an empty model and hence the void response. + 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; - // 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; +} +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 })); +exports.TableSummary = void 0; +/** + * 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; } - 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; + 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.SelectionServiceImpl = SelectionServiceImpl; +exports.TableSummary = TableSummary; /***/ }), -/***/ "../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__) => { +/***/ "../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 })); -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"); +exports.TableauError = void 0; /** - * 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 + * 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 ServiceImplBase { - constructor(_dispatcher, _registryId) { - this._dispatcher = _dispatcher; - this._registryId = _registryId; +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); } - 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); - }); + get errorCode() { + return this._errorCode; } } -exports.ServiceImplBase = ServiceImplBase; +exports.TableauError = TableauError; /***/ }), -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js": -/*!***************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/SizeServiceImpl.js ***! - \***************************************************************************/ +/***/ "../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 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 */; +exports.DataValueFactory = void 0; +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); } - 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; - }); + 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.SizeServiceImpl = SizeServiceImpl; +exports.DataValueFactory = DataValueFactory; /***/ }), -/***/ "../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__) => { +/***/ "../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 })); -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; +exports.UnregisterTimeoutInMilliseconds = exports.Deferred = void 0; +/** + * 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; }); } - 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) => { + /** + * 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); } - 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) => { + /** + * + * + * @param {TReject} [reason] The reason why the Promise rejected. + * @returns {*} {void} + */ + reject(reason) { + if (!this._reject) { return; - }); + } + this._reject(reason); } - 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.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 })); +exports.ShouldThrow = exports.EnumConverter = void 0; +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.StoryActivationServiceImpl = StoryActivationServiceImpl; +exports.EnumConverter = EnumConverter; +var ShouldThrow; +(function (ShouldThrow) { + ShouldThrow["Yes"] = "yes"; + ShouldThrow["No"] = "no"; +})(ShouldThrow || (exports.ShouldThrow = ShouldThrow = {})); /***/ }), -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js": -/*!**********************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/VisualModelServiceImpl.js ***! - \**********************************************************************************/ +/***/ "../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_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 */; +exports.ErrorHelpers = void 0; +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.`); } - 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; + /** + * 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; } - 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(() => { + /** + * 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.`); } - 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(() => { + /** + * 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; - }); - } - 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(() => { + } + 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'); } - 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; - }); + /** + * 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.VisualModelServiceImpl = VisualModelServiceImpl; +exports.ErrorHelpers = ErrorHelpers; /***/ }), -/***/ "../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js": -/*!**************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/VizServiceImpl.js ***! - \**************************************************************************/ +/***/ "../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 })); +exports.ExportHelpers = void 0; 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); - }); +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); } - setActiveCustomViewAsDefaultAsync() { - const parameters = { - [api_internal_contract_js_1.ParameterId.FunctionName]: 'setActiveCustomViewAsDefaultAsync', - }; - return this.execute(api_internal_contract_js_1.VerbId.SetActiveCustomViewAsDefault, parameters).then(() => { - return; - }); + /** + * 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'); + } } - 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); - }); + /** + * 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); + } } - 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); + /** + * 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.VizServiceImpl = VizServiceImpl; +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/Services/impl/ZoneServiceImpl.js": -/*!***************************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Services/impl/ZoneServiceImpl.js ***! - \***************************************************************************/ +/***/ "../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 })); +exports.Param = void 0; 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 */; +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}`; } - 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; - }); + static serializeBooleanForPlatform(bool) { + return bool ? 'true' : 'false'; } - 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; - }); + static serializeNumberForPlatform(num) { + return num.toString(10); } -} -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; + /** + * Verifies the input is a number + */ + /* tslint:disable-next-line:no-any */ + static isTypeNumber(input) { + return typeof input === 'number' || input instanceof Number; } - get name() { - return this._tableInfo.name; + /** + * Verifies the input is a Date + */ + /* tslint:disable-next-line:no-any */ + static isTypeDate(input) { + return input instanceof Date; } - get id() { - return this._tableInfo.id; + /* tslint:disable-next-line:no-any */ + static isTypeString(input) { + return typeof input === 'string' || input instanceof String; } - get connectionId() { - return this._tableInfo.connectionId; + /* tslint:disable-next-line:no-any */ + static isTypeBool(input) { + return typeof input === 'boolean' || input instanceof Boolean; } - get customSQL() { - return this._tableInfo.customSQL; + /** + * Determines if the input is null or undefined + */ + /* tslint:disable-next-line:no-any */ + static isNullOrUndefined(input) { + return input === null || input === undefined; } -} -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); + /* 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}`); + } } - get errorCode() { - return this._errorCode; + /** + * 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.TableauError = TableauError; +exports.Param = Param; /***/ }), -/***/ "../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js": -/*!********************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Utils/DataValueFactory.js ***! - \********************************************************************/ +/***/ "../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 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.SheetUtils = void 0; +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 }, + }; } -} -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; - }); + static createAutomaticSize() { + let behavior = Contract.SheetSizeBehavior.Automatic; + let minSize = { width: 0, height: 0 }; + let maxSize = { width: 0, height: 0 }; + return { behavior, minSize, maxSize }; } - /** - * Gets the Promise. - * - * @readonly - * @type {Promise} - */ - get promise() { - return this._promise; + static getPublishedSheetInfoByName(name, sheetInfos) { + const sheetInfo = sheetInfos.find((sheet) => sheet.name === name); + return sheetInfo; } - /** - * Resolves the wrapped Promise. - * - * @param {(TResolve | PromiseLike)} response The argument to be resolved by the Promise. - * @returns {*} {void} - */ - resolve(response) { - if (!this._resolve) { - return; + 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'); + } } - this._resolve(response); + return sheetType; } - /** - * - * - * @param {TReject} [reason] The reason why the Promise rejected. - * @returns {*} {void} - */ - reject(reason) { - if (!this._reject) { - return; - } - this._reject(reason); + static isValidSheetSize(sizeObject) { + return sizeObject.behavior !== undefined; } } -exports.Deferred = Deferred; -exports.UnregisterTimeoutInMilliseconds = 30000; +exports.SheetUtils = SheetUtils; /***/ }), -/***/ "../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js": -/*!*****************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Utils/EnumConverter.js ***! - \*****************************************************************/ +/***/ "../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 api_external_contract_js_1 = __webpack_require__(/*! @tableau/api-external-contract-js */ "../api-external-contract-js/lib/src/ExternalContract.js"); +exports.ShortLivedDeferred = void 0; +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"); /** - * This class converts from a source enum value to destination enum - * value given a mapping from source to destination when constructed. + * 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. * - * 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; +class ShortLivedDeferred { + constructor(_timeoutInMilliseconds = Deferred_1.UnregisterTimeoutInMilliseconds) { + this._timeoutInMilliseconds = _timeoutInMilliseconds; } - convert(enumVal, throwIfMissing = ShouldThrow.Yes) { - if (this._mappings.hasOwnProperty(enumVal)) { - return this._mappings[enumVal]; + getNewPromiseOrThrowIfBusy() { + if (this._deferred) { + throw new TableauError_1.TableauError(Contract.SharedErrorCodes.ApiExecutionError, 'This api cannot be executed till previous call is resolved.'); } - if (this._defaultVal !== undefined && throwIfMissing !== ShouldThrow.Yes) { - return this._defaultVal; + 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; } - 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 = {})); +exports.ShortLivedDeferred = ShortLivedDeferred; /***/ }), -/***/ "../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js": -/*!****************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Utils/ErrorHelpers.js ***! - \****************************************************************/ +/***/ "../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 })); +exports.VersionNumber = void 0; 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"); +const TableauError_1 = __webpack_require__(/*! ./TableauError */ "../api-shared-js/lib/src/ApiShared/TableauError.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. + * Represents the current version of the extensions, embedding + * and extensions-api-types library */ -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; +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}`); } - // 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'); + this.major = parts[0]; + this.minor = parts[1]; + this.fix = parts[2]; + this.isAlpha = isAlpha; } - /** - * 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'); + 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.ErrorHelpers = ErrorHelpers; +exports.VersionNumber = VersionNumber; /***/ }), -/***/ "../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js": -/*!*****************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Utils/ExportHelpers.js ***! - \*****************************************************************/ +/***/ "../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 })); +exports.VersionedExternalApiDispatcher = void 0; 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. + * Implementation of the InternalApiDispatcher which supports upgrading and downgrading the input + * internal contract to the version that this module is built against * - * @class ExportHelpers + * @class VersionedExternalApiDispatcher + * @implements {InternalApiDispatcher} */ -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); - } +class VersionedExternalApiDispatcher { /** - * 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. + * 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 */ - 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'); - } + constructor(_apiDelegateDispatcher, platformVersionNumber) { + this._apiDelegateDispatcher = _apiDelegateDispatcher; + this._versionConverter = (0, 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); + }); + }); } - /** - * 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); - } + static needsVersionConverter(platformVersion) { + // If our platform is less than external library version, then we need a converter + return (0, api_internal_contract_js_1.VersionLessThan)(platformVersion, api_internal_contract_js_1.INTERNAL_CONTRACT_VERSION); } - /** - * 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; + 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; + }); } - else if (percentMatch) { - [pageScalePercent] = percentMatch.slice(1).map((value) => Number(value)); - pageScaleMode = api_internal_contract_js_1.ScaleMode.ScalePercentage; + catch (e) { + return Promise.reject(e); } - // getFitAndScaleValues returns the properties below, but instead this method will set them. - exportLayoutOptions.pageFitHorizontal = pageFitHorizontal; - exportLayoutOptions.pageFitVertical = pageFitVertical; - exportLayoutOptions.pageScaleMode = pageScaleMode; - exportLayoutOptions.pageScalePercent = pageScalePercent; + } + registerNotificationHandler(handler) { + this._notificationHandlers.push(handler); + } + unregisterNotificationHandler(handler) { + this._notificationHandlers = this._notificationHandlers.filter((h) => h !== handler); } } -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]+)'); +exports.VersionedExternalApiDispatcher = VersionedExternalApiDispatcher; /***/ }), -/***/ "../api-shared-js/lib/src/ApiShared/Utils/Param.js": -/*!*********************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Utils/Param.js ***! - \*********************************************************/ +/***/ "./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js": +/*!*********************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Events/DashboardLayoutChangedEvent.js ***! + \*********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { + +"use strict"; + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DashboardLayoutChangedEvent = void 0; +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 })); +exports.FilterChangedEvent = void 0; 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}`; +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; } - static serializeBooleanForPlatform(bool) { - return bool ? 'true' : 'false'; + get fieldName() { + return this._fieldName; } - static serializeNumberForPlatform(num) { - return num.toString(10); + get fieldId() { + return this._fieldId; } - /** - * Verifies the input is a number - */ - /* tslint:disable-next-line:no-any */ - static isTypeNumber(input) { - return typeof input === 'number' || input instanceof Number; + 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; + }); } - /** - * Verifies the input is a Date - */ - /* tslint:disable-next-line:no-any */ - static isTypeDate(input) { - return input instanceof Date; +} +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 })); +exports.MarksSelectedEvent = void 0; +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); } - /* tslint:disable-next-line:no-any */ - static isTypeString(input) { - return typeof input === 'string' || input instanceof String; + getMarksAsync() { + return this.worksheet.getSelectedMarksAsync(); } - /* tslint:disable-next-line:no-any */ - static isTypeBool(input) { - return typeof input === 'boolean' || input instanceof Boolean; +} +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 })); +exports.ParameterChangedEvent = void 0; +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; } - /** - * Determines if the input is null or undefined - */ - /* tslint:disable-next-line:no-any */ - static isNullOrUndefined(input) { - return input === null || input === undefined; + 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" /* ServiceNames.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); + }); } - /* 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}`); - } +} +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 })); +exports.SummaryDataChangedEvent = void 0; +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); } - /** - * 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)); +} +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 })); +exports.TableauEvent = void 0; +class TableauEvent { + constructor(type) { + this._type = type; } - /* 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 }; + get type() { + return this._type; } } -exports.Param = Param; +exports.TableauEvent = TableauEvent; /***/ }), -/***/ "../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js": -/*!**************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Utils/SheetUtils.js ***! - \**************************************************************/ +/***/ "./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 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 }, - }; +exports.TableauSheetEvent = void 0; +const TableauEvent_1 = __webpack_require__(/*! ./TableauEvent */ "./lib/src/ExtensionsApi/Events/TableauEvent.js"); +class TableauSheetEvent extends TableauEvent_1.TableauEvent { + get sheet() { + return this._sheet; } - static createAutomaticSize() { - let behavior = Contract.SheetSizeBehavior.Automatic; - let minSize = { width: 0, height: 0 }; - let maxSize = { width: 0, height: 0 }; - return { behavior, minSize, maxSize }; + constructor(type, sheet) { + super(type); + this._sheet = sheet; } - static getPublishedSheetInfoByName(name, sheetInfos) { - const sheetInfo = sheetInfos.find((sheet) => sheet.name === name); - return sheetInfo; +} +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 })); +exports.TableauWorksheetEvent = void 0; +const TableauSheetEvent_1 = __webpack_require__(/*! ./TableauSheetEvent */ "./lib/src/ExtensionsApi/Events/TableauSheetEvent.js"); +class TableauWorksheetEvent extends TableauSheetEvent_1.TableauSheetEvent { + get worksheet() { + return this._worksheet; } - 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; + constructor(type, _worksheet) { + super(type, _worksheet); + this._worksheet = _worksheet; } - static isValidSheetSize(sizeObject) { - return sizeObject.behavior !== undefined; +} +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 })); +exports.WorkbookFormattingChangedEvent = void 0; +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.SheetUtils = SheetUtils; +exports.WorkbookFormattingChangedEvent = WorkbookFormattingChangedEvent; /***/ }), -/***/ "../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js": -/*!**********************************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/Utils/ShortLivedDeferred.js ***! - \**********************************************************************/ +/***/ "./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 })); +exports.WorksheetFormattingChangedEvent = void 0; 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: +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; - * 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; + +/***/ }), + +/***/ "./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.SupportedBentonSansFontFaces = exports.BentonSansMediumFontFaceName = exports.BentonSansLightFontFaceName = exports.BentonSansSemiDemiItalicFontFaceName = exports.BentonSansSemiDemiFontFaceName = exports.BentonSansBookItalicFontFaceName = exports.BentonSansBookFontFaceName = exports.BentonSansLowDPIFontFamilyName = exports.BentonSansFontFamilyName = void 0; +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 })); +exports.ConnectedServer = void 0; +class ConnectedServer { + constructor(_userId, _siteId, _siteNamespace, _workbookId) { + this._userId = _userId; + this._siteId = _siteId; + this._siteNamespace = _siteNamespace; + this._workbookId = _workbookId; } - 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; + get userId() { + return this._userId; } - resolve(response) { - if (this._deferred) { - clearTimeout(this._timeoutId); - this._deferred.resolve(response); - this._deferred = undefined; - } + get siteId() { + return this._siteId; } - reject(error) { - if (this._deferred) { - clearTimeout(this._timeoutId); - this._deferred.reject(error); - this._deferred = undefined; - } + get siteNamespace() { + return this._siteNamespace; + } + get workbookId() { + return this._workbookId; } } -exports.ShortLivedDeferred = ShortLivedDeferred; +exports.ConnectedServer = ConnectedServer; /***/ }), -/***/ "../api-shared-js/lib/src/ApiShared/VersionNumber.js": -/*!***********************************************************!*\ - !*** ../api-shared-js/lib/src/ApiShared/VersionNumber.js ***! - \***********************************************************/ +/***/ "./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 })); +exports.ExtensionWorkbookImpl = void 0; +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" /* ServiceNames.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 ***! + \******************************************************/ +/***/ (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 })); +exports.ExtensionsImpl = void 0; 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}`); +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) => { + const initOptions = { isAlpha: api_shared_js_1.ApiVersion.Instance.isAlpha, isExtensionDialog: isExtensionDialog }; + // 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); + desktopDispatcherPromise === null || desktopDispatcherPromise === void 0 ? void 0 : desktopDispatcherPromise.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); + (0, 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); + }); + } + }); } - this.major = parts[0]; - this.minor = parts[1]; - this.fix = parts[2]; - this.isAlpha = isAlpha; + return this._initializationPromise; } - getBuildNumber(preReleaseString) { - const noBuildNumber = -1; - if (!preReleaseString) { - return noBuildNumber; + reportExtensionRenderComplete(mediaBlob) { + return __awaiter(this, void 0, void 0, function* () { + const exportService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("export-service" /* ServiceNames.Export */); + return exportService.reportExtensionRenderComplete(mediaBlob); + }); + } + createVizImageAsync(inputSpec) { + const vizService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("viz-service" /* ServiceNames.Viz */); + return vizService.createVizImageAsync(inputSpec); + } + setClickThroughAsync(clickThroughEnabled) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* ExtensionsServiceNames.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 + (0, 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" /* ExtensionsServiceNames.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. + (0, api_shared_js_1.registerAllSharedServices)(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId); + (0, 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(isExtensionDialog)); + 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" /* ServiceNames.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(); } - // 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}`; + 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)); + } + }); } - get fullFormattedValue() { - return `${this.major}.${this.minor}.${this.fix}-pre.${this.build}`; + 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); } -} -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; + 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" /* ServiceNames.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](); } - 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); + 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}.'`); } } - registerNotificationHandler(handler) { - this._notificationHandlers.push(handler); - } - unregisterNotificationHandler(handler) { - this._notificationHandlers = this._notificationHandlers.filter((h) => h !== handler); + 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.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); - } - } +exports.ExtensionsImpl = ExtensionsImpl; - 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'; +/***/ "./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js": +/*!*************************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/LegacyInternalApiDispatcherHolder.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - 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); - } +"use strict"; - return output; -} +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.LegacyInternalApiDispatcherHolder = void 0; +const api_internal_contract_js_1 = __webpack_require__(/*! @tableau/api-internal-contract-js */ "../api-internal-contract-js/lib/src/JsApiInternalContract.js"); /** - * Calculate output length with padding and bit length + * 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 */ +var LegacyInternalApiDispatcherHolder; +(function (LegacyInternalApiDispatcherHolder) { + /** + * @param options + */ + function getDesktopDispatcherPromise(options) { + 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 ((options === null || options === void 0 ? void 0 : options.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 = LegacyInternalApiDispatcherHolder = {})); -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; +/***/ "./lib/src/ExtensionsApi/Impl/SettingsImpl.js": +/*!****************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/SettingsImpl.js ***! + \****************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - 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); - } +"use strict"; - return [a, b, c, d]; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SettingsImpl = void 0; +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" /* ExtensionsServiceNames.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" /* ServiceNames.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) => { + var _a; + this._currentSettings = (_a = event.newSettings) !== null && _a !== void 0 ? _a : {}; + 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); + } + } } -/* - * Convert an array bytes to an array of little-endian words - * Characters >255 have their high-byte silently ignored. - */ +exports.SettingsImpl = SettingsImpl; +SettingsImpl.ASYNC_SAVE_IN_PROGRESS = 'Async Save is in progress, updating settings is not allowed.'; -function bytesToWords(input) { - if (input.length === 0) { - return []; - } +/***/ }), - var length8 = input.length * 8; - var output = new Uint32Array(getOutputLength(length8)); +/***/ "./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js": +/*!********************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/TableauBookFontNameConstants.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, exports) => { - for (var i = 0; i < length8; i += 8) { - output[i >> 5] |= (input[i / 8] & 0xff) << i % 32; - } +"use strict"; - return output; -} -/* - * Add integers, wrapping at 2^32. This uses 16-bit operations internally - * to work around bugs in some JS interpreters. - */ +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SupportedTableauFontFaces = exports.TableauSemiBoldFontFaceName = exports.TableauRegularFontFaceName = exports.TableauMediumFontFaceName = exports.TableauLightFontFaceName = exports.TableauBoldFontFaceName = exports.TableauBookFontFaceName = exports.TableauBoldFontFamilyName = exports.TableauSemiboldFontFamilyName = exports.TableauMediumFontFamilyName = exports.TableauRegularFontFamilyName = exports.TableauLightFontFamilyName = exports.TableauBookFontFamilyName = void 0; +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, +]; -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. - */ +/***/ }), + +/***/ "./lib/src/ExtensionsApi/Impl/UIImpl.js": +/*!**********************************************!*\ + !*** ./lib/src/ExtensionsApi/Impl/UIImpl.js ***! + \**********************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { +"use strict"; -function bitRotateLeft(num, cnt) { - return num << cnt | num >>> 32 - cnt; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.UIImpl = exports.TableauDialogError = exports.DialogMessageEvent = void 0; +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, sourceDialogUrl) { + super(Contract.TableauEventType.DialogMessageReceived); + this.message = message; + this.sourceDialogUrl = sourceDialogUrl; + } } -/* - * These functions implement the four basic operations the algorithm uses. +exports.DialogMessageEvent = DialogMessageEvent; +/** + * Custom error class that extends the TableauError object. + * Includes context for which dialog caused the exception via its url. */ - - -function md5cmn(q, a, b, x, s, t) { - return safeAdd(bitRotateLeft(safeAdd(safeAdd(a, q), safeAdd(x, t)), s), b); +class TableauDialogError extends api_shared_js_1.TableauError { + constructor(_errorCode, message) { + super(_errorCode, message); + /*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, TableauDialogError.prototype); + } } - -function md5ff(a, b, c, d, x, s, t) { - return md5cmn(b & c | ~b & d, a, b, x, s, t); +exports.TableauDialogError = TableauDialogError; +class UIImpl { + constructor(isExtensionDialog) { + this.isExtensionDialog = isExtensionDialog; + } + displayDialogAsync(url, payload, options) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* ExtensionsServiceNames.UIService */); + const notificationService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("notification-service" /* ServiceNames.Notification */); + return new Promise((resolve, reject) => { + uiService + .displayDialogAsync(url, payload || '', this.isExtensionDialog, 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 TableauDialogError(Contract.ErrorCodes.InternalError, 'closePayload is undefined'); + } + resolve(event.closePayload); + } + else { + reject(new TableauDialogError(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" /* ExtensionsServiceNames.UIService */); + uiService.sendDialogMessageAsync(message, targetDialogUrl); + } + sendDialogMessageToParentAsync(message) { + if (!this.isExtensionDialog) { + throw new api_shared_js_1.TableauError(api_external_contract_js_1.ErrorCodes.InternalError, 'sendDialogMessageToParentAsync can only be called from an extension dialog.'); + } + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* ExtensionsServiceNames.UIService */); + uiService.sendDialogMessageToParentAsync(message); + } + closeDialog(payload, dialogUrl) { + const uiService = api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).getService("UIService" /* ExtensionsServiceNames.UIService */); + uiService.closeDialog(payload, dialogUrl); + } + /** + * 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" /* ServiceNames.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, event.sourceDialogUrl)); + }); + results.push(dialogMessageEvent); + return results; + } } +exports.UIImpl = UIImpl; -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); +/***/ "./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 })); +exports.Dashboard = void 0; +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" /* ServiceNames.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; -/* 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__) => { +/***/ "./lib/src/ExtensionsApi/Models/DashboardObject.js": +/*!*********************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/DashboardObject.js ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, 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; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DashboardObject = void 0; +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; -/* 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__) => { +/***/ "./lib/src/ExtensionsApi/Models/Parameter.js": +/*!***************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Parameter.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, 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); + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Parameter = void 0; +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" /* ServiceNames.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; + /***/ }), -/***/ "../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__) => { +/***/ "./lib/src/ExtensionsApi/Models/Sheet.js": +/*!***********************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Sheet.js ***! + \***********************************************/ +/***/ ((__unused_webpack_module, 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'); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Sheet = void 0; +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); + }); + }); } - } - - return getRandomValues(rnds8); } +exports.Sheet = Sheet; + /***/ }), -/***/ "../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__) => { +/***/ "./lib/src/ExtensionsApi/Models/Workbook.js": +/*!**************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Workbook.js ***! + \**************************************************/ +/***/ ((__unused_webpack_module, exports) => { "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; - } +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Workbook = void 0; +class Workbook { + constructor(_workbookImpl) { + this._workbookImpl = _workbookImpl; + } + getAllDataSourcesAsync() { + return this._workbookImpl.getAllDataSourcesAsync(); + } } +exports.Workbook = Workbook; -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 +/***/ "./lib/src/ExtensionsApi/Models/Worksheet.js": +/*!***************************************************!*\ + !*** ./lib/src/ExtensionsApi/Models/Worksheet.js ***! + \***************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - bytes = []; +"use strict"; - for (var i = 0; i < msg.length; ++i) { - bytes.push(msg.charCodeAt(i)); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Worksheet = void 0; +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)); } - } 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]; + 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" /* ServiceNames.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); } - - 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]; + selectTuplesAsync(selectedTuples, selectOption, tooltip) { + return this._worksheetImpl.selectTuplesAsync(selectedTuples, selectOption, tooltip); } - - for (var _t = 16; _t < 80; ++_t) { - W[_t] = ROTL(W[_t - 3] ^ W[_t - 8] ^ W[_t - 14] ^ W[_t - 16], 1); + getTooltipTextAsync(tupleId) { + return this._worksheetImpl.getTooltipTextAsync(tupleId); } - - 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; + 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); } - - 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]; } +exports.Worksheet = Worksheet; -/* 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__) => { +/***/ "./lib/src/ExtensionsApi/Namespaces/DashboardContent.js": +/*!**************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/DashboardContent.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports) => { "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"); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.DashboardContent = void 0; /** - * Convert array of 16 byte values to UUID string format of the form: - * XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX + * Implementation of the external DashboardContent namespace. + * This does not follow the Impl pattern as DashboardContent is + * currently just a (single) property bag. */ - -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; +class DashboardContent { + constructor(_dashboard) { + this._dashboard = _dashboard; + } + get dashboard() { + return this._dashboard; + } } +exports.DashboardContent = DashboardContent; -/* 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__) => { +/***/ "./lib/src/ExtensionsApi/Namespaces/Environment.js": +/*!*********************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/Environment.js ***! + \*********************************************************/ +/***/ ((__unused_webpack_module, 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]]; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Environment = void 0; +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._isExporting = extensionEnvironment.isExporting; + this._formatting = WorkbookFormattingEnvUtil_1.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(extensionEnvironment.workbookFormatting); + this._language = extensionEnvironment.extensionLanguage; + this._country = extensionEnvironment.extensionCountry; + this._locale = extensionEnvironment.extensionLocale; + this._workbookLocale = extensionEnvironment.workbookLocale; + this._mode = api_shared_js_1.InternalToExternalEnumMappings.extensionMode.convert(extensionEnvironment.extensionMode); + this._operatingSystem = extensionEnvironment.operatingSystem; + this._tableauVersion = extensionEnvironment.tableauVersion; + this._uniqueUserId = extensionEnvironment.uniqueUserId; + this._exportedMediaType = extensionEnvironment.exportedMediaType + ? api_shared_js_1.InternalToExternalEnumMappings.exportedMediaType.convert(extensionEnvironment.exportedMediaType) + : undefined; + // 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; + } } - - if (clockseq == null) { - // Per 4.2.2, randomize (14 bit) clockseq - clockseq = _clockseq = (seedBytes[6] << 8 | seedBytes[7]) & 0x3fff; + 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 workbookLocale() { + return this._workbookLocale; + } + get mode() { + return this._mode; + } + get operatingSystem() { + return this._operatingSystem; + } + get tableauVersion() { + return this._tableauVersion; + } + get uniqueUserId() { + return this._uniqueUserId; + } + get isExporting() { + return this._isExporting; + } + get exportedMediaType() { + return this._exportedMediaType; } - } // 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); } +exports.Environment = Environment; -/* 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__) => { +/***/ "./lib/src/ExtensionsApi/Namespaces/Extensions.js": +/*!********************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/Extensions.js ***! + \********************************************************/ +/***/ ((__unused_webpack_module, exports) => { "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"); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Extensions = void 0; +/** + * 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); + } + reportExtensionRenderComplete(mediaBlob) { + return this.extensionImpl.reportExtensionRenderComplete(mediaBlob); + } +} +exports.Extensions = Extensions; -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__) => { +/***/ "./lib/src/ExtensionsApi/Namespaces/Settings.js": +/*!******************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/Settings.js ***! + \******************************************************/ +/***/ ((__unused_webpack_module, 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"); - +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.Settings = void 0; +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; -function stringToBytes(str) { - str = unescape(encodeURIComponent(str)); // UTF8 escape - var bytes = []; +/***/ }), - for (var i = 0; i < str.length; ++i) { - bytes.push(str.charCodeAt(i)); - } +/***/ "./lib/src/ExtensionsApi/Namespaces/UI.js": +/*!************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/UI.js ***! + \************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - return bytes; -} +"use strict"; -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); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.UI = void 0; +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)); } - - if (typeof namespace === 'string') { - namespace = (0,_parse_js__WEBPACK_IMPORTED_MODULE_0__["default"])(namespace); + displayDialogAsync(url, payload, options) { + return this._impl.displayDialogAsync(url, payload, options); } - - 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])` + sendDialogMessageAsync(message, targetDialogUrl) { + return this._impl.sendDialogMessageAsync(message, targetDialogUrl); + } + sendDialogMessageToParentAsync(message) { + return this._impl.sendDialogMessageToParentAsync(message); + } + closeDialog(payload, dialogUrl) { + this._impl.closeDialog(payload, dialogUrl); + } +} +exports.UI = UI; - 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; +/***/ "./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js": +/*!***********************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/WorkbookFormattingEnvUtil.js ***! + \***********************************************************************/ +/***/ ((__unused_webpack_module, exports, __webpack_require__) => { - for (var i = 0; i < 16; ++i) { - buf[offset + i] = bytes[i]; - } +"use strict"; - return buf; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.WorkbookFormattingEnvUtil = void 0; +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" /* ClassNameKey.RowDividers */ || classNameKey === "tableau-column-dividers" /* ClassNameKey.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, + }; +} - 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 +/***/ "./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js": +/*!**************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Namespaces/WorksheetContent.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, exports) => { +"use strict"; - generateUUID.DNS = DNS; - generateUUID.URL = URL; - return generateUUID; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.WorksheetContent = void 0; +/** + * 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; + /***/ }), -/***/ "../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__) => { +/***/ "./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js": +/*!**************************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/Impl/InitializationServiceImpl.js ***! + \**************************************************************************/ +/***/ ((__unused_webpack_module, 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]; +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.InitializationServiceImpl = void 0; +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" /* ExtensionsServiceNames.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; + }); } - - return buf; - } - - return (0,_stringify_js__WEBPACK_IMPORTED_MODULE_1__["default"])(rnds); } +exports.InitializationServiceImpl = InitializationServiceImpl; -/* 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__) => { +/***/ "./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js": +/*!********************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/Impl/SettingsServiceImpl.js ***! + \********************************************************************/ +/***/ ((__unused_webpack_module, 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"); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.SettingsServiceImpl = void 0; +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" /* ExtensionsServiceNames.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; -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__) => { +/***/ "./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js": +/*!**************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/Impl/UIServiceImpl.js ***! + \**************************************************************/ +/***/ ((__unused_webpack_module, 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); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.UIServiceImpl = void 0; +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" /* ExtensionsServiceNames.UIService */; + } + displayDialogAsync(url, payload, isExtensionDialog, 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, + }; + // The dialog url source refers to who is opening a new dialog (i.e. the dialog's parent). + // If the host extension is opening a dialog we leave the source url as undefined to help us differentiate from other dialogs. + if (isExtensionDialog) { + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogUrlSource] = window.location.href; + } + 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, dialogUrl) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'closeDialog', + [api_internal_contract_js_1.ParameterId.ExtensionDialogUrlSource]: window.location.href, + }; + if (payload) { + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogPayload] = payload; + } + if (dialogUrl) { + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = dialogUrl; + } + 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, + [api_internal_contract_js_1.ParameterId.ExtensionDialogUrlSource]: window.location.href, + }; + if (targetDialogUrl) { + parameters[api_internal_contract_js_1.ParameterId.ExtensionDialogUrl] = targetDialogUrl; + } + return this.execute(api_internal_contract_js_1.VerbId.SendDialogMessage, parameters).then(() => { + return; + }); + } + sendDialogMessageToParentAsync(message) { + const parameters = { + [api_internal_contract_js_1.ParameterId.FunctionName]: 'sendMessageToParent', + [api_internal_contract_js_1.ParameterId.ExtensionDialogMessage]: message, + [api_internal_contract_js_1.ParameterId.ExtensionDialogUrlSource]: window.location.href, + }; + return this.execute(api_internal_contract_js_1.VerbId.SendMessageToParent, 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; -/* 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__) => { +/***/ "./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js": +/*!*************************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/RegisterAllExtensionsServices.js ***! + \*************************************************************************/ +/***/ ((__unused_webpack_module, 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); +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.registerAllExtensionsServices = registerAllExtensionsServices; +exports.registerInitializationExtensionsServices = registerInitializationExtensionsServices; +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)); +} +function registerInitializationExtensionsServices(dispatcher) { + api_shared_js_1.ApiServiceRegistry.get(ServiceRegistryUtil_1.ExtensionsRegistryId).registerService(new InitializationServiceImpl_1.InitializationServiceImpl(dispatcher, ServiceRegistryUtil_1.ExtensionsRegistryId)); } -/* 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) => { +/***/ "./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js": +/*!***************************************************************!*\ + !*** ./lib/src/ExtensionsApi/Services/ServiceRegistryUtil.js ***! + \***************************************************************/ +/***/ ((__unused_webpack_module, exports) => { "use strict"; -module.exports = /*#__PURE__*/JSON.parse('{"major":1,"minor":191,"fix":0}'); + +Object.defineProperty(exports, "__esModule", ({ value: true })); +exports.ExtensionsRegistryId = void 0; +exports.ExtensionsRegistryId = 0; + /***/ }) @@ -13145,7 +13859,7 @@ module.exports = /*#__PURE__*/JSON.parse('{"major":1,"minor":191,"fix":0}'); /******/ /************************************************************************/ var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be in strict mode. +// This entry needs to be wrapped in an IIFE because it needs to be in strict mode. (() => { "use strict"; var exports = __webpack_exports__; @@ -13159,6 +13873,7 @@ 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 })); +exports.ZoneVisibilityType = exports.VizImageSortDirectionType = exports.VizImageSizeSettingType = exports.VizImageSizeSettingAlignmentType = exports.VizImagePaletteType = exports.VizImageEncodingType = exports.TrendLineModelType = exports.TableauEventType = exports.SortDirection = exports.SheetType = exports.SelectOptions = exports.SelectionUpdateType = exports.ReplaySpeedType = exports.QuickTableCalcType = exports.PeriodType = exports.ParameterValueType = exports.MarkType = exports.IncludeDataValuesOption = exports.HierarchicalLevelSelectionState = exports.FilterUpdateType = exports.FilterType = exports.FilterNullOption = exports.FilterDomainType = exports.FieldRoleType = exports.FieldAggregationType = exports.ExtensionMode = exports.ExtensionContext = exports.ExportedMediaType = exports.ErrorCodes = exports.EncodingType = exports.DialogStyle = exports.DateRangeType = exports.DataType = exports.DashboardObjectVisibilityType = exports.DashboardObjectType = exports.DashboardLayoutChange = exports.ColumnType = exports.ClassNameKey = exports.AnnotationType = exports.AnalyticsObjectType = exports.extensions = void 0; 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 @@ -13166,55 +13881,56 @@ const api_shared_js_1 = __webpack_require__(/*! @tableau/api-shared-js */ "../ap 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.16.0-pre.5" : 0, isAlpha); +api_shared_js_1.ApiVersion.SetVersionNumber( true ? "1.17.0-pre.8" : 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; +Object.defineProperty(exports, "AnalyticsObjectType", ({ enumerable: true, get: function () { return api_external_contract_js_1.AnalyticsObjectType; } })); +Object.defineProperty(exports, "AnnotationType", ({ enumerable: true, get: function () { return api_external_contract_js_1.AnnotationType; } })); +Object.defineProperty(exports, "ClassNameKey", ({ enumerable: true, get: function () { return api_external_contract_js_1.ClassNameKey; } })); +Object.defineProperty(exports, "ColumnType", ({ enumerable: true, get: function () { return api_external_contract_js_1.ColumnType; } })); +Object.defineProperty(exports, "DashboardLayoutChange", ({ enumerable: true, get: function () { return api_external_contract_js_1.DashboardLayoutChange; } })); +Object.defineProperty(exports, "DashboardObjectType", ({ enumerable: true, get: function () { return api_external_contract_js_1.DashboardObjectType; } })); +Object.defineProperty(exports, "DashboardObjectVisibilityType", ({ enumerable: true, get: function () { return api_external_contract_js_1.DashboardObjectVisibilityType; } })); +Object.defineProperty(exports, "DataType", ({ enumerable: true, get: function () { return api_external_contract_js_1.DataType; } })); +Object.defineProperty(exports, "DateRangeType", ({ enumerable: true, get: function () { return api_external_contract_js_1.DateRangeType; } })); +Object.defineProperty(exports, "DialogStyle", ({ enumerable: true, get: function () { return api_external_contract_js_1.DialogStyle; } })); +Object.defineProperty(exports, "EncodingType", ({ enumerable: true, get: function () { return api_external_contract_js_1.EncodingType; } })); +Object.defineProperty(exports, "ErrorCodes", ({ enumerable: true, get: function () { return api_external_contract_js_1.ErrorCodes; } })); +Object.defineProperty(exports, "ExportedMediaType", ({ enumerable: true, get: function () { return api_external_contract_js_1.ExportedMediaType; } })); +Object.defineProperty(exports, "ExtensionContext", ({ enumerable: true, get: function () { return api_external_contract_js_1.ExtensionContext; } })); +Object.defineProperty(exports, "ExtensionMode", ({ enumerable: true, get: function () { return api_external_contract_js_1.ExtensionMode; } })); +Object.defineProperty(exports, "FieldAggregationType", ({ enumerable: true, get: function () { return api_external_contract_js_1.FieldAggregationType; } })); +Object.defineProperty(exports, "FieldRoleType", ({ enumerable: true, get: function () { return api_external_contract_js_1.FieldRoleType; } })); +Object.defineProperty(exports, "FilterDomainType", ({ enumerable: true, get: function () { return api_external_contract_js_1.FilterDomainType; } })); +Object.defineProperty(exports, "FilterNullOption", ({ enumerable: true, get: function () { return api_external_contract_js_1.FilterNullOption; } })); +Object.defineProperty(exports, "FilterType", ({ enumerable: true, get: function () { return api_external_contract_js_1.FilterType; } })); +Object.defineProperty(exports, "FilterUpdateType", ({ enumerable: true, get: function () { return api_external_contract_js_1.FilterUpdateType; } })); +Object.defineProperty(exports, "HierarchicalLevelSelectionState", ({ enumerable: true, get: function () { return api_external_contract_js_1.HierarchicalLevelSelectionState; } })); +Object.defineProperty(exports, "IncludeDataValuesOption", ({ enumerable: true, get: function () { return api_external_contract_js_1.IncludeDataValuesOption; } })); +Object.defineProperty(exports, "MarkType", ({ enumerable: true, get: function () { return api_external_contract_js_1.MarkType; } })); +Object.defineProperty(exports, "ParameterValueType", ({ enumerable: true, get: function () { return api_external_contract_js_1.ParameterValueType; } })); +Object.defineProperty(exports, "PeriodType", ({ enumerable: true, get: function () { return api_external_contract_js_1.PeriodType; } })); +Object.defineProperty(exports, "QuickTableCalcType", ({ enumerable: true, get: function () { return api_external_contract_js_1.QuickTableCalcType; } })); +Object.defineProperty(exports, "ReplaySpeedType", ({ enumerable: true, get: function () { return api_external_contract_js_1.ReplaySpeedType; } })); +Object.defineProperty(exports, "SelectionUpdateType", ({ enumerable: true, get: function () { return api_external_contract_js_1.SelectionUpdateType; } })); +Object.defineProperty(exports, "SelectOptions", ({ enumerable: true, get: function () { return api_external_contract_js_1.SelectOptions; } })); +Object.defineProperty(exports, "SheetType", ({ enumerable: true, get: function () { return api_external_contract_js_1.SheetType; } })); +Object.defineProperty(exports, "SortDirection", ({ enumerable: true, get: function () { return api_external_contract_js_1.SortDirection; } })); +Object.defineProperty(exports, "TableauEventType", ({ enumerable: true, get: function () { return api_external_contract_js_1.TableauEventType; } })); +Object.defineProperty(exports, "TrendLineModelType", ({ enumerable: true, get: function () { return api_external_contract_js_1.TrendLineModelType; } })); +Object.defineProperty(exports, "VizImageEncodingType", ({ enumerable: true, get: function () { return api_external_contract_js_1.VizImageEncodingType; } })); +Object.defineProperty(exports, "VizImagePaletteType", ({ enumerable: true, get: function () { return api_external_contract_js_1.VizImagePaletteType; } })); +Object.defineProperty(exports, "VizImageSizeSettingAlignmentType", ({ enumerable: true, get: function () { return api_external_contract_js_1.VizImageSizeSettingAlignmentType; } })); +Object.defineProperty(exports, "VizImageSizeSettingType", ({ enumerable: true, get: function () { return api_external_contract_js_1.VizImageSizeSettingType; } })); +Object.defineProperty(exports, "VizImageSortDirectionType", ({ enumerable: true, get: function () { return api_external_contract_js_1.VizImageSortDirectionType; } })); +Object.defineProperty(exports, "ZoneVisibilityType", ({ enumerable: true, get: function () { return api_external_contract_js_1.ZoneVisibilityType; } })); })(); window.tableau = __webpack_exports__; /******/ })() ; -//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QTRCLENBQUMsR0FBRztJQUNwRSxDQUFDLCtDQUE0QixDQUFDLEdBQUcsQ0FBQyxFQUFFLCtDQUE0QixDQUFDLEdBQUc7SUFDcEUsQ0FBQywrQ0FBNEIsQ0FBQyxJQUFJLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxJQUFJO0lBQ3RFLENBQUMsK0NBQTRCLENBQUMsS0FBSyxDQUFDLEVBQUUsK0NBQTRCLENBQUMsS0FBSztJQUN4RSxDQUFDLCtDQUE0QixDQUFDLFFBQVEsQ0FBQyxFQUFFLCtDQUE0QixDQUFDLFFBQVE7SUFDOUUsQ0FBQywrQ0FBNEIsQ0FBQyxHQUFHLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxHQUFHO0lBQ3BFLENBQUMsK0NBQTRCLENBQUMsR0FBRyxDQUFDLEVBQUUsK0NBQTRCLENBQUMsR0FBRztJQUNwRSxDQUFDLCtDQUE0QixDQUFDLE1BQU0sQ0FBQyxFQUFFLCtDQUE0QixDQUFDLE1BQU07SUFDMUUsQ0FBQywrQ0FBNEIsQ0FBQyxHQUFHLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxHQUFHO0lBQ3BFLENBQUMsK0NBQTRCLENBQUMsTUFBTSxDQUFDLEVBQUUsK0NBQTRCLENBQUMsTUFBTTtJQUMxRSxDQUFDLCtDQUE0QixDQUFDLFNBQVMsQ0FBQyxFQUFFLCtDQUE0QixDQUFDLFNBQVM7SUFDaEYsQ0FBQywrQ0FBNEIsQ0FBQyxJQUFJLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxJQUFJO0lBQ3RFLENBQUMsK0NBQTRCLENBQUMsR0FBRyxDQUFDLEVBQUUsK0NBQTRCLENBQUMsR0FBRztJQUNwRSxDQUFDLCtDQUE0QixDQUFDLE1BQU0sQ0FBQyxFQUFFLCtDQUE0QixDQUFDLE1BQU07SUFDMUUsQ0FBQywrQ0FBNEIsQ0FBQyxNQUFNLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxNQUFNO0lBQzFFLENBQUMsK0NBQTRCLENBQUMsTUFBTSxDQUFDLEVBQUUsK0NBQTRCLENBQUMsTUFBTTtJQUMxRSxDQUFDLCtDQUE0QixDQUFDLFFBQVEsQ0FBQyxFQUFFLCtDQUE0QixDQUFDLFFBQVE7SUFDOUUs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LENBQUMsQ0FBQztBQUV4RCxlQUFlO0FBQ2YsK0VBQStFO0FBQy9FLHlKQXlDMkM7QUF4Q3pDLDRFQUFtQjtBQUNuQixrRUFBYztBQUNkLDhEQUFZO0FBQ1osMERBQVU7QUFDVixnRkFBcUI7QUFDckIsNEVBQW1CO0FBQ25CLGdHQUE2QjtBQUM3QixzREFBUTtBQUNSLGdFQUFhO0FBQ2IsNERBQVc7QUFDWCw4REFBWTtBQUNaLDBEQUFVO0FBQ1Ysc0VBQWdCO0FBQ2hCLGdFQUFhO0FBQ2IsOEVBQW9CO0FBQ3BCLGdFQUFhO0FBQ2Isc0VBQWdCO0FBQ2hCLHNFQUFnQjtBQUNoQiwwREFBVTtBQUNWLHNFQUFnQjtBQUNoQixvR0FBK0I7QUFDL0Isb0ZBQXVCO0FBQ3ZCLHNEQUFRO0FBQ1IsMEVBQWtCO0FBQ2xCLDBEQUFVO0FBQ1YsMEVBQWtCO0FBRWxCLG9FQUFlO0FBQ2YsNEVBQW1CO0FBQ25CLGdFQUFhO0FBQ2Isd0RBQVM7QUFDVCxnRUFBYTtBQUNiLHNFQUFnQjtBQUNoQiwwRUFBa0I7QUFDbEIsOEVBQW9CO0FBQ3BCLDRFQUFtQjtBQUNuQixzR0FBZ0M7QUFDaEMsb0ZBQXVCO0FBQ3ZCLHdGQUF5QjtBQUN6QiwwRUFBa0IiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy9ndWlkL2d1aWQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9GaWx0ZXJDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9NYXJrc1NlbGVjdGVkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9QYXJhbWV0ZXJDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9TdW1tYXJ5RGF0YUNoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1RhYmxlYXVFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1RhYmxlYXVTaGVldEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvVGFibGVhdVdvcmtzaGVldEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9CZW50b25TYW5zRm9udE5hbWVDb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvQ29ubmVjdGVkU2VydmVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbldvcmtib29rSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9FeHRlbnNpb25zSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvU2V0dGluZ3NJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL1RhYmxlYXVCb29rRm9udE5hbWVDb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvVUlJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvRGFzaGJvYXJkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvRGFzaGJvYXJkT2JqZWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvUGFyYW1ldGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvU2hlZXQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9Xb3JrYm9vay50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1dvcmtzaGVldC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9EYXNoYm9hcmRDb250ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0Vudmlyb25tZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0V4dGVuc2lvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvU2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvVUkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9Xb3Jrc2hlZXRDb250ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9JbXBsL0luaXRpYWxpemF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvU2V0dGluZ3NTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvSW1wbC9VSVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9SZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRW1iZWRkaW5nQXBpRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZW5zaW9uc0FwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0Fza0RhdGFJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvUHVsc2VJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9WaXpJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9XZWJDb21wb25lbnRJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9UYWJsZWF1LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9TaGFyZWRBcGlFeHRlcm5hbENvbnRyYWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9Kc0FwaUludGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L0RhdGFUeXBlQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvTm90aWZpY2F0aW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvUGFyYW1ldGVycy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvVmVyYnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2ludGVyZmFjZS9Bc2tEYXRhSW50ZXJmYWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9pbnRlcmZhY2UvUHVsc2VJbnRlcmZhY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2ludGVyZmFjZS9WcWxJbnRlcmZhY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9Dcm9zc0ZyYW1lTWVzc2VuZ2VyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvbWVzc2FnaW5nL01lc3NhZ2VUeXBlQ2hlY2tzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VUeXBlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9JZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL1ZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL1ZlcnNpb25UcmFuc2xhdGlvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxWZXJzaW9uQ29udmVydGVyRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9BcGlWZXJzaW9uLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0Nvbm5lY3Rpb25TdW1tYXJ5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZUJvb3RzdHJhcC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVEaXNwYXRjaGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0RhdGFTb3VyY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0V2ZW50TGlzdGVuZXJNYW5hZ2VyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ZpZWxkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvQ3VzdG9tVmlld0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9EYXNoYm9hcmRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0RhdGFTb3VyY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvRmllbGRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvUGFyYW1ldGVySW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1NoZWV0SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1NoZWV0SW5mb0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TaW5nbGVFdmVudE1hbmFnZXJJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU3RvcnlJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU3RvcnlQb2ludEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TdG9yeVBvaW50SW5mb0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9Xb3JrYm9va0ltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9Xb3Jrc2hlZXRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0xvZ2ljYWxUYWJsZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Nb2RlbHMvQWNjZXNzaWJpbGl0eU1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Nb2RlbHMvRmlsdGVyTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9HZXREYXRhTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9HZXREYXRhVGFibGVSZWFkZXJNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL1NlbGVjdGlvbk1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Qb2ludC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9HZXREYXRhU2VydmljZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9SZWdpc3RlckFsbFNoYXJlZFNlcnZpY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0FjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0FuaW1hdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQW5ub3RhdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQ2xpZW50SW5mb1NlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvRGF0YVNvdXJjZVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvRXhwb3J0U2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9FeHRlcm5hbENvbnRleHRNZW51U2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9GaWx0ZXJTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0dldERhdGFTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvUGFyYW1ldGVyc1NlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU2VsZWN0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9TZXJ2aWNlSW1wbEJhc2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9TaXplU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9TdG9yeUFjdGl2YXRpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1Zpc3VhbE1vZGVsU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9WaXpTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1pvbmVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9UYWJsZVN1bW1hcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVGFibGVhdUVycm9yLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0RhdGFWYWx1ZUZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvRGVmZXJyZWQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvRW51bUNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9FcnJvckhlbHBlcnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvRXhwb3J0SGVscGVycy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9QYXJhbS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9TaGVldFV0aWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL1Nob3J0TGl2ZWREZWZlcnJlZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9WZXJzaW9uTnVtYmVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL2luZGV4LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL21kNS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9uaWwuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcGFyc2UuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcmVnZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcm5nLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3NoYTEuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3YxLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3YzLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3YzNS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92NC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92NS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92YWxpZGF0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92ZXJzaW9uLmpzIiwid2VicGFjazovL3RhYmxlYXUvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vdGFibGVhdS93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vdGFibGVhdS93ZWJwYWNrL3J1bnRpbWUvaGFzT3duUHJvcGVydHkgc2hvcnRoYW5kIiwid2VicGFjazovL3RhYmxlYXUvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHZhbGlkYXRvciA9IG5ldyBSZWdFeHAoXCJeW2EtejAtOV17OH0tW2EtejAtOV17NH0tW2EtejAtOV17NH0tW2EtejAtOV17NH0tW2EtejAtOV17MTJ9JFwiLCBcImlcIik7XG5cbiAgZnVuY3Rpb24gZ2VuKGNvdW50KSB7XG4gICAgdmFyIG91dCA9IFwiXCI7XG4gICAgZm9yICh2YXIgaT0wOyBpPGNvdW50OyBpKyspIHtcbiAgICAgIG91dCArPSAoKCgxK01hdGgucmFuZG9tKCkpKjB4MTAwMDApfDApLnRvU3RyaW5nKDE2KS5zdWJzdHJpbmcoMSk7XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBmdW5jdGlvbiBHdWlkKGd1aWQpIHtcbiAgICBpZiAoIWd1aWQpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGFyZ3VtZW50OyBgdmFsdWVgIGhhcyBubyB2YWx1ZS5cIik7XG4gICAgICBcbiAgICB0aGlzLnZhbHVlID0gR3VpZC5FTVBUWTtcbiAgICBcbiAgICBpZiAoZ3VpZCAmJiBndWlkIGluc3RhbmNlb2YgR3VpZCkge1xuICAgICAgdGhpcy52YWx1ZSA9IGd1aWQudG9TdHJpbmcoKTtcblxuICAgIH0gZWxzZSBpZiAoZ3VpZCAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZ3VpZCkgPT09IFwiW29iamVjdCBTdHJpbmddXCIgJiYgR3VpZC5pc0d1aWQoZ3VpZCkpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBndWlkO1xuICAgIH1cbiAgICBcbiAgICB0aGlzLmVxdWFscyA9IGZ1bmN0aW9uKG90aGVyKSB7XG4gICAgICAvLyBDb21wYXJpbmcgc3RyaW5nIGB2YWx1ZWAgYWdhaW5zdCBwcm92aWRlZCBgZ3VpZGAgd2lsbCBhdXRvLWNhbGxcbiAgICAgIC8vIHRvU3RyaW5nIG9uIGBndWlkYCBmb3IgY29tcGFyaXNvblxuICAgICAgcmV0dXJuIEd1aWQuaXNHdWlkKG90aGVyKSAmJiB0aGlzLnZhbHVlID09IG90aGVyO1xuICAgIH07XG5cbiAgICB0aGlzLmlzRW1wdHkgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlID09PSBHdWlkLkVNUFRZO1xuICAgIH07XG4gICAgXG4gICAgdGhpcy50b1N0cmluZyA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgICBcbiAgICB0aGlzLnRvSlNPTiA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHRoaXMudmFsdWU7XG4gICAgfTtcbiAgfTtcblxuICBHdWlkLkVNUFRZID0gXCIwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDBcIjtcblxuICBHdWlkLmlzR3VpZCA9IGZ1bmN0aW9uKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlICYmICh2YWx1ZSBpbnN0YW5jZW9mIEd1aWQgfHwgdmFsaWRhdG9yLnRlc3QodmFsdWUudG9TdHJpbmcoKSkpO1xuICB9O1xuXG4gIEd1aWQuY3JlYXRlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBHdWlkKFtnZW4oMiksIGdlbigxKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigzKV0uam9pbihcIi1cIikpO1xuICB9O1xuXG4gIEd1aWQucmF3ID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFtnZW4oMiksIGdlbigxKSwgZ2VuKDEpLCBnZW4oMSksIGdlbigzKV0uam9pbihcIi1cIik7XG4gIH07XG5cbiAgaWYodHlwZW9mIG1vZHVsZSAhPSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gR3VpZDtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnKSB7XG4gICAgd2luZG93Lkd1aWQgPSBHdWlkO1xuICB9XG59KSgpO1xuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudCB9IGZyb20gJy4vVGFibGVhdUV2ZW50JztcblxuZXhwb3J0IGNsYXNzIERhc2hib2FyZExheW91dENoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LkRhc2hib2FyZExheW91dENoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwdWJsaWMgX2Rhc2hib2FyZExheW91dENoYW5nZURldGFpbHM6IENvbnRyYWN0LkRhc2hib2FyZExheW91dENoYW5nZURldGFpbHMpIHtcbiAgICBzdXBlcihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLkRhc2hib2FyZExheW91dENoYW5nZWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzKCk6IENvbnRyYWN0LkRhc2hib2FyZExheW91dENoYW5nZURldGFpbHMge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXJyb3JDb2RlcywgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIEZpbHRlckNoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LkZpbHRlckNoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCwgcHJpdmF0ZSBfZmllbGROYW1lOiBzdHJpbmcsIHByaXZhdGUgX2ZpZWxkSWQ/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihUYWJsZWF1RXZlbnRUeXBlLkZpbHRlckNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJBc3luYygpOiBQcm9taXNlPENvbnRyYWN0LkZpbHRlcj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXQuZ2V0RmlsdGVyc0FzeW5jKCkudGhlbjxDb250cmFjdC5GaWx0ZXI+KChmaWx0ZXJzKSA9PiB7XG4gICAgICAvLyBUT0RPOiBGaWx0ZXJpbmcgb2YgdGhlIGZpbHRlcnMgc2hvdWxkIGV2ZW50dWFsbHkgYmUgZG9uZSBwbGF0Zm9ybSBzaWRlLlxuICAgICAgY29uc3QgZXZlbnRlZEZpbHRlciA9IHRoaXMuZmllbGRJZFxuICAgICAgICA/IGZpbHRlcnMuZmluZCgoZmlsdGVyKSA9PiBmaWx0ZXIuZmllbGRJZCA9PT0gdGhpcy5maWVsZElkLCB0aGlzKVxuICAgICAgICA6IGZpbHRlcnMuZmluZCgoZmlsdGVyKSA9PiBmaWx0ZXIuZmllbGROYW1lID09PSB0aGlzLmZpZWxkTmFtZSwgdGhpcyk7XG5cbiAgICAgIGlmICghZXZlbnRlZEZpbHRlcikge1xuICAgICAgICAvLyBXZSBzaG91bGRuJ3QgaGl0IHRoaXMgdW5sZXNzIHRoZSBmaWx0ZXIgd2FzIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0XG4gICAgICAgIC8vIGFmdGVyIHRoZSBldmVudCB3YXMgcmFpc2VkLlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuTWlzc2luZ0ZpbHRlciwgYGNhbm5vdCBmaW5kIGZpbHRlcjogJHt0aGlzLl9maWVsZE5hbWV9YCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBldmVudGVkRmlsdGVyO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVXb3Jrc2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBNYXJrc1NlbGVjdGVkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5NYXJrc1NlbGVjdGVkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3Iod29ya3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQpIHtcbiAgICBzdXBlcihUYWJsZWF1RXZlbnRUeXBlLk1hcmtTZWxlY3Rpb25DaGFuZ2VkLCB3b3Jrc2hlZXQpO1xuICB9XG5cbiAgcHVibGljIGdldE1hcmtzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy53b3Jrc2hlZXQuZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgUGFyYW1ldGVyc1NlcnZpY2UsIFNlcnZpY2VOYW1lcywgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXIgfSBmcm9tICcuLi9Nb2RlbHMvUGFyYW1ldGVyJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBUYWJsZWF1U2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVNoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVyQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVNoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5QYXJhbWV0ZXJDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZ2xvYmFsRmllbGROYW1lOiBzdHJpbmcsIHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuUGFyYW1ldGVyQ2hhbmdlZCwgc2hlZXQpO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmFtZXRlckFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuUGFyYW1ldGVyPiB7XG4gICAgLy8gQ2FsbCBkb3duIHRvIG91ciBzZXJ2aWNlIHRvIGdldCB0aGUgcGFyYW1ldGVyIGJhY2sgdmlhIGl0cyBmaWVsZCBuYW1lXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8UGFyYW1ldGVyc1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gc2VydmljZS5maW5kUGFyYW1ldGVyQnlHbG9iYWxGaWVsZE5hbWVBc3luYyh0aGlzLl9nbG9iYWxGaWVsZE5hbWUpLnRoZW4oKHBhcmFtZXRlckltcGwpID0+IHtcbiAgICAgIGlmIChwYXJhbWV0ZXJJbXBsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLk1pc3NpbmdQYXJhbWV0ZXIsIGBDYW5ub3QgZmluZCBwYXJhbWV0ZXI6ICR7dGhpcy5fZ2xvYmFsRmllbGROYW1lfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihwYXJhbWV0ZXJJbXBsLCB0aGlzLnNoZWV0KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5TdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuU3VtbWFyeURhdGFDaGFuZ2VkLCB3b3Jrc2hlZXQpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1RXZlbnQge1xuICBwcml2YXRlIF90eXBlOiBUYWJsZWF1RXZlbnRUeXBlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlKSB7XG4gICAgdGhpcy5fdHlwZSA9IHR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogVGFibGVhdUV2ZW50VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudCB9IGZyb20gJy4vVGFibGVhdUV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFRhYmxlYXVTaGVldEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVhdVNoZWV0RXZlbnQge1xuICBwcml2YXRlIF9zaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQ7XG5cbiAgcHVibGljIGdldCBzaGVldCgpOiBDb250cmFjdC5FeHRlbnNpb25TaGVldCB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0O1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCkge1xuICAgIHN1cGVyKHR5cGUpO1xuXG4gICAgdGhpcy5fc2hlZXQgPSBzaGVldDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdVNoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVTaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBleHRlbmRzIFRhYmxlYXVTaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVhdVdvcmtzaGVldEV2ZW50IHtcbiAgcHVibGljIGdldCB3b3Jrc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0O1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIHByb3RlY3RlZCBfd29ya3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQpIHtcbiAgICBzdXBlcih0eXBlLCBfd29ya3NoZWV0KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudCB9IGZyb20gJy4vVGFibGVhdUV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9mb3JtYXR0aW5nOiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcpIHtcbiAgICBzdXBlcihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLldvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0aW5nKCk6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1hdHRpbmc7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVXb3Jrc2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBXb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCwgcHJpdmF0ZSBfZm9ybWF0dGluZzogQ29udHJhY3QuV29ya3NoZWV0Rm9ybWF0dGluZykge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHRpbmcoKTogQ29udHJhY3QuV29ya3NoZWV0Rm9ybWF0dGluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1hdHRpbmc7XG4gIH1cbn1cbiIsImltcG9ydCB7IE1vZGVsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSA9ICdCZW50b24gU2Fucyc7XG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lID0gJ0JlbnRvbiBTYW5zIExvdy1EUEknO1xuXG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgQm9vayc7XG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc0Jvb2tJdGFsaWNGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgQm9vayBJdGFsaWMnO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNTZW1pRGVtaUZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBTZW1pRGVtaSc7XG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc1NlbWlEZW1pSXRhbGljRm9udEZhY2VOYW1lID0gJ0JlbnRvbiBTYW5zIFNlbWlEZW1pIEl0YWxpYyc7XG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc0xpZ2h0Rm9udEZhY2VOYW1lID0gJ0JlbnRvbiBTYW5zIExpZ2h0JztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lID0gJ0JlbnRvbiBTYW5zIE1lZGl1bSc7XG5cbmV4cG9ydCBjb25zdCBTdXBwb3J0ZWRCZW50b25TYW5zRm9udEZhY2VzOiBNb2RlbFtdID0gW1xuICBCZW50b25TYW5zQm9va0ZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc0Jvb2tJdGFsaWNGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNTZW1pRGVtaUZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc1NlbWlEZW1pSXRhbGljRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zTGlnaHRGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNNZWRpdW1Gb250RmFjZU5hbWUsXG5dO1xuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIENvbm5lY3RlZFNlcnZlciBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbm5lY3RlZFNlcnZlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgX3VzZXJJZD86IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3NpdGVJZD86IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3NpdGVOYW1lc3BhY2U/OiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF93b3JrYm9va0lkPzogc3RyaW5nLFxuICApIHt9XG5cbiAgcHVibGljIGdldCB1c2VySWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdXNlcklkO1xuICB9XG5cbiAgcHVibGljIGdldCBzaXRlSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2l0ZUlkO1xuICB9XG5cbiAgcHVibGljIGdldCBzaXRlTmFtZXNwYWNlKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NpdGVOYW1lc3BhY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtib29rSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fd29ya2Jvb2tJZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFTY2hlbWEsIERhdGFTb3VyY2UgYXMgRGF0YVNvdXJjZUluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBEYXRhU291cmNlLCBEYXRhU291cmNlSW1wbCwgRGF0YVNvdXJjZVNlcnZpY2UsIFNlcnZpY2VOYW1lcywgV29ya2Jvb2tJbXBsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIGV4dGVuZHMgV29ya2Jvb2tJbXBsIHtcbiAgcHVibGljIGdldEFsbERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpLnRoZW48QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+KChyZXN1bHQpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFTY2hlbWE6IERhdGFTY2hlbWEgPSByZXN1bHQ7XG4gICAgICBjb25zdCBkYXRhU291cmNlczogQXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4gPSBbXTtcblxuICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCBkYXRhIHNvdXJjZXMgYW5kIGFkZCB0aGVtLlxuICAgICAgT2JqZWN0LnZhbHVlcyhkYXRhU2NoZW1hLmRhdGFTb3VyY2VzKS5mb3JFYWNoKChkcykgPT4ge1xuICAgICAgICBkYXRhU291cmNlcy5wdXNoKHRoaXMuY3JlYXRlRGF0YVNvdXJjZUZyb21JbmZvKGRzKSk7XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGRhdGFTb3VyY2VzO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZGF0YVNvdXJjZUluZm86IERhdGFTb3VyY2VJbmZvKTogRGF0YVNvdXJjZSB7XG4gICAgY29uc3QgZGF0YVNvdXJjZUltcGwgPSBuZXcgRGF0YVNvdXJjZUltcGwoZGF0YVNvdXJjZUluZm8sIEV4dGVuc2lvbnNSZWdpc3RyeUlkKTtcbiAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERhdGFTb3VyY2UoZGF0YVNvdXJjZUltcGwpO1xuICAgIGRhdGFTb3VyY2VJbXBsLmluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcyhkYXRhU291cmNlKTtcbiAgICByZXR1cm4gZGF0YVNvdXJjZTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcywgU2hlZXRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIENvbnRleHRNZW51RXZlbnQsXG4gIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3IsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeHRlbnNpb25EYXNoYm9hcmRJbmZvLFxuICBFeHRlbnNpb25Mb2NhdG9yLFxuICBFeHRlbnNpb25TZXR0aW5nc0luZm8sXG4gIEV4dGVuc2lvbldvcmtzaGVldEluZm8sXG4gIEZvbnROYW1lQW5kSW5mbyxcbiAgRm9ybWF0dGluZ1NoZWV0LFxuICBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLFxuICBJbml0aWFsaXphdGlvbk9wdGlvbnMsXG4gIEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSxcbiAgTW9kZWwsXG4gIE5vdGlmaWNhdGlvbklkLFxuICBQYXJhbWV0ZXJJZCxcbiAgU2hlZXRQYXRoLFxuICBWZXJiSWQsXG4gIFdvcmtib29rRm9ybWF0dGluZyxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgQXBpVmVyc2lvbixcbiAgRGFzaGJvYXJkSW1wbCxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaGVldEluZm9JbXBsLFxuICBUYWJsZWF1RXJyb3IsXG4gIFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgVml6U2VydmljZSxcbiAgV29ya3NoZWV0SW1wbCxcbiAgZG9Dcm9zc0ZyYW1lQm9vdHN0cmFwLFxuICByZWdpc3RlckFsbFNoYXJlZFNlcnZpY2VzLFxufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IERhc2hib2FyZCB9IGZyb20gJy4uL01vZGVscy9EYXNoYm9hcmQnO1xuaW1wb3J0IHsgV29ya2Jvb2sgfSBmcm9tICcuLi9Nb2RlbHMvV29ya2Jvb2snO1xuaW1wb3J0IHsgV29ya3NoZWV0IH0gZnJvbSAnLi4vTW9kZWxzL1dvcmtzaGVldCc7XG5pbXBvcnQgeyBEYXNoYm9hcmRDb250ZW50IH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9EYXNoYm9hcmRDb250ZW50JztcbmltcG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9FbnZpcm9ubWVudCc7XG5pbXBvcnQgeyBTZXR0aW5ncyB9IGZyb20gJy4uL05hbWVzcGFjZXMvU2V0dGluZ3MnO1xuaW1wb3J0IHsgVUkgfSBmcm9tICcuLi9OYW1lc3BhY2VzL1VJJztcbmltcG9ydCB7IFdvcmtib29rRm9ybWF0dGluZ0VudlV0aWwgfSBmcm9tICcuLi9OYW1lc3BhY2VzL1dvcmtib29rRm9ybWF0dGluZ0VudlV0aWwnO1xuaW1wb3J0IHsgV29ya3NoZWV0Q29udGVudCB9IGZyb20gJy4uL05hbWVzcGFjZXMvV29ya3NoZWV0Q29udGVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9Jbml0aWFsaXphdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgcmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMsIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9SZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvVUlTZXJ2aWNlJztcbmltcG9ydCB7XG4gIEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lLFxuICBCZW50b25TYW5zTGlnaHRGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNMb3dEUElGb250RmFtaWx5TmFtZSxcbiAgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUsXG4gIFN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXMsXG59IGZyb20gJy4vQmVudG9uU2Fuc0ZvbnROYW1lQ29uc3RhbnRzJztcbmltcG9ydCB7IEV4dGVuc2lvbldvcmtib29rSW1wbCB9IGZyb20gJy4vRXh0ZW5zaW9uV29ya2Jvb2tJbXBsJztcbmltcG9ydCB7IExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlciB9IGZyb20gJy4vTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyJztcbmltcG9ydCB7IFNldHRpbmdzSW1wbCB9IGZyb20gJy4vU2V0dGluZ3NJbXBsJztcbmltcG9ydCB7XG4gIFN1cHBvcnRlZFRhYmxlYXVGb250RmFjZXMsXG4gIFRhYmxlYXVCb2xkRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1Qm9va0ZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdUJvb2tGb250RmFtaWx5TmFtZSxcbiAgVGFibGVhdUxpZ2h0Rm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TGlnaHRGb250RmFtaWx5TmFtZSxcbiAgVGFibGVhdU1lZGl1bUZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdU1lZGl1bUZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdVJlZ3VsYXJGb250RmFtaWx5TmFtZSxcbiAgVGFibGVhdVNlbWlCb2xkRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1U2VtaWJvbGRGb250RmFtaWx5TmFtZSxcbn0gZnJvbSAnLi9UYWJsZWF1Qm9va0ZvbnROYW1lQ29uc3RhbnRzJztcbmltcG9ydCB7IFVJSW1wbCB9IGZyb20gJy4vVUlJbXBsJztcblxuZXhwb3J0IHR5cGUgQ2FsbGJhY2tNYXAgPSB7IFtrZXk6IHN0cmluZ106ICgpID0+IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH07XG5cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25zSW1wbCB7XG4gIHByaXZhdGUgX2luaXRpYWxpemF0aW9uUHJvbWlzZTogUHJvbWlzZTxzdHJpbmc+O1xuICBwcml2YXRlIF9zdHlsZUVsZW1lbnQ6IEhUTUxTdHlsZUVsZW1lbnQ7XG4gIHB1YmxpYyBkYXNoYm9hcmRDb250ZW50PzogRGFzaGJvYXJkQ29udGVudDtcbiAgcHVibGljIHdvcmtzaGVldENvbnRlbnQ/OiBXb3Jrc2hlZXRDb250ZW50O1xuICBwdWJsaWMgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50O1xuICBwdWJsaWMgc2V0dGluZ3M6IFNldHRpbmdzO1xuICBwdWJsaWMgdWk6IFVJO1xuICBwdWJsaWMgd29ya2Jvb2s6IFdvcmtib29rO1xuICBwdWJsaWMgZXh0ZW5zaW9uWm9uZUlkOiBudW1iZXI7XG5cbiAgcHVibGljIGluaXRpYWxpemVBc3luYyhpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbiwgY29udGV4dE1lbnVDYWxsYmFja3M/OiBDYWxsYmFja01hcCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgaWYgKCF0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2UpIHtcbiAgICAgIHRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSA9IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBpbml0T3B0aW9uczogSW5pdGlhbGl6YXRpb25PcHRpb25zID0geyBpc0FscGhhOiBBcGlWZXJzaW9uLkluc3RhbmNlLmlzQWxwaGEsIGlzRXh0ZW5zaW9uRGlhbG9nOiBpc0V4dGVuc2lvbkRpYWxvZyB9O1xuICAgICAgICAvLyBGaXJzdCB0aGluZyB3ZSB3YW50IHRvIGRvIGlzIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIGRlc2t0b3AgZGlzcGF0Y2hlciBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHVzXG4gICAgICAgIGlmIChMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIuaGFzRGVza3RvcEFwaURpc3BhdGNoZXJQcm9taXNlKGluaXRPcHRpb25zKSkge1xuICAgICAgICAgIC8vIFJ1bm5pbmcgaW4gYSBwcmUtMjAxOS4zIGRlc2t0b3AsIHVzZSBvdXIgbGVnYWN5IGRpc3BhdGNoZXIgcHJvbWlzZVxuICAgICAgICAgIGNvbnN0IGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZSA9IExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlci5nZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2UoaW5pdE9wdGlvbnMpO1xuICAgICAgICAgIGRlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZVxuICAgICAgICAgICAgPy50aGVuKChkaXNwYXRjaGVyRmFjdG9yeSkgPT4gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZChkaXNwYXRjaGVyRmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKSlcbiAgICAgICAgICAgIC50aGVuKChvcGVuUGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKG9wZW5QYXlsb2FkKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBXZSBtdXN0IGJlIHJ1bm5pbmcgaW4gc2VydmVyLCBzbyB3ZSBzaG91bGQgdHJ5IHRvIGtpY2sgb2YgdGhlIHNlcnZlciBkaXNwYXRjaGVyIGJvb3RzdHJhcHBpbmdcbiAgICAgICAgICBjb25zdCBvbkRpc3BhdGNoZXJSZWNlaXZlZENhbGxiYWNrID0gdGhpcy5vbkRpc3BhdGNoZXJSZWNlaXZlZC5iaW5kKHRoaXMpO1xuICAgICAgICAgIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcCh3aW5kb3csIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIGluaXRPcHRpb25zKVxuICAgICAgICAgICAgLnRoZW4oKGZhY3Rvcnk6IEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3RvcnkpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9uRGlzcGF0Y2hlclJlY2VpdmVkQ2FsbGJhY2soZmFjdG9yeSwgaXNFeHRlbnNpb25EaWFsb2csIGNvbnRleHRNZW51Q2FsbGJhY2tzKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbigob3BlblBheWxvYWQpID0+IHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShvcGVuUGF5bG9hZCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICByZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLl9pbml0aWFsaXphdGlvblByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVml6SW1hZ2VBc3luYyhpbnB1dFNwZWM6IG9iamVjdCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3Qgdml6U2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Vml6U2VydmljZT4oU2VydmljZU5hbWVzLlZpeik7XG5cbiAgICByZXR1cm4gdml6U2VydmljZS5jcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYyk7XG4gIH1cblxuICBwdWJsaWMgc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZDogYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG5cbiAgICByZXR1cm4gdWlTZXJ2aWNlLnNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQsIHRoaXMuZXh0ZW5zaW9uWm9uZUlkKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yKGxvY2F0b3I6IEV4dGVuc2lvbkxvY2F0b3IpOiBsb2NhdG9yIGlzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3Ige1xuICAgIGNvbnN0IGRhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3IgPSBsb2NhdG9yIGFzIERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3I7XG4gICAgaWYgKCFkYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yLmRhc2hib2FyZFBhdGgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnVW5leHBlY3RlZCBlcnJvciBkdXJpbmcgaW5pdGlhbGl6YXRpb24uJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcHJpdmF0ZSBvbkRpc3BhdGNoZXJSZWNlaXZlZChcbiAgICBkaXNwYXRjaGVyRmFjdG9yeTogSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSxcbiAgICBpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbixcbiAgICBjb250ZXh0TWVudUZ1bmN0aW9ucz86IENhbGxiYWNrTWFwLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGxldCBkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIgPSBkaXNwYXRjaGVyRmFjdG9yeShJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcblxuICAgIC8vIENhbGwgdG8gcmVnaXN0ZXIgYWxsIHRoZSBzZXJ2aWNlcyB3aGljaCB3aWxsIHVzZSB0aGUgbmV3bHkgaW5pdGlhbGl6ZWQgZGlzcGF0Y2hlclxuICAgIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAvLyBHZXQgdGhlIGluaXRpYWxpemF0aW9uIHNlcnZpY2UgYW5kIGluaXRpYWxpemUgdGhpcyBleHRlbnNpb25cbiAgICBjb25zdCBpbml0aWFsaXphdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEluaXRpYWxpemF0aW9uU2VydmljZT4oXG4gICAgICBFeHRlbnNpb25zU2VydmljZU5hbWVzLkluaXRpYWxpemF0aW9uU2VydmljZSxcbiAgICApO1xuXG4gICAgY29uc3QgY2FsbGJhY2tNYXBLZXlzID0gY29udGV4dE1lbnVGdW5jdGlvbnMgPyBPYmplY3Qua2V5cyhjb250ZXh0TWVudUZ1bmN0aW9ucykgOiBbXTtcbiAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25TZXJ2aWNlLmluaXRpYWxpemVEYXNoYm9hcmRFeHRlbnNpb25zQXN5bmMoaXNFeHRlbnNpb25EaWFsb2csIGNhbGxiYWNrTWFwS2V5cykudGhlbjxzdHJpbmc+KChyZXN1bHQpID0+IHtcbiAgICAgIC8vIElmIHdlIHJlY2VpdmUgYW4gaW52YWxpZCBwbGFmb3JtIHZlcnNpb24sIHRoaXMgbWVhbnMgdGhhdCBwbGF0Zm9ybSBpcyBydW5ubmluZyAxLjQgb3IgMi4xIGFuZFxuICAgICAgLy8gZG9lc24ndCBwYXNzIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGV4dGVybmFsLiBJbiB0aGlzIGNhc2Ugd2UgYXNzdW1lIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uIHRvIGJlIDEuOVxuICAgICAgY29uc3QgcGxhdGZvcm1WZXJzaW9uID0gcmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50LnBsYXRmb3JtVmVyc2lvblxuICAgICAgICA/IHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC5wbGF0Zm9ybVZlcnNpb25cbiAgICAgICAgOiB7IG1ham9yOiAxLCBtaW5vcjogOSwgZml4OiAwIH07XG5cbiAgICAgIC8vIFdyYXAgb3VyIGV4aXN0aW5nIGRpc3BhdGNoZXIgaW4gYSBkaXNwYXRjaGVyIHRoYXQgY2FuIGRvd25ncmFkZS91cGdyYWRlIGZvciBhbiBvbGRlciBwbGF0Zm9ybS5cbiAgICAgIGlmIChWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIubmVlZHNWZXJzaW9uQ29udmVydGVyKHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICAgICAgZGlzcGF0Y2hlciA9IG5ldyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIoZGlzcGF0Y2hlciwgcGxhdGZvcm1WZXJzaW9uKTtcbiAgICAgIH1cbiAgICAgIC8vIFJlZ2lzdHJhdGlvbiBvZiBzZXJ2aWNlcyBtdXN0IGhhcHBlbiBiZWZvcmUgaW5pdGlhbGl6aW5nIGNvbnRlbnQgYW5kIGVudmlyb25tZW50XG4gICAgICAvLyBFeHRlbnNpb25zIGRvZXNuJ3QgbmVlZCB0byBwYXNzIGluIGEgcmVnaXN0cnlJZC4gQnkgZGVmYXVsdCwgdGhlIHNlcnZpY2UgcmVnaXN0cnkgaW5zdGFuY2UgaXMgYXNzb2NpYXRlZCB3aXRoIHJlZ2lzdHJ5SWQ9MC5cbiAgICAgIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMoZGlzcGF0Y2hlciwgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpO1xuICAgICAgcmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcik7XG5cbiAgICAgIGlmIChyZXN1bHQuZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyAmJiB0aGlzLmlzRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcihyZXN1bHQuZXh0ZW5zaW9uSW5zdGFuY2UubG9jYXRvcikpIHtcbiAgICAgICAgdGhpcy5kYXNoYm9hcmRDb250ZW50ID0gdGhpcy5pbml0aWFsaXplRGFzaGJvYXJkQ29udGVudChcbiAgICAgICAgICByZXN1bHQuZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyxcbiAgICAgICAgICByZXN1bHQuZXh0ZW5zaW9uSW5zdGFuY2UubG9jYXRvci5kYXNoYm9hcmRQYXRoLFxuICAgICAgICApO1xuICAgICAgICB0aGlzLmV4dGVuc2lvblpvbmVJZCA9IHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvLmV4dGVuc2lvblpvbmVJZDtcbiAgICAgIH1cblxuICAgICAgaWYgKHJlc3VsdC5leHRlbnNpb25Xb3Jrc2hlZXRJbmZvKSB7XG4gICAgICAgIHRoaXMud29ya3NoZWV0Q29udGVudCA9IHRoaXMuaW5pdGlhbGl6ZVdvcmtzaGVldENvbnRlbnQocmVzdWx0LmV4dGVuc2lvbldvcmtzaGVldEluZm8pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmVudmlyb25tZW50ID0gbmV3IEVudmlyb25tZW50KHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudCk7XG4gICAgICB0aGlzLnNldHRpbmdzID0gdGhpcy5pbml0aWFsaXplU2V0dGluZ3MocmVzdWx0LmV4dGVuc2lvblNldHRpbmdzSW5mbyk7XG4gICAgICB0aGlzLnVpID0gbmV3IFVJKG5ldyBVSUltcGwoaXNFeHRlbnNpb25EaWFsb2cpKTtcbiAgICAgIHRoaXMud29ya2Jvb2sgPSBuZXcgV29ya2Jvb2sobmV3IEV4dGVuc2lvbldvcmtib29rSW1wbCgpKTtcblxuICAgICAgaWYgKHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0Zvcm1hdHRpbmcpIHtcbiAgICAgICAgdGhpcy5pbml0aWFsaXplVGFibGVhdUZvbnRzKGRpc3BhdGNoZXIsIHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0Zvcm1hdHRpbmcpO1xuICAgICAgICB0aGlzLmFwcGx5QWxsRm9ybWF0dGluZyhyZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKTtcbiAgICAgIH1cblxuICAgICAgLy8gQWZ0ZXIgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZCwgc2V0dXAgbGlzdGVuZXJzIGZvciB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zIHRoYXRcbiAgICAgIC8vIGFyZSBtZWFudCB0byBiZSB0cmlnZ2VyZWQgd2hlbmV2ZXIgYSBjb250ZXh0IG1lbnUgaXRlbSBpcyBjbGlja2VkLlxuICAgICAgdGhpcy5pbml0aWFsaXplQ29udGV4dE1lbnVDYWxsYmFja3MoY29udGV4dE1lbnVGdW5jdGlvbnMpO1xuXG4gICAgICAvLyBBbHNvIHNldCB1cCBsaXN0ZW5lcnMgZm9yIEV4dGVuc2lvblN0eWxlc0NoYW5nZWRFdmVudFxuICAgICAgdGhpcy5pbml0aWFsaXplV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50Q2FsbGJhY2soZGlzcGF0Y2hlcik7XG5cbiAgICAgIC8vIEluIHRoZSBub3JtYWwgaW5pdGlhbGl6YXRpb24gY2FzZSwgdGhpcyB3aWxsIGJlIGFuIGVtcHR5IHN0cmluZy4gIFdoZW4gcmV0dXJuaW5nIGZyb20gaW5pdGlhbGl6ZUFzeW5jIHRvIHRoZVxuICAgICAgLy8gZGV2ZWxvcGVyLCB3ZSBqdXN0IGluZ29yZSB0aGF0IHN0cmluZy4gIEluIHRoZSBjYXNlIG9mIGluaXRpYWxpemluZyBmcm9tIGFuIGV4dGVuc2lvbiBkaWFsb2csIHRoaXMgc3RyaW5nXG4gICAgICAvLyBpcyBhbiBvcHRpb25hbCBwYXlsb2FkIHNlbnQgZnJvbSB0aGUgcGFyZW50IGV4dGVuc2lvbi5cbiAgICAgIHJldHVybiByZXN1bHQuZXh0ZW5zaW9uRGlhbG9nUGF5bG9hZDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUFsbEZvcm1hdHRpbmcoZm9ybWF0dGluZ01vZGVsOiBXb3JrYm9va0Zvcm1hdHRpbmcgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuX3N0eWxlRWxlbWVudCkge1xuICAgICAgdGhpcy5fc3R5bGVFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTtcbiAgICAgIHRoaXMuX3N0eWxlRWxlbWVudC5pZCA9ICdUYWJsZWF1LUV4dGVuc2lvbi1Gb3JtYXR0aW5nJztcbiAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5fc3R5bGVFbGVtZW50KTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuX3N0eWxlRWxlbWVudC5zaGVldCB8fCAhZm9ybWF0dGluZ01vZGVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc3R5bGVzaGVldDogQ1NTU3R5bGVTaGVldCA9IHRoaXMuX3N0eWxlRWxlbWVudC5zaGVldCBhcyBDU1NTdHlsZVNoZWV0O1xuICAgIHdoaWxlIChzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0eWxlc2hlZXQuZGVsZXRlUnVsZShzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBmb3JtYXR0aW5nTW9kZWwuZm9ybWF0dGluZ1NoZWV0cy5tYXAoKGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQpID0+IHtcbiAgICAgIHRoaXMuYXBwbHlGb3JtYXR0aW5nU2hlZXRUb1N0eWxlU2hlZXQoY3VycmVudEZvcm1hdHRpbmdTaGVldCwgc3R5bGVzaGVldCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Rm9ybWF0dGluZ1NoZWV0VG9TdHlsZVNoZWV0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQ6IEZvcm1hdHRpbmdTaGVldCwgc3R5bGVzaGVldDogQ1NTU3R5bGVTaGVldCk6IHZvaWQge1xuICAgIGxldCBzdHlsZUluZm8gPSAnJztcblxuICAgIGNvbnN0IGNzc1Byb3BlcnRpZXMgPSBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXM7XG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LWZhbWlseTogJyArIGNzc1Byb3BlcnRpZXMuZm9udEZhbWlseS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5mb250U2l6ZSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LXNpemU6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRTaXplLnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC13ZWlnaHQ6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udFN0eWxlKSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2ZvbnQtc3R5bGU6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRTdHlsZS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbikge1xuICAgICAgc3R5bGVJbmZvICs9ICd0ZXh0LWRlY29yYXRpb246ICcgKyBjc3NQcm9wZXJ0aWVzLnRleHREZWNvcmF0aW9uLnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmNvbG9yKSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2NvbG9yOiAnICsgY3NzUHJvcGVydGllcy5jb2xvciArICc7ICc7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0b3I6IHN0cmluZyA9ICcuJyArIGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY2xhc3NOYW1lS2V5O1xuICAgIGNvbnN0IHJ1bGU6IHN0cmluZyA9IHNlbGVjdG9yICsgJyB7ICcgKyBzdHlsZUluZm8gKyAnIH0nO1xuICAgIHN0eWxlc2hlZXQuaW5zZXJ0UnVsZShydWxlLCBzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnRDYWxsYmFjayhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24sXG4gICAgKTtcbiAgICAvLyBVbnJlZ2lzdGVyIGZ1bmN0aW9uIG5vdCB1c2VkIHNpbmNlIHRoZXNlIG5vdGlmaWNhdGlvbnMgc2hvdWxkIGJlXG4gICAgLy8gb2JzZXJ2ZWQgZm9yIHRoZSBmdWxsIGxpZmV0aW1lIG9mIHRoZSBleHRlbnNpb24uXG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudEZvcm1hdHRpbmc6IFdvcmtib29rRm9ybWF0dGluZykgPT4ge1xuICAgICAgICBpZiAoZXZlbnRGb3JtYXR0aW5nKSB7XG4gICAgICAgICAgdGhpcy5pbml0aWFsaXplVGFibGVhdUZvbnRzKGRpc3BhdGNoZXIsIGV2ZW50Rm9ybWF0dGluZyk7XG4gICAgICAgICAgdGhpcy5hcHBseUFsbEZvcm1hdHRpbmcoZXZlbnRGb3JtYXR0aW5nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVGFibGVhdUZvbnRzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgd29ya2Jvb2tGb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmb250TmFtZXM6IE1vZGVsW10gPSBbLi4uU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlcywgLi4uU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlc107XG4gICAgd29ya2Jvb2tGb3JtYXR0aW5nLmZvcm1hdHRpbmdTaGVldHMuZm9yRWFjaCgoZm9ybWF0dGluZ1NoZWV0KSA9PiB7XG4gICAgICBpZiAoZm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSkge1xuICAgICAgICBmb250TmFtZXMucHVzaChmb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250RmFtaWx5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChmb250TmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7IFtQYXJhbWV0ZXJJZC5Gb250TmFtZUxpc3RJdGVtc106IGZvbnROYW1lcyB9O1xuICAgICAgZGlzcGF0Y2hlclxuICAgICAgICAuZXhlY3V0ZShWZXJiSWQuR2V0Rm9udHMsIHBhcmFtZXRlcnMpXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZEZvbnRzKHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxGb250TmFtZUFuZEluZm8+KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRm9udHMoZm9udHM6IEFycmF5PEZvbnROYW1lQW5kSW5mbz4pOiB2b2lkIHtcbiAgICBmb250cy5mb3JFYWNoKChmb250TmFtZUFuZEluZm8pID0+IHtcbiAgICAgIGlmIChTdXBwb3J0ZWRUYWJsZWF1Rm9udEZhY2VzLmluY2x1ZGVzKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkpIHtcbiAgICAgICAgdGhpcy5sb2FkVGFibGVhdUZvbnRzKGZvbnROYW1lQW5kSW5mbyk7XG4gICAgICB9IGVsc2UgaWYgKFN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXMuaW5jbHVkZXMoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSkge1xuICAgICAgICB0aGlzLmxvYWRCZW50b25TYW5zRm9udHMoZm9udE5hbWVBbmRJbmZvKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZURhc2hib2FyZENvbnRlbnQoaW5mbzogRXh0ZW5zaW9uRGFzaGJvYXJkSW5mbywgc2hlZXRQYXRoOiBTaGVldFBhdGgpOiBEYXNoYm9hcmRDb250ZW50IHtcbiAgICAvLyBzaGVldHMgYXJlIGFsd2F5cyBhY3RpdmUgZm9yIEV4dGVuc2lvbnNcbiAgICBjb25zdCBzaGVldEluZm9JbXBsID0gbmV3IFNoZWV0SW5mb0ltcGwoaW5mby5uYW1lLCBTaGVldFR5cGUuRGFzaGJvYXJkLCB7IHdpZHRoOiBpbmZvLnNpemUudywgaGVpZ2h0OiBpbmZvLnNpemUuaCB9LCB1bmRlZmluZWQsIHRydWUpO1xuICAgIGNvbnN0IGRhc2hib2FyZEltcGwgPSBuZXcgRGFzaGJvYXJkSW1wbChzaGVldEluZm9JbXBsLCBpbmZvLnpvbmVzLCBzaGVldFBhdGgsIEV4dGVuc2lvbnNSZWdpc3RyeUlkLCBudWxsLCBpbmZvLmFjdGl2ZURhc2hib2FyZE9iamVjdElkKTtcbiAgICBjb25zdCBkYXNoYm9hcmQgPSBuZXcgRGFzaGJvYXJkKGRhc2hib2FyZEltcGwpO1xuICAgIHJldHVybiBuZXcgRGFzaGJvYXJkQ29udGVudChkYXNoYm9hcmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplV29ya3NoZWV0Q29udGVudChpbmZvOiBFeHRlbnNpb25Xb3Jrc2hlZXRJbmZvKTogV29ya3NoZWV0Q29udGVudCB7XG4gICAgY29uc3Qgc2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKFxuICAgICAgaW5mby52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgICAgeyB3aWR0aDogaW5mby5zaXplLncsIGhlaWdodDogaW5mby5zaXplLmggfSxcbiAgICAgIHVuZGVmaW5lZCwgLy8gaW5kZXggcHJvcGVydHkgaXMgZW1iZWRkaW5nIHNwZWNpZmljXG4gICAgICB0cnVlLCAvLyBzaGVldHMgYXJlIGFsd2F5cyBhY3RpdmUgZm9yIEV4dGVuc2lvbnNcbiAgICApO1xuXG4gICAgY29uc3Qgd29ya3NoZWV0SW1wbCA9IG5ldyBXb3Jrc2hlZXRJbXBsKFxuICAgICAgc2hlZXRJbmZvSW1wbCxcbiAgICAgIEV4dGVuc2lvbnNSZWdpc3RyeUlkLFxuICAgICAgaW5mby52aXN1YWxJZCxcbiAgICAgIG51bGwsIC8vIHBhcmVudERhc2hib2FyZCBpcyBhbHdheXMgbnVsbCBmb3Igd29ya3NoZWV0IGluIFdvcmtzaGVldENvbnRlbnRcbiAgICAgIG51bGwsIC8vIHBhcmVudFN0b3J5UG9pbnQgaXMgb25seSB1c2VkIGZvciBlbWJlZGRpbmdcbiAgICAgIGluZm8uYmFja2dyb3VuZENvbG9yLFxuICAgICAgV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbC5jb252ZXJ0VG9Xb3JrYm9va0Zvcm1hdHRpbmcoaW5mby5mb3JtYXR0aW5nKSxcbiAgICApO1xuICAgIGNvbnN0IHdvcmtzaGVldCA9IG5ldyBXb3Jrc2hlZXQod29ya3NoZWV0SW1wbCk7XG4gICAgcmV0dXJuIG5ldyBXb3Jrc2hlZXRDb250ZW50KHdvcmtzaGVldCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbyk6IFNldHRpbmdzIHtcbiAgICBjb25zdCBzZXR0aW5nc0ltcGwgPSBuZXcgU2V0dGluZ3NJbXBsKHNldHRpbmdzSW5mbyk7XG4gICAgcmV0dXJuIG5ldyBTZXR0aW5ncyhzZXR0aW5nc0ltcGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29udGV4dE1lbnVDYWxsYmFja3MoY29udGV4dE1lbnVGdW5jdGlvbnM/OiBDYWxsYmFja01hcCk6IHZvaWQge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFxuICAgICAgU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbixcbiAgICApO1xuXG4gICAgLy8gVW5yZWdpc3RlciBmdW5jdGlvbiBub3QgdXNlZCBzaW5jZSB0aGVzZSBub3RpZmljYXRpb25zIHNob3VsZCBiZVxuICAgIC8vIG9ic2VydmVkIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuQ29udGV4dE1lbnVDbGljayxcbiAgICAgICgpID0+IHtcbiAgICAgICAgLy8gTGV0IHRocm91Z2ggYW55IGNvbnRleHQgbWVudSBldmVudCwgdGhlc2UgYXJlIGFscmVhZHkgZmlsdGVyZWQgb24gYXBpLWNvcmVcbiAgICAgICAgLy8gYmFzZWQgb24gdGhlIGV4dGVuc2lvbiBsb2NhdG9yLlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICAoZXZlbnQ6IENvbnRleHRNZW51RXZlbnQpID0+IHtcbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGV4dCBtZW51IElEXG4gICAgICAgIGlmIChjb250ZXh0TWVudUZ1bmN0aW9ucykge1xuICAgICAgICAgIGlmICghY29udGV4dE1lbnVGdW5jdGlvbnNbZXZlbnQuaWRdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlY2VpdmVkIHVuZXhwZWN0ZWQgY29udGV4dCBtZW51IElkIGZyb20gZXZlbnQ6ICR7ZXZlbnQuaWR9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dE1lbnVGdW5jdGlvbnNbZXZlbnQuaWRdKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFRhYmxlYXVGb250cyhmb250TmFtZUFuZEluZm86IEZvbnROYW1lQW5kSW5mbyk6IHZvaWQge1xuICAgIHN3aXRjaCAoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSB7XG4gICAgICBjYXNlIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUxpZ2h0Rm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1UmVndWxhckZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVNlbWlib2xkRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdVJlZ3VsYXJGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1Qm9sZEZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdU1lZGl1bUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVNlbWlib2xkRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVNZWRpdW1Gb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1TGlnaHRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJ2F0dGVtcHRlZCB0byBsb2FkIHVuc3VwcG9ydGVkIGZvbnQ6ICR7Zm9udE5hbWVBbmRJbmZvLmZvbnROYW1lfS4nYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQmVudG9uU2Fuc0ZvbnRzKGZvbnROYW1lQW5kSW5mbzogRm9udE5hbWVBbmRJbmZvKTogdm9pZCB7XG4gICAgc3dpdGNoIChmb250TmFtZUFuZEluZm8uZm9udE5hbWUpIHtcbiAgICAgIGNhc2UgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICcxMDAnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICcxMDAnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKEJlbnRvblNhbnNMb3dEUElGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNTZW1pRGVtaUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHN0eWxlOiAnaXRhbGljJyB9KSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyBzdHlsZTogJ2l0YWxpYycgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAnYXR0ZW1wdGVkIHRvIGxvYWQgdW5zdXBwb3J0ZWQgZm9udDogJHtmb250TmFtZUFuZEluZm8uZm9udE5hbWV9LidgKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEluaXRpYWxpemF0aW9uT3B0aW9ucywgSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSwgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIgaGFzIGJlZW4gbW92ZWQgKGFuZCByZW5hbWVkKSBmcm9tIGFwaS1pbnRlcm5hbC1jb250cmFjdC5cbiAqIEl0IHN1cHBvcnRzIHJ1bm5pbmcgYSBuZXdlciBleHRlcm5hbCBsaWJyYXJ5IGFnYWluc3QgYSBwcmUgMjAxOS4zIGRlc2t0b3AuXG4gKiBTdGFydGluZyBpbiAyMDE5LjMsIHdlIGhhdmUgYSBtZXJnZWQgYm9vdHN0cmFwIHN0eWxlIGZvciBib3RoIGRlc2t0b3AgYW5kIHNlcnZlci5cbiAqIEluIGFkZGl0aW9uLCB0aGUgYWxwaGEgY2hlY2tpbmcgdGhhdCBpcyBoYXBwZW5pbmcgaGVyZSBpcyBub3QgbmVjZXNzYXJ5IGluIGV4dGVybmFsLWFwaS1qc1xuICogIGFmdGVyIDIwMTkuMyBiZWNhdXNlIHRoYXQgY2hlY2tpbmcgaGFwcGVucyBpbiBhcGktcGxhdGZvcm0tanMgKEFwaURpc3BhdGNoZXJUZXN0LnRzKVxuICogVEZTSUQ6IDEwOTE1NjEgdHJhY2tzIGFuIGltcHJvdmVtZW50IHRvIHRoaXMgc3lzdGVtIHRvIG1ha2UgaXQgbGVzcyBjb21wbGV4IGFuZCB0aWUgaXQgZGlyZWN0bHkgdG9cbiAqICB0YWJsZWF1IGJldGEgcmVsZWFzZSB2ZXJzaW9ucy5cbiAqIEBkZXByZWNhdGVkXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tbmFtZXNwYWNlXG5leHBvcnQgbmFtZXNwYWNlIExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlciB7XG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKi9cbiAgZXhwb3J0IGZ1bmN0aW9uIGdldERlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZShvcHRpb25zPzogSW5pdGlhbGl6YXRpb25PcHRpb25zKTogUHJvbWlzZTxJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PiB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKCghb3B0aW9ucyB8fCB0eXBlb2Ygb3B0aW9ucy5pc0FscGhhID09PSAndW5kZWZpbmVkJykgJiYgIXdpbmRvdy5fX3dhcm5pbmdJc3N1ZWQpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlXG4gICAgICBjb25zb2xlLndhcm4oJ1RoaXMgaXMgYSBiZXRhIHZlcnNpb24gb2YgdGhlIEV4dGVuc2lvbnMgQVBJLiBQbGVhc2UgdXBncmFkZSB0byBhbiBvZmZpY2lhbCByZWxlYXNlLicpO1xuICAgICAgd2luZG93Ll9fd2FybmluZ0lzc3VlZCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zPy5pc0FscGhhICYmIHdpbmRvdy5fX3BsYXRmb3JtSXNPZmZpY2lhbFJlbGVhc2UpIHtcbiAgICAgIHdpbmRvdy5fX3RhYmxlYXVEZXNrdG9wRGlzcGF0Y2hlclxuICAgICAgICAudGhlbigoZGlzcGF0Y2hlckZhY3RvcnkpID0+IHtcbiAgICAgICAgICBjb25zdCBkaXNwYXRjaGVyID0gZGlzcGF0Y2hlckZhY3RvcnkoSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTik7XG4gICAgICAgICAgZGlzcGF0Y2hlci5leGVjdXRlKFZlcmJJZC5CbG9ja0V4dGVuc2lvbiwge30pLmNhdGNoKCk7XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgpO1xuICAgIH1cblxuICAgIC8vIHRoaXMgd2lsbCBiZSB1bmRlZmluZWQgaWYgcHJvbWlzZSBpcyByZWplY3RlZCBvciB0aHJvd3NcbiAgICByZXR1cm4gd2luZG93Ll9fdGFibGVhdURlc2t0b3BEaXNwYXRjaGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gaGFzRGVza3RvcEFwaURpc3BhdGNoZXJQcm9taXNlKG9wdGlvbnM/OiBJbml0aWFsaXphdGlvbk9wdGlvbnMpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISFnZXREZXNrdG9wRGlzcGF0Y2hlclByb21pc2Uob3B0aW9ucyk7XG4gIH1cbn1cblxuZGVjbGFyZSBnbG9iYWwge1xuICBpbnRlcmZhY2UgV2luZG93IHtcbiAgICBfX3RhYmxlYXVEZXNrdG9wRGlzcGF0Y2hlcjogUHJvbWlzZTxJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PjtcbiAgICBfX3BsYXRmb3JtSXNPZmZpY2lhbFJlbGVhc2U6IGJvb2xlYW47XG4gICAgX193YXJuaW5nSXNzdWVkOiBib29sZWFuO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvLCBOb3RpZmljYXRpb25JZCwgU2V0dGluZ3NFdmVudCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnksXG4gIEVycm9ySGVscGVycyxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFRhYmxlYXVFcnJvcixcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuLi9FdmVudHMvVGFibGVhdUV2ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBTZXR0aW5nc0NvbGxlY3Rpb24sIFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1NldHRpbmdzU2VydmljZSc7XG5cbmNsYXNzIFNldHRpbmdzQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuU2V0dGluZ3NDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbmV3U2V0dGluZ3M6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pIHtcbiAgICBzdXBlcihDb250cmFjdC5UYWJsZWF1RXZlbnRUeXBlLlNldHRpbmdzQ2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5ld1NldHRpbmdzKCk6IFNldHRpbmdzQ29sbGVjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX25ld1NldHRpbmdzO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc0ltcGwge1xuICBwcml2YXRlIHN0YXRpYyBBU1lOQ19TQVZFX0lOX1BST0dSRVNTID0gJ0FzeW5jIFNhdmUgaXMgaW4gcHJvZ3Jlc3MsIHVwZGF0aW5nIHNldHRpbmdzIGlzIG5vdCBhbGxvd2VkLic7XG4gIHByaXZhdGUgX2lzTW9kaWZpZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX2N1cnJlbnRTZXR0aW5nczogU2V0dGluZ3NDb2xsZWN0aW9uO1xuXG4gIC8vIFNpbmNlIHByb21pc2VzIGNhbid0IGJlIGludHJvc3BlY3RlZCBmb3Igc3RhdGUsIGtlZXAgYSB2YXJpYWJsZSB0aGF0XG4gIC8vIGluZGljYXRlcyBhIHNhdmUgaXMgaW4gcHJvZ3Jlc3MsIHNvIHRoYXQgc2V0L2VyYXNlIGNhbid0IGJlIGNhbGxlZCBkdXJpbmcgYSBzYXZlLlxuICBwcml2YXRlIF9zYXZlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbykge1xuICAgIHRoaXMuaW5pdGlhbGl6ZVNldHRpbmdzKHNldHRpbmdzSW5mbyk7XG4gIH1cblxuICBwdWJsaWMgZXJhc2Uoa2V5OiBzdHJpbmcpOiB2b2lkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGtleSwgJ2tleScpO1xuXG4gICAgLy8gT25seSBtYWtlIGEgbW9kaWZpY2F0aW9uIGlmIHdlIGhhdmUgdGhlIGtleSBhbHJlYWR5XG4gICAgaWYgKHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldKSB7XG4gICAgICB0aGlzLnZlcmlmeVNldHRpbmdzQXJlVW5sb2NrZWQoKTtcblxuICAgICAgZGVsZXRlIHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldO1xuICAgICAgdGhpcy5faXNNb2RpZmllZCA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihrZXksICdrZXknKTtcblxuICAgIHJldHVybiB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGwoKTogU2V0dGluZ3NDb2xsZWN0aW9uIHtcbiAgICAvLyBSZXR1cm5zIGEgbXV0YWJsZSBjb3B5IG9mIHRoZSBzZXR0aW5nc1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9jdXJyZW50U2V0dGluZ3MpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc01vZGlmaWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc01vZGlmaWVkO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYygpOiBQcm9taXNlPFNldHRpbmdzQ29sbGVjdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpO1xuXG4gICAgLy8gSnVzdCByZXNvbHZlIGltbWVkaWF0ZWx5IGlmIHNldHRpbmdzIGFyZSB1bmNoYW5nZWRcbiAgICBpZiAoIXRoaXMuX2lzTW9kaWZpZWQpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmU8U2V0dGluZ3NDb2xsZWN0aW9uPih0aGlzLl9jdXJyZW50U2V0dGluZ3MpO1xuICAgIH1cblxuICAgIHRoaXMuX3NhdmVJblByb2dyZXNzID0gdHJ1ZTtcblxuICAgIC8vIFVzZSB0aGUgc2V0dGluZ3Mgc2VydmljZSB0byBzYXZlIHNldHRpbmdzIHRvIHR3YlxuICAgIGNvbnN0IHNldHRpbmdzU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2V0dGluZ3NTZXJ2aWNlPihcbiAgICAgIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuU2V0dGluZ3NTZXJ2aWNlLFxuICAgICk7XG5cbiAgICByZXR1cm4gc2V0dGluZ3NTZXJ2aWNlLnNhdmVTZXR0aW5nc0FzeW5jKHRoaXMuX2N1cnJlbnRTZXR0aW5ncykudGhlbjxTZXR0aW5nc0NvbGxlY3Rpb24+KFxuICAgICAgKG5ld1NldHRpbmdzKSA9PiB7XG4gICAgICAgIHRoaXMuX3NhdmVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuX2lzTW9kaWZpZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRTZXR0aW5ncyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhpcy5fY3VycmVudFNldHRpbmdzID0gbmV3U2V0dGluZ3M7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgT2JqZWN0LmFzc2lnbih0aGlzLl9jdXJyZW50U2V0dGluZ3MsIG5ld1NldHRpbmdzKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbmV3U2V0dGluZ3M7XG4gICAgICB9LFxuICAgICAgKHJlYXNvbikgPT4ge1xuICAgICAgICB0aGlzLl9zYXZlSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVhc29uKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQoa2V5OiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGtleSwgJ2tleScpOyAvLyBLZXkgc2hvdWxkbid0IGJlIGFuIGVtcHR5IHN0cmluZy5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHZhbHVlLCAndmFsdWUnKTsgLy8gRW1wdHkgc3RyaW5nIHZhbHVlIGlzIGFsbG93ZWQuXG4gICAgdGhpcy52ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk7XG5cbiAgICB0aGlzLl9jdXJyZW50U2V0dGluZ3Nba2V5XSA9IHZhbHVlO1xuICAgIHRoaXMuX2lzTW9kaWZpZWQgPSB0cnVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGFsbCBldmVudHMgcmVsZXZhbnQgdG8gc2V0dGluZ3Mgb2JqZWN0LiAgVGhpcyBpcyBvbmx5IGEgc2V0dGluZ3NVcGRhdGUgZXZlbnQgY3VycmVudGx5LlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyLlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemVFdmVudHMoKTogQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+KCk7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2U7XG5cbiAgICB0cnkge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIHNlcnZpY2UgcmVnaXN0ZXJlZCwganVzdCByZXR1cm5cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IHNldHRpbmdzQ2hhbmdlZEV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8U2V0dGluZ3NDaGFuZ2VkRXZlbnQ+KENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuU2V0dGluZ3NDaGFuZ2VkKTtcbiAgICBub3RpZmljYXRpb25TZXJ2aWNlLnJlZ2lzdGVySGFuZGxlcihcbiAgICAgIE5vdGlmaWNhdGlvbklkLlNldHRpbmdzQ2hhbmdlZCxcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXZlbnQ6IFNldHRpbmdzRXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5fY3VycmVudFNldHRpbmdzID0gZXZlbnQubmV3U2V0dGluZ3M7XG4gICAgICAgIHNldHRpbmdzQ2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgU2V0dGluZ3NDaGFuZ2VkRXZlbnQoZXZlbnQubmV3U2V0dGluZ3MpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChzZXR0aW5nc0NoYW5nZWRFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVNldHRpbmdzKHNldHRpbmdzSW5mbzogRXh0ZW5zaW9uU2V0dGluZ3NJbmZvKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihzZXR0aW5nc0luZm8sICdzZXR0aW5nc0luZm8nKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNldHRpbmdzSW5mby5zZXR0aW5nc1ZhbHVlcywgJ3NldHRpbmdzSW5mby5TZXR0aW5nc1ZhbHVlcycpO1xuXG4gICAgdGhpcy5fY3VycmVudFNldHRpbmdzID0gc2V0dGluZ3NJbmZvLnNldHRpbmdzVmFsdWVzO1xuXG4gICAgLy8gUmVzZXQgdGhlIGlzTW9kaWZpZWQgZmxhZ1xuICAgIHRoaXMuX2lzTW9kaWZpZWQgPSBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGhlbHBlciBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhbnkgbG9jYWwgdXBkYXRlIHRvIHRoaXMuY3VycmVudFNldHRpbmdzLlxuICAgKiBDaGVja3MgaWYgYSBjdXJyZW50IHNhdmUgY2FsbCBpcyBzdGlsbCBpbiBwcm9ncmVzcyBhbmQgdGhyb3dzIGFuIGVycm9yIGlmIHNvLlxuICAgKi9cbiAgcHJpdmF0ZSB2ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9zYXZlSW5Qcm9ncmVzcykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLlNldHRpbmdTYXZlSW5Qcm9ncmVzcywgU2V0dGluZ3NJbXBsLkFTWU5DX1NBVkVfSU5fUFJPR1JFU1MpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY29uc3QgVGFibGVhdUJvb2tGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IEJvb2snO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVSZWd1bGFyRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBSZWd1bGFyJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBNZWRpdW0nO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgU2VtaWJvbGQnO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb2xkRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBCb2xkJztcblxuZXhwb3J0IGNvbnN0IFRhYmxlYXVCb29rRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgQm9vayc7XG5leHBvcnQgY29uc3QgVGFibGVhdUJvbGRGb250RmFjZU5hbWUgPSAnVGFibGVhdSBCb2xkJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUgPSAnVGFibGVhdSBMaWdodCc7XG5leHBvcnQgY29uc3QgVGFibGVhdU1lZGl1bUZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IE1lZGl1bSc7XG5leHBvcnQgY29uc3QgVGFibGVhdVJlZ3VsYXJGb250RmFjZU5hbWUgPSAnVGFibGVhdSBSZWd1bGFyJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUgPSAnVGFibGVhdSBTZW1pIEJvbGQnO1xuXG5leHBvcnQgY29uc3QgU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlczogTW9kZWxbXSA9IFtcbiAgVGFibGVhdUJvb2tGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVCb2xkRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVNZWRpdW1Gb250RmFjZU5hbWUsXG4gIFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUsXG5dO1xuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVtYmVkZGluZ0Vycm9yQ29kZXMsIEVycm9yQ29kZXMsIFNoYXJlZEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGlhbG9nTWVzc2FnZUV2ZW50IGFzIERpYWxvZ01lc3NhZ2VFdmVudENvbnRyYWN0LCBEaWFsb2dVcGRhdGVFdmVudCwgTm90aWZpY2F0aW9uSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgVGFibGVhdUVycm9yLFxufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9UYWJsZWF1RXZlbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL0V4dGVuc2lvbnNTZXJ2aWNlTmFtZXMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IFVJU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1VJU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBEaWFsb2dNZXNzYWdlRXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5EaWFsb2dNZXNzYWdlRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZywgcHVibGljIHJlYWRvbmx5IHNvdXJjZURpYWxvZ1VybD86IHN0cmluZykge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuRGlhbG9nTWVzc2FnZVJlY2VpdmVkKTtcbiAgfVxufVxuXG4vKipcbiAqIEN1c3RvbSBlcnJvciBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIFRhYmxlYXVFcnJvciBvYmplY3QuXG4gKiBJbmNsdWRlcyBjb250ZXh0IGZvciB3aGljaCBkaWFsb2cgY2F1c2VkIHRoZSBleGNlcHRpb24gdmlhIGl0cyB1cmwuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZWF1RGlhbG9nRXJyb3IgZXh0ZW5kcyBUYWJsZWF1RXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IoX2Vycm9yQ29kZTogRXJyb3JDb2RlcyB8IEVtYmVkZGluZ0Vycm9yQ29kZXMgfCBTaGFyZWRFcnJvckNvZGVzLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihfZXJyb3JDb2RlLCBtZXNzYWdlKTtcblxuICAgIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYXN0ZXIvQnJlYWtpbmctQ2hhbmdlcy5tZCNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmtcbiAgICAvLyBFcnJvciBpbmhlcml0YW5jZSBkb2VzIG5vdCB3b3JrIHByb3BlcnRseSB3aGVuIGNvbXBpbGluZyB0byBFUzUsIHRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIGZvcmNlXG4gICAgLy8gdGhlIHByb3RvIGNoYWluIHRvIGJlIGJ1aWx0IGNvcnJlY3RseS4gIFNlZSB0aGUgZ2l0aHViIGxpbmsgYWJvdmUgZm9yIGRldGFpbHMuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFRhYmxlYXVEaWFsb2dFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVSUltcGwge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuKSB7fVxuXG4gIHB1YmxpYyBkaXNwbGF5RGlhbG9nQXN5bmModXJsOiBzdHJpbmcsIHBheWxvYWQ/OiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5EaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB1aVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFVJU2VydmljZT4oRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5VSVNlcnZpY2UpO1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFxuICAgICAgU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbixcbiAgICApO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVpU2VydmljZVxuICAgICAgICAuZGlzcGxheURpYWxvZ0FzeW5jKHVybCwgcGF5bG9hZCB8fCAnJywgdGhpcy5pc0V4dGVuc2lvbkRpYWxvZywgb3B0aW9ucylcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVucmVnaXN0ZXJGbiA9IG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgICAgICAgTm90aWZpY2F0aW9uSWQuRXh0ZW5zaW9uRGlhbG9nVXBkYXRlLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBMZXQgdGhyb3VnaCBhbnkgZGlhbG9nIHVwZGF0ZSBldmVudFxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXZlbnQ6IERpYWxvZ1VwZGF0ZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChldmVudC5pc0Nsb3NlRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY2xvc2VQYXlsb2FkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RGlhbG9nRXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnY2xvc2VQYXlsb2FkIGlzIHVuZGVmaW5lZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50LmNsb3NlUGF5bG9hZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBUYWJsZWF1RGlhbG9nRXJyb3IoRXJyb3JDb2Rlcy5EaWFsb2dDbG9zZWRCeVVzZXIsICdFeHRlbnNpb24gZGlhbG9nIGNsb3NlZCBieSB1c2VyLicpKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHVucmVnaXN0ZXJGbigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VuZERpYWxvZ01lc3NhZ2VBc3luYyhtZXNzYWdlOiBzdHJpbmcsIHRhcmdldERpYWxvZ1VybD86IHN0cmluZykge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG5cbiAgICB1aVNlcnZpY2Uuc2VuZERpYWxvZ01lc3NhZ2VBc3luYyhtZXNzYWdlLCB0YXJnZXREaWFsb2dVcmwpO1xuICB9XG5cbiAgcHVibGljIHNlbmREaWFsb2dNZXNzYWdlVG9QYXJlbnRBc3luYyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuaXNFeHRlbnNpb25EaWFsb2cpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnc2VuZERpYWxvZ01lc3NhZ2VUb1BhcmVudEFzeW5jIGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIGFuIGV4dGVuc2lvbiBkaWFsb2cuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcblxuICAgIHVpU2VydmljZS5zZW5kRGlhbG9nTWVzc2FnZVRvUGFyZW50QXN5bmMobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VEaWFsb2cocGF5bG9hZD86IHN0cmluZywgZGlhbG9nVXJsPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcblxuICAgIHVpU2VydmljZS5jbG9zZURpYWxvZyhwYXlsb2FkLCBkaWFsb2dVcmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGFsbCBldmVudHMgcmVsZXZhbnQgdG8gVUkgb2JqZWN0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyLlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemVFdmVudHMoKTogQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+KCk7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2U7XG5cbiAgICB0cnkge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIHNlcnZpY2UgcmVnaXN0ZXJlZCwganVzdCByZXR1cm5cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IGRpYWxvZ01lc3NhZ2VFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPENvbnRyYWN0LkRpYWxvZ01lc3NhZ2VFdmVudD4oQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5EaWFsb2dNZXNzYWdlUmVjZWl2ZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuRXh0ZW5zaW9uRGlhbG9nTWVzc2FnZSxcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXZlbnQ6IERpYWxvZ01lc3NhZ2VFdmVudENvbnRyYWN0KSA9PiB7XG4gICAgICAgIGRpYWxvZ01lc3NhZ2VFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IERpYWxvZ01lc3NhZ2VFdmVudChldmVudC5tZXNzYWdlLCBldmVudC5zb3VyY2VEaWFsb2dVcmwpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChkaWFsb2dNZXNzYWdlRXZlbnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzLCBUYWJsZWF1RXZlbnRUeXBlLCBXb3JrYm9va0Zvcm1hdHRpbmcgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkTGF5b3V0RXZlbnQsIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRGFzaGJvYXJkSW1wbCxcbiAgRGFzaGJvYXJkT2JqZWN0SW1wbCxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFdvcmtzaGVldEltcGwsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL0Rhc2hib2FyZExheW91dENoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3QgfSBmcm9tICcuL0Rhc2hib2FyZE9iamVjdCc7XG5pbXBvcnQgeyBTaGVldCB9IGZyb20gJy4vU2hlZXQnO1xuaW1wb3J0IHsgV29ya3NoZWV0IH0gZnJvbSAnLi9Xb3Jrc2hlZXQnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkIGV4dGVuZHMgU2hlZXQgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGFzaGJvYXJkSW1wbDogRGFzaGJvYXJkSW1wbCkge1xuICAgIHN1cGVyKF9kYXNoYm9hcmRJbXBsKTtcbiAgICBfZGFzaGJvYXJkSW1wbC5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoKTtcbiAgICB0aGlzLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldHMoKTogQXJyYXk8Q29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwud29ya3NoZWV0c0ltcGwubWFwKCh3b3Jrc2hlZXRJbXBsOiBXb3Jrc2hlZXRJbXBsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFdvcmtzaGVldCh3b3Jrc2hlZXRJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb2JqZWN0cygpOiBBcnJheTxDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmRPYmplY3Q+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+IHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLnNhdmVBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3NldHRpbmdzSW1wbC5zZXQoa2V5LCB2YWx1ZSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi4vSW1wbC9VSUltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBVSSBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBVSSBleHRlbmRzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgQ29udHJhY3QuVUkge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfaW1wbDogVUlJbXBsKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEluaXRpYWxpemUgb3VyIGV2ZW50IGhhbmRsaW5nIGZvciB0aGlzIGNsYXNzXG4gICAgdGhpcy5faW1wbC5pbml0aWFsaXplRXZlbnRzKCkuZm9yRWFjaCgoZSkgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGRpc3BsYXlEaWFsb2dBc3luYyh1cmw6IHN0cmluZywgcGF5bG9hZD86IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkRpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9pbXBsLmRpc3BsYXlEaWFsb2dBc3luYyh1cmwsIHBheWxvYWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZTogc3RyaW5nLCB0YXJnZXREaWFsb2dVcmw/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5faW1wbC5zZW5kRGlhbG9nTWVzc2FnZUFzeW5jKG1lc3NhZ2UsIHRhcmdldERpYWxvZ1VybCk7XG4gIH1cblxuICBwdWJsaWMgc2VuZERpYWxvZ01lc3NhZ2VUb1BhcmVudEFzeW5jKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9pbXBsLnNlbmREaWFsb2dNZXNzYWdlVG9QYXJlbnRBc3luYyhtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nLCBkaWFsb2dVcmw/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9pbXBsLmNsb3NlRGlhbG9nKHBheWxvYWQsIGRpYWxvZ1VybCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRW51bU1hcHBpbmdzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBDbGFzc05hbWVLZXksIFdvcmtib29rRm9ybWF0dGluZyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBXb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsIHtcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0VG9Xb3JrYm9va0Zvcm1hdHRpbmcod29ya2Jvb2tGb3JtYXR0aW5nTW9kZWw/OiBXb3JrYm9va0Zvcm1hdHRpbmcpOiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghd29ya2Jvb2tGb3JtYXR0aW5nTW9kZWwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRpbmdNYXA6IEFycmF5PENvbnRyYWN0LkZvcm1hdHRpbmdTaGVldD4gPSB3b3JrYm9va0Zvcm1hdHRpbmdNb2RlbC5mb3JtYXR0aW5nU2hlZXRzLm1hcCgoY3VycmVudEZvcm1hdHRpbmdTaGVldCkgPT4ge1xuICAgICAgICBjb25zdCBmb3JtYXR0aW5nU2hlZXQ6IENvbnRyYWN0LkZvcm1hdHRpbmdTaGVldCA9IHtcbiAgICAgICAgICBjbGFzc05hbWVLZXk6IEVudW1NYXBwaW5ncy5jbGFzc05hbWVLZXkuY29udmVydChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNsYXNzTmFtZUtleSksXG4gICAgICAgICAgY3NzUHJvcGVydGllczogZ2V0Q3NzUHJvcGVydGllcyhjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNsYXNzTmFtZUtleSwgY3VycmVudEZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzKSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRpbmdTaGVldDtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0OiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgPSB7XG4gICAgICAgIGZvcm1hdHRpbmdTaGVldHM6IGZvcm1hdHRpbmdNYXAsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q3NzUHJvcGVydGllcyhjbGFzc05hbWVLZXk6IENsYXNzTmFtZUtleSwgY3NzUHJvcGVydGllczogUmVhY3QuQ1NTUHJvcGVydGllcyk6IGltcG9ydCgncmVhY3QnKS5DU1NQcm9wZXJ0aWVzIHtcbiAgaWYgKGNsYXNzTmFtZUtleSA9PT0gQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzIHx8IGNsYXNzTmFtZUtleSA9PT0gQ2xhc3NOYW1lS2V5LkNvbHVtbkRpdmlkZXJzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJvcmRlckNvbG9yOiBjc3NQcm9wZXJ0aWVzLmJvcmRlckNvbG9yLFxuICAgICAgYm9yZGVyU3R5bGU6IGNzc1Byb3BlcnRpZXMuYm9yZGVyU3R5bGUsXG4gICAgICBib3JkZXJXaWR0aDogY3NzUHJvcGVydGllcy5ib3JkZXJXaWR0aCxcbiAgICB9IGFzIFJlYWN0LkNTU1Byb3BlcnRpZXM7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZvbnRGYW1pbHk6IGNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSxcbiAgICBmb250U2l6ZTogY3NzUHJvcGVydGllcy5mb250U2l6ZSxcbiAgICBmb250V2VpZ2h0OiBjc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQsXG4gICAgZm9udFN0eWxlOiBjc3NQcm9wZXJ0aWVzLmZvbnRTdHlsZSxcbiAgICB0ZXh0RGVjb3JhdGlvbjogY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbixcbiAgICBjb2xvcjogY3NzUHJvcGVydGllcy5jb2xvcixcbiAgfTtcbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIFdvcmtzaGVldENvbnRlbnQgbmFtZXNwYWNlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBXb3Jrc2hlZXRDb250ZW50IGlzXG4gKiBjdXJyZW50bHkganVzdCBhIChzaW5nbGUpIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtzaGVldENvbnRlbnQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3Jrc2hlZXRDb250ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3dvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7fVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8sIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Jbml0aWFsaXphdGlvblNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEluaXRpYWxpemF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5Jbml0aWFsaXphdGlvblNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYyhpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbiwgY29udGV4dE1lbnVJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxFeHRlbnNpb25Cb290c3RyYXBJbmZvPiB7XG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uQ29udGV4dE1lbnVJZHNdOiBjb250ZXh0TWVudUlkcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Jc0V4dGVuc2lvbkRpYWxvZ106IGlzRXh0ZW5zaW9uRGlhbG9nLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5Jbml0aWFsaXplRXh0ZW5zaW9uLCBwYXJhbXMpLnRoZW48RXh0ZW5zaW9uQm9vdHN0cmFwSW5mbz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBUT0RPIC0gVmFsaWRhdGUgcmV0dXJuIHZhbHVlXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25Cb290c3RyYXBJbmZvO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvLCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBTZXR0aW5nc0NvbGxlY3Rpb24sIFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL1NldHRpbmdzU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU2V0dGluZ3NTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLlNldHRpbmdzU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlU2V0dGluZ3NBc3luYyhzZXR0aW5nczogU2V0dGluZ3NDb2xsZWN0aW9uKTogUHJvbWlzZTxTZXR0aW5nc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2F2ZVNldHRpbmdzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlNldHRpbmdzVmFsdWVzXTogc2V0dGluZ3MsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNhdmVFeHRlbnNpb25TZXR0aW5ncywgcGFyYW1ldGVycykudGhlbjxTZXR0aW5nc0NvbGxlY3Rpb24+KCh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdmFsdWUucmVzdWx0IGFzIEV4dGVuc2lvblNldHRpbmdzSW5mbztcblxuICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5zZXR0aW5nc1ZhbHVlcykge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1VuZXhwZWN0ZWQgZXJyb3Igc2F2aW5ncyBzZXR0aW5ncy4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdC5zZXR0aW5nc1ZhbHVlcztcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRGlhbG9nT3B0aW9ucywgRGlhbG9nU3R5bGUsIEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdCwgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMsIEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncywgU2VydmljZUltcGxCYXNlLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFVJU2VydmljZSB9IGZyb20gJy4uL1VJU2VydmljZSc7XG5cbmNvbnN0IERFRkFVTFRfRElBTE9HX0hFSUdIVCA9IDQwMDsgLy8gaW4gcGl4ZWxzXG5jb25zdCBERUZBVUxUX0RJQUxPR19XSURUSCA9IDYwMDsgLy8gaW4gcGl4ZWxzXG5jb25zdCBERUZBVUxUX0RJQUxPR19TVFlMRTogRGlhbG9nU3R5bGUgPSBEaWFsb2dTdHlsZS5XaW5kb3c7XG5cbmV4cG9ydCBjbGFzcyBVSVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgVUlTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwbGF5RGlhbG9nQXN5bmModXJsOiBzdHJpbmcsIHBheWxvYWQ6IHN0cmluZywgaXNFeHRlbnNpb25EaWFsb2c6IGJvb2xlYW4sIG9wdGlvbnM/OiBEaWFsb2dPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2Rpc3BsYXlEaWFsb2dBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nVXJsXTogdXJsLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1BheWxvYWRdOiBwYXlsb2FkLFxuICAgIH07XG5cbiAgICAvLyBUaGUgZGlhbG9nIHVybCBzb3VyY2UgcmVmZXJzIHRvIHdobyBpcyBvcGVuaW5nIGEgbmV3IGRpYWxvZyAoaS5lLiB0aGUgZGlhbG9nJ3MgcGFyZW50KS5cbiAgICAvLyBJZiB0aGUgaG9zdCBleHRlbnNpb24gaXMgb3BlbmluZyBhIGRpYWxvZyB3ZSBsZWF2ZSB0aGUgc291cmNlIHVybCBhcyB1bmRlZmluZWQgdG8gaGVscCB1cyBkaWZmZXJlbnRpYXRlIGZyb20gb3RoZXIgZGlhbG9ncy5cbiAgICBpZiAoaXNFeHRlbnNpb25EaWFsb2cpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nVXJsU291cmNlXSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cblxuICAgIGNvbnN0IGg6IG51bWJlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5oZWlnaHQgPyBvcHRpb25zLmhlaWdodCA6IERFRkFVTFRfRElBTE9HX0hFSUdIVDtcbiAgICBjb25zdCB3OiBudW1iZXIgPSBvcHRpb25zICYmIG9wdGlvbnMud2lkdGggPyBvcHRpb25zLndpZHRoIDogREVGQVVMVF9ESUFMT0dfV0lEVEg7XG4gICAgY29uc3QgZGlhbG9nU3R5bGU6IERpYWxvZ1N0eWxlID0gb3B0aW9ucyAmJiBvcHRpb25zLmRpYWxvZ1N0eWxlID8gb3B0aW9ucy5kaWFsb2dTdHlsZSA6IERFRkFVTFRfRElBTE9HX1NUWUxFO1xuXG4gICAgLy8gT24gdGhlIHBsYXRmb3JtIHNpZGUsIHdlIGRvIHNvbWV0aGluZyByZWFzb25hYmxlIHJlZ2FyZGVzcyBvZiB3aGV0aGVyIHRoZSBwYXNzZWRcbiAgICAvLyBoZWlnaHQgYW5kIHdpZHRoIGFyZSB0b28gbGFyZ2Ugb3IgdG9vIHNtYWxsLiAgQnV0IHRoaXMgbGlrZWx5IGluZGljYXRlcyBhIGRldmVsb3BlciBlcnJvcixcbiAgICAvLyBzbyB3ZSB0aHJvdyBhbiBlcnJvciBoZXJlIHRvIGhlbHAgd2l0aCBkZWJ1Z2dpbmcuXG4gICAgaWYgKGggPD0gMCB8fCB3IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnU2l6ZSBwYXJhbWV0ZXJzIGZvciBkaXNwbGF5RGlhbG9nQXN5bmMgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nSF0gPSBoO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nV10gPSB3O1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RGlhbG9nU3R5bGU+KGRpYWxvZ1N0eWxlLCBEaWFsb2dTdHlsZSwgJ0RpYWxvZ1N0eWxlJyk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dTdHlsZV0gPSBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MuZGlhbG9nU3R5bGVzLmNvbnZlcnQoZGlhbG9nU3R5bGUpO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuRGlzcGxheURpYWxvZywgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRpYWxvZ1Jlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25EaWFsb2dSZXN1bHQ7XG4gICAgICBzd2l0Y2ggKGRpYWxvZ1Jlc3VsdCkge1xuICAgICAgICBjYXNlIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdC5EaWFsb2dBbHJlYWR5T3BlbjpcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuRGlhbG9nQWxyZWFkeU9wZW4sICdUaGVyZSBhbHJlYWR5IGV4aXN0cyBhbiBvcGVuIGRpYWxvZyBmb3IgdGhpcyBleHRlbnNpb24uJyk7XG4gICAgICAgIGNhc2UgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LkludmFsaWREb21haW46XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgICAgIEVycm9yQ29kZXMuSW52YWxpZERvbWFpbkRpYWxvZyxcbiAgICAgICAgICAgICdUaGUgdXJsIG9mIGFuIGV4dGVuc2lvbiBkaWFsb2cgbXVzdCBtYXRjaCB0aGUgZG9tYWluIG9mIHRoZSBwYXJlbnQgZXh0ZW5zaW9uLicsXG4gICAgICAgICAgKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBTdWNjZXNzIGNhc2VcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VEaWFsb2cocGF5bG9hZD86IHN0cmluZywgZGlhbG9nVXJsPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2Nsb3NlRGlhbG9nJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dVcmxTb3VyY2VdOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICB9O1xuXG4gICAgaWYgKHBheWxvYWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nUGF5bG9hZF0gPSBwYXlsb2FkO1xuICAgIH1cblxuICAgIGlmIChkaWFsb2dVcmwpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nVXJsXSA9IGRpYWxvZ1VybDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DbG9zZURpYWxvZywgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBzZW5kRGlhbG9nTWVzc2FnZUFzeW5jKG1lc3NhZ2U6IHN0cmluZywgdGFyZ2V0RGlhbG9nVXJsPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NlbmREaWFsb2dNZXNzYWdlJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dNZXNzYWdlXTogbWVzc2FnZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dVcmxTb3VyY2VdOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICB9O1xuXG4gICAgaWYgKHRhcmdldERpYWxvZ1VybCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dVcmxdID0gdGFyZ2V0RGlhbG9nVXJsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNlbmREaWFsb2dNZXNzYWdlLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHNlbmREaWFsb2dNZXNzYWdlVG9QYXJlbnRBc3luYyhtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VuZE1lc3NhZ2VUb1BhcmVudCcsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nTWVzc2FnZV06IG1lc3NhZ2UsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nVXJsU291cmNlXTogd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNlbmRNZXNzYWdlVG9QYXJlbnQsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQ6IGJvb2xlYW4sIGV4dGVuc2lvblpvbmVJZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUoY2xpY2tUaHJvdWdoRW5hYmxlZCwgJ2Jvb2xlYW4nLCAnY2xpY2tUaHJvdWdoRW5hYmxlZCcpO1xuXG4gICAgaWYgKGV4dGVuc2lvblpvbmVJZCA9PT0gdW5kZWZpbmVkIHx8IGV4dGVuc2lvblpvbmVJZCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ0V4dGVuc2lvbiBJZCBpcyBpbnZhbGlkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvblpvbmVJZF06IGV4dGVuc2lvblpvbmVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DbGlja1Rocm91Z2hFbmFibGVkXTogY2xpY2tUaHJvdWdoRW5hYmxlZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0Q2xpY2tUaHJvdWdoLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+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/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBjb21tb24gc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSB0YWJsZWF1IHdlYiBjb21wb25lbnQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFdlYkNvbXBvbmVudEF0dHJpYnV0ZXMge1xuICBTcmMgPSAnc3JjJyxcbiAgV2lkdGggPSAnd2lkdGgnLFxuICBIZWlnaHQgPSAnaGVpZ2h0JyxcbiAgVG9rZW4gPSAndG9rZW4nLFxuICBEZWJ1ZyA9ICdkZWJ1ZycsXG4gIElmcmFtZUF1dGggPSAnaWZyYW1lLWF1dGgnLFxuICBPblZpekxvYWRFcnJvciA9ICdvbnZpemxvYWRlcnJvcicsXG4gIEZvcmNlVG9rZW5TeW5jID0gJ2ZvcmNlLXRva2VuLXN5bmMnLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgZW1iZWRkZWQgaWZyYW1lIGF0dHJpYnV0ZXMgd2hvc2UgdmFsdWVzIGNhbiBiZSBjb250cm9sbGVkLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBFbWJlZGRlZElmcmFtZUF0dHJpYnV0ZXMge1xuICBMb2FkaW5nID0gJ2lmcmFtZS1hdHRyLWxvYWRpbmcnLFxuICBTdHlsZSA9ICdpZnJhbWUtYXR0ci1zdHlsZScsXG4gIENsYXNzID0gJ2lmcmFtZS1hdHRyLWNsYXNzJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgY2hpbGQgdGFncyBmb3IgVGFibGVhdVZpeiwgVGFibGVhdUF1dGhvcmluZ1ZpeiBhbmQgVGFibGVhdUFza0RhdGEgY3VzdG9tIGVsZW1lbnRzLlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBXZWJDb21wb25lbnRDaGlsZEVsZW1lbnRzIHtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBjdXN0b20gcGFyYW1ldGVycy4gIEF2YWlsYWJsZSBpbiB2aXogdmlld2luZywgdml6IGF1dGhvcmluZyBhbmQgYXNrZGF0YS5cbiAgICovXG4gIEN1c3RvbVBhcmFtZXRlciA9ICdjdXN0b20tcGFyYW1ldGVyJyxcblxuICAvKipcbiAgICogQ3VzdG9tIHN0eWxlcyBhcHBsaWNhYmxlIHRvIHRoZSBlbWJlZGRlZCBpZnJhbWUgZWxlbWVudCBpdHNlbGYgKG5vdCBpbnNpZGUgaXQpLlxuICAgKi9cbiAgSWZyYW1lU3R5bGUgPSAnaWZyYW1lLXN0eWxlJyxcbn1cblxuZXhwb3J0IGVudW0gV2ViQ29tcG9uZW50Q2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBOYW1lID0gJ25hbWUnLFxufVxuIiwiLy8gQWxsIGVudW0gdmFsdWVzIG1hZGUgYXZhaWxhYmxlIHRvIEV4dGVuc2lvbnMgZGV2ZWxvcGVycy5cbi8vIEVudW1zIHNob3VsZCBiZSBrZXB0IGluIGFscGhhYmV0aWNhbCBvcmRlci5cblxuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZW5zaW9ucyc7XG5cbm5hbWVzcGFjZSBUYWJsZWF1IHtcbiAgZXhwb3J0IGxldCBleHRlbnNpb25zOiBFeHRlbnNpb25zO1xuICAvKipcbiAgICogQWxsIGVycm9yIGNvZGVzIHVzZWQgYnkgdGhlIEV4dGVuc2lvbnMgQVBJLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRXJyb3JDb2RlcyB7XG4gICAgLyoqXG4gICAgICogVGhyb3duIHdoZW4gY2FsbGVyIGF0dGVtcHRzIHRvIGV4ZWN1dGUgY29tbWFuZCBiZWZvcmUgaW5pdGlhbGl6YXRpb24gaGFzIGNvbXBsZXRlZC5cbiAgICAgKi9cbiAgICBBUElOb3RJbml0aWFsaXplZCA9ICdhcGktbm90LWluaXRpYWxpemVkJyxcbiAgICAvKipcbiAgICAgKiBUaHJvd24gd2hlbiBjYWxsZXIgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBjb21tYW5kIHdoaWxlIGV4dGVuc2lvbiBpcyBub3QgdmlzaWJsZS5cbiAgICAgKi9cbiAgICBWaXNpYmlsaXR5RXJyb3IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gICAgLyoqXG4gICAgICogT25seSBvbmUgZGlhbG9nIGNhbiBiZSBvcGVuZWQgYXQgdGltZSB3aXRoIHRoZSBVSSBuYW1lc3BhY2UgZnVuY3Rpb25hbGl0eS5cbiAgICAgKi9cbiAgICBEaWFsb2dBbHJlYWR5T3BlbiA9ICdkaWFsb2ctYWxyZWFkeS1vcGVuJyxcbiAgICAvKipcbiAgICAgKiBUaGUgb3BlbiBkaWFsb2cgd2FzIGNsb3NlZCBieSB0aGUgdXNlci5cbiAgICAgKi9cbiAgICBEaWFsb2dDbG9zZWRCeVVzZXIgPSAnZGlhbG9nLWNsb3NlZC1ieS11c2VyJyxcbiAgICAvKipcbiAgICAgKiBBbiBlcnJvciBvY2N1cnJlZCB3aXRoaW4gdGhlIFRhYmxlYXUgRXh0ZW5zaW9ucyBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgICAqL1xuICAgIEludGVybmFsRXJyb3IgPSAnaW50ZXJuYWwtZXJyb3InLFxuICAgIC8qKlxuICAgICAqIEEgZGlhbG9nIG11c3Qgc3RhcnQgb24gdGhlIHNhbWUgZG9tYWluIGFzIHRoZSBwYXJlbnQgZXh0ZW5pb24uXG4gICAgICovXG4gICAgSW52YWxpZERvbWFpbkRpYWxvZyA9ICdpbnZhbGlkLWRpYWxvZy1kb21haW4nLFxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZSBmaWVsZC5cbiAgICAgKi9cbiAgICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgICAvKipcbiAgICAgKiBDYW4gb2NjdXIgaWYgdGhlIGV4dGVuc2lvbiBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgICAqL1xuICAgIE1pc3NpbmdGaWx0ZXIgPSAnbWlzc2luZy1maWx0ZXInLFxuICAgIC8qKlxuICAgICAqIENhbiBvY2N1ciBpZiB0aGUgZXh0ZW5zaW9uIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAgICovXG4gICAgTWlzc2luZ1BhcmFtZXRlciA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgU2VydmVyIEVycm9yXG4gICAgICovXG4gICAgU2VydmVyRXJyb3IgPSAnc2VydmVyLWVycm9yJyxcbiAgICAvKipcbiAgICAgKiBEZXZlbG9wZXIgY2Fubm90IHNhdmUgc2V0dGluZ3Mgd2hpbGUgYW5vdGhlciBzYXZlIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAqL1xuICAgIFNldHRpbmdTYXZlSW5Qcm9ncmVzcyA9ICdzZXR0aW5nLXNhdmUtaW4tcHJvZ3Jlc3MnLFxuICAgIC8qKlxuICAgICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIGBhZGRFdmVudExpc3RlbmVyYCBvciBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuXG4gICAgICovXG4gICAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gICAgLyoqXG4gICAgICogQSBtZXRob2Qgd2FzIHVzZWQgZm9yIGEgdHlwZSBvZiBkYXRhIHNvdXJjZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0IG1ldGhvZCAoc2VlIGdldEFjdGl2ZVRhYmxlc0FzeW5jIGZvciBhbiBleGFtcGxlKVxuICAgICAqL1xuICAgIFVuc3VwcG9ydGVkTWV0aG9kRm9yRGF0YVNvdXJjZVR5cGUgPSAndW5zdXBwb3J0ZWQtbWV0aG9kLWZvci1kYXRhLXNvdXJjZS10eXBlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICAgIERlc2t0b3AgPSAnZGVza3RvcCcsXG4gICAgU2VydmVyID0gJ3NlcnZlcicsXG4gICAgQ2xvdWQgPSAnY2xvdWQnLFxuICAgIFB1YmxpY1dlYiA9ICdwdWJsaWMtd2ViJyxcbiAgICBQdWJsaWNEZXNrdG9wID0gJ3B1YmxpYy1kZXNrdG9wJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbk1vZGUge1xuICAgIEF1dGhvcmluZyA9ICdhdXRob3JpbmcnLFxuICAgIFZpZXdpbmcgPSAndmlld2luZycsXG4gIH1cblxuICAvKipcbiAgICogUmVwcmVzZW50cyB0aGUgdHlwZSBvZiBldmVudCB0aGF0IGNhbiBiZSBsaXN0ZW5lZCBmb3IuXG4gICAqL1xuICBleHBvcnQgZW51bSBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgICAvKipcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICogUmFpc2VkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIHRoYXQgd2FzIHNlbnQgYnkgYSBkaWFsb2cgb3IgZXh0ZW5zaW9uIHZpYSBgc2VuZERpYWxvZ01lc3NhZ2VBc3luY2AuKi9cbiAgICBEaWFsb2dNZXNzYWdlUmVjZWl2ZWQgPSAnZGlhbG9nLW1lc3NhZ2UtcmVjZWl2ZWQnLFxuXG4gICAgLyoqIFJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuKi9cbiAgICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhcyBjaGFuZ2VkLlxuICAgICAqIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuICovXG4gICAgTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnbWFyay1zZWxlY3Rpb24tY2hhbmdlZCcsXG5cbiAgICAvKiogVGhlIHN1bW1hcnkgZGF0YSBiYWNraW5nIGEgd29ya3NoZWV0IGhhcyBjaGFuZ2VkXG4gICAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1dvcmtzaGVldF0oLi4vaW50ZXJmYWNlcy93b3Jrc2hlZXQuaHRtbCkgb2JqZWN0cy4qL1xuICAgIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy4gKi9cbiAgICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBTZXR0aW5ncyBoYXZlIGJlZW4gY2hhbmdlZCBmb3IgdGhpcyBleHRlbnNpb24uIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbU2V0dGluZ3NdXSBvYmplY3RzLiAqL1xuICAgIFNldHRpbmdzQ2hhbmdlZCA9ICdzZXR0aW5ncy1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgZGFzaGJvYXJkIGxheW91dCBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIERhc2hib2FyZExheW91dENoYW5nZWQgPSAnZGFzaGJvYXJkLWxheW91dC1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgd29ya2Jvb2sgZm9ybWF0dGluZyBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQgPSAnd29ya2Jvb2stZm9ybWF0dGluZy1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgd29ya3NoZWV0IGZvcm1hdHRpbmcgaGFzIGNoYW5nZWRcbiAgICAgKiBAY2F0ZWdvcnkgVml6IEV4dGVuc2lvbnNcbiAgICAgKi9cbiAgICBXb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZCA9ICd3b3Jrc2hlZXQtZm9ybWF0dGluZy1jaGFuZ2VkJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgZGF0YSB0eXBlIG9mIGVuY29kaW5ncyBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuNi4wXG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZUVuY29kaW5nVHlwZSB7XG4gICAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICAgIENvbnRpbnVvdXMgPSAnY29udGludW91cycsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHNvcnQgZGlyZWN0aW9uIGZvciBjcmVhdGVWaXpJbWFnZUFzeW5jLlxuICAgKiBAc2luY2UgMS44LjAgYW5kIFRhYmxlYXUgMjAyMS40XG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZVNvcnREaXJlY3Rpb25UeXBlIHtcbiAgICBBc2NlbmRpbmcgPSAnYXNjZW5kaW5nJyxcbiAgICBEZXNjZW5kaW5nID0gJ2Rlc2NlbmRpbmcnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBwYWxldHRlIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlUGFsZXR0ZVR5cGUge1xuICAgIEN1c3RvbURpdmVyZ2luZyA9ICdjdXN0b20tZGl2ZXJnaW5nJyxcbiAgICBDdXN0b21TZXF1ZW50aWFsID0gJ2N1c3RvbS1zZXF1ZW50aWFsJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgU2l6ZSBTZXR0aW5nIHR5cGUgZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlU2l6ZVNldHRpbmdUeXBlIHtcbiAgICBGaXhlZCA9ICdmaXhlZCcsXG4gICAgTWFudWFsID0gJ21hbnVhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIFNpemUgU2V0dGluZyBhbGlnbm1lbnQgdHlwZSBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuOC4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgZXhwb3J0IGVudW0gVml6SW1hZ2VTaXplU2V0dGluZ0FsaWdubWVudFR5cGUge1xuICAgIFJpZ2h0ID0gJ3JpZ2h0JyxcbiAgICBMZWZ0ID0gJ2xlZnQnLFxuICAgIENlbnRlciA9ICdjZW50ZXInLFxuICB9XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiZXhwb3J0IGVudW0gU2hhcmVkRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBBIENTViBvciBFeGNlbCBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkIGluIFZpei5leHBvcnRDcm9zc3RhYkFzeW5jKCkuXG4gICAqL1xuICBDcm9zc3RhYkNyZWF0aW9uRXJyb3IgPSAnY3Jvc3N0YWItY3JlYXRpb24tZXJyb3InLFxuICAvKipcbiAgICogQSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0RGF0YUFzeW5jKCkuXG4gICAqL1xuICBEYXRhQ3JlYXRpb25FcnJvciA9ICdkYXRhLWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgYWdncmVnYXRpb24gd2FzIHNwZWNpZmllZCBmb3IgdGhlIGZpbHRlciwgc3VjaCBhcyBzZXR0aW5nIGEgcmFuZ2UgZmlsdGVyIHRvIFwiU1VNKFNhbGVzKVwiIGluc3RlYWQgb2ZcbiAgICogXCJTYWxlc1wiLlxuICAgKi9cbiAgSW52YWxpZEFnZ3JlZ2F0aW9uRmllbGROYW1lID0gJ2ludmFsaWQtYWdncmVnYXRpb24tZmllbGQtbmFtZScsXG4gIC8qKlxuICAgKiBBIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgSW52YWxpZEZpbHRlckZpZWxkTmFtZSA9ICdpbnZhbGlkLWZpbHRlci1uYW1lJyxcbiAgLyoqXG4gICAqIEEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHVzaW5nIGEgdmFsdWUgdGhhdCBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIEludmFsaWRGaWx0ZXJGaWVsZFZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkVmFsdWUnLFxuICAvKipcbiAgICogQW4gaW52YWxpZCBkYXRlIHZhbHVlIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCBmb3IgYSBkYXRlIGZpZWxkLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvbkRhdGUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZGF0ZScsXG4gIC8qKlxuICAgKiBBIGZpZWxkIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhIHNvdXJjZS5cbiAgICovXG4gIEludmFsaWRTZWxlY3Rpb25GaWVsZE5hbWUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZmllbGROYW1lJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBpbiBhIFNoZWV0LnNlbGVjdE1hcmtzQXN5bmMoKSBjYWxsLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblZhbHVlID0gJ2ludmFsaWQtc2VsZWN0aW9uLXZhbHVlJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGRpZCBub3QgaW5jbHVkZSBhIHZhbGlkIHNoZWV0IHNlbGVjdGlvbiBmb3IgZXhwb3J0aW5nLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblNoZWV0ID0gJ2ludmFsaWQtc2VsZWN0aW9uLXNoZWV0JyxcbiAgLyoqXG4gICAqIEFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgVGFibGVhdSBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBIHBhcmFtZXRlciBpcyBub3QgdGhlIGNvcnJlY3QgZGF0YSB0eXBlIG9yIGZvcm1hdC4gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgaW4gdGhlIEVycm9yLm1lc3NhZ2UgZmllbGQuXG4gICAqL1xuICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEEgUERGIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQgaW4gVml6LmV4cG9ydFBERkFzeW5jKCkuXG4gICAqL1xuICBQREZDcmVhdGlvbkVycm9yID0gJ3BkZi1jcmVhdGlvbi1lcnJvcicsXG4gIC8qKlxuICAgKiBBIFBvd2VyUG9pbnQgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKCkuXG4gICAqL1xuICBQb3dlclBvaW50Q3JlYXRpb25FcnJvciA9ICdwb3dlcnBvaW50LWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBpcyBub3QgYWN0aXZlIG9yIGVtYmVkZGVkIHdpdGhpbiB0aGUgYWN0aXZlIGRhc2hib2FyZC5cbiAgICovXG4gIE5vdEFjdGl2ZVNoZWV0ID0gJ25vdC1hY3RpdmUtc2hlZXQnLFxuICAvKipcbiAgICogUHJvcGVydHkgb3IgRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoaW4gdGhlIFRhYmxlYXUgQVBJLlxuICAgKi9cbiAgSW1wbGVtZW50YXRpb25FcnJvciA9ICd3cm9uZy1pbXBsZW1lbnRhdGlvbicsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgd2hlbiB0d28gaW5jb21wYXRpYmxlIGNhbGxzIGFyZSB0cmlnZ2VyZWQgdG9nZXRoZXIuXG4gICAqL1xuICBBcGlFeGVjdXRpb25FcnJvciA9ICdhcGktZXhlY3V0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEEgZ2VuZXJhbC1wdXJwb3NlIHNlcnZlciBlcnJvciBvY2N1cnJlZC4gRGV0YWlscyBhcmUgY29udGFpbmVkIGluIHRoZSBFcnJvciBvYmplY3QuXG4gICAqL1xuICBTZXJ2ZXJFcnJvciA9ICdzZXJ2ZXItZXJyb3InLFxuICAvKipcbiAgICogQ2FuIG9jY3VyIHdoZW4gYW4gYXBpIGNhbGwgdGltZXMgb3V0LlxuICAgKi9cbiAgVGltZW91dCA9ICd0aW1lb3V0Jyxcbn1cbiIsIi8qKlxuICogVGhlIHRhYmxlYXUgbmFtZXNwYWNlIGV4aXN0cyBmb3Igb3JnYW5pemF0aW9uIGFuZCB0byBhdm9pZCBwb2xsdXRpbmdcbiAqIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBJdCBjb250YWlucyBubyBjb25zdHJ1Y3RzIG90aGVyIHRoYW4gc3ViLW5hbWVzcGFjZXMgYW5kIHRoZSBUYWJsZWF1IGVudW1lcmF0aW9ucy5cbiAqL1xubmFtZXNwYWNlIFRhYmxlYXUge1xuICBleHBvcnQgZW51bSBBbmFseXRpY3NPYmplY3RUeXBlIHtcbiAgICBDbHVzdGVyID0gJ2NsdXN0ZXInLFxuICAgIEZvcmVjYXN0ID0gJ2ZvcmVjYXN0JyxcbiAgICBUcmVuZExpbmUgPSAndHJlbmQtbGluZScsXG4gIH1cblxuICBleHBvcnQgZW51bSBBbm5vdGF0aW9uVHlwZSB7XG4gICAgTWFyayA9ICdtYXJrJyxcbiAgICBQb2ludCA9ICdwb2ludCcsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIENvbHVtblR5cGUge1xuICAgIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgICBDb250aW51b3VzID0gJ2NvbnRpbnVvdXMnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICBleHBvcnQgZW51bSBDbGFzc05hbWVLZXkge1xuICAgIFdvcmtzaGVldFRpdGxlID0gJ3RhYmxlYXUtd29ya3NoZWV0LXRpdGxlJyxcbiAgICBXb3Jrc2hlZXQgPSAndGFibGVhdS13b3Jrc2hlZXQnLFxuICAgIFRvb2x0aXAgPSAndGFibGVhdS10b29sdGlwJyxcbiAgICBTdG9yeVRpdGxlID0gJ3RhYmxlYXUtc3RvcnktdGl0bGUnLFxuICAgIERhc2hib2FyZFRpdGxlID0gJ3RhYmxlYXUtZGFzaGJvYXJkLXRpdGxlJyxcbiAgICBQYW5lID0gJ3RhYmxlYXUtcGFuZScsXG4gICAgUm93RGl2aWRlcnMgPSAndGFibGVhdS1yb3ctZGl2aWRlcnMnLFxuICAgIENvbHVtbkRpdmlkZXJzID0gJ3RhYmxlYXUtY29sdW1uLWRpdmlkZXJzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBXaGF0IHRoZSBvYmplY3QgcmVwcmVzZW50cyBpbiBhIGRhc2hib2FyZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhc2hib2FyZE9iamVjdFR5cGUge1xuICAgIEJsYW5rID0gJ2JsYW5rJyxcbiAgICBXb3Jrc2hlZXQgPSAnd29ya3NoZWV0JyxcbiAgICBRdWlja0ZpbHRlciA9ICdxdWljay1maWx0ZXInLFxuICAgIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICAgIFBhZ2VGaWx0ZXIgPSAncGFnZS1maWx0ZXInLFxuICAgIExlZ2VuZCA9ICdsZWdlbmQnLFxuICAgIFRpdGxlID0gJ3RpdGxlJyxcbiAgICBUZXh0ID0gJ3RleHQnLFxuICAgIEltYWdlID0gJ2ltYWdlJyxcbiAgICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgICBFeHRlbnNpb24gPSAnZXh0ZW5zaW9uJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgdmlzaWJpbGl0eSBzdGF0ZSBvZiBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUge1xuICAgIC8qKiBVc2VkIGZvciB0dXJuaW5nIG9uIHRoZSB2aXNpYmlsaXR5IG9mIGEgZGFzaGJvYXJkIG9iamVjdC4qL1xuICAgIFNob3cgPSAnc2hvdycsXG5cbiAgICAvKiogVXNlZCBmb3IgdHVybmluZyBvZmYgdGhlIHZpc2liaWxpdHkgb2YgYSBkYXNoYm9hcmQgb2JqZWN0LiovXG4gICAgSGlkZSA9ICdoaWRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHR5cGVzIG9mIGRhdGEgYSB2YWx1ZSBjYW4gaGF2ZVxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGF0YVR5cGUge1xuICAgIFN0cmluZyA9ICdzdHJpbmcnLFxuICAgIEludCA9ICdpbnQnLFxuICAgIEZsb2F0ID0gJ2Zsb2F0JyxcbiAgICBCb29sID0gJ2Jvb2wnLFxuICAgIERhdGUgPSAnZGF0ZScsXG4gICAgRGF0ZVRpbWUgPSAnZGF0ZS10aW1lJyxcbiAgICBTcGF0aWFsID0gJ3NwYXRpYWwnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIGNoYW5nZXMgdGhhdCBvY2N1ciB0byBhIGRhc2hib2FyZCBvYmplY3QuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXNoYm9hcmRMYXlvdXRDaGFuZ2Uge1xuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3Qgd2FzIGFkZGVkICovXG4gICAgQWRkZWQgPSAnYWRkZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCB3YXMgcmVtb3ZlZCAqL1xuICAgIFJlbW92ZWQgPSAncmVtb3ZlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0J3MgZmxvYXRpbmcgc3RhdGUgY2hhbmdlZCAqL1xuICAgIElzRmxvYXRpbmdDaGFuZ2VkID0gJ2lzLWZsb2F0aW5nLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHZpc2liaWxpdHkgY2hhbmdlZCAqL1xuICAgIElzVmlzaWJsZUNoYW5nZWQgPSAnaXMtdmlzaWJsZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QncyBwb3NpdGlvbiBjaGFuZ2VkICovXG4gICAgUG9zaXRpb25DaGFuZ2VkID0gJ3Bvc2l0aW9uLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHNpemUgY2hhbmdlZCAqL1xuICAgIFNpemVDaGFuZ2VkID0gJ3NpemUtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IHdhcyByZW5hbWVkICovXG4gICAgTmFtZUNoYW5nZWQgPSAnbmFtZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QgaXMgc2VsZWN0ZWQgKi9cbiAgICBTZWxlY3RlZCA9ICdzZWxlY3RlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IGlzIGRlc2VsZWN0ZWQgKi9cbiAgICBEZXNlbGVjdGVkID0gJ2Rlc2VsZWN0ZWQnLFxuXG4gICAgLyoqIE5hdmlnYXRlIHRvIGFub3RoZXIgZGFzaGJvYXJkICovXG4gICAgRGFzaGJvYXJkQ2hhbmdlZCA9ICdkYXNoYm9hcmQtY2hhbmdlZCcsXG4gIH1cblxuICAvKipcbiAgICogVmFsaWQgZGF0ZSByYW5nZXMgZm9yIGEgcmVsYXRpdmUgZGF0ZSBmaWx0ZXIuXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXRlUmFuZ2VUeXBlIHtcbiAgICBMYXN0ID0gJ2xhc3QnLFxuICAgIExhc3ROID0gJ2xhc3QtbicsXG4gICAgTmV4dCA9ICduZXh0JyxcbiAgICBOZXh0TiA9ICduZXh0LW4nLFxuICAgIEN1cnJlbnQgPSAnY3VycmVudCcsXG4gICAgVG9EYXRlID0gJ3RvLWRhdGUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSB0eXBlcyBvZiBkaWFsb2cgcG9wdXAgc3R5bGVzLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGlhbG9nU3R5bGUge1xuICAgIFdpbmRvdyA9ICd3aW5kb3cnLFxuICAgIE1vZGFsID0gJ21vZGFsJyxcbiAgICBNb2RlbGVzcyA9ICdtb2RlbGVzcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBFbmNvZGluZ1R5cGUge1xuICAgIENvbHVtbiA9ICdjb2x1bW4nLFxuICAgIFJvdyA9ICdyb3cnLFxuICAgIFBhZ2UgPSAncGFnZScsXG4gICAgRmlsdGVyID0gJ2ZpbHRlcicsXG4gICAgTWFya3NUeXBlID0gJ21hcmtzLXR5cGUnLFxuICAgIE1lYXN1cmVWYWx1ZXMgPSAnbWVhc3VyZS12YWx1ZXMnLFxuICAgIENvbG9yID0gJ2NvbG9yJyxcbiAgICBTaXplID0gJ3NpemUnLFxuICAgIExhYmVsID0gJ2xhYmVsJyxcbiAgICBEZXRhaWwgPSAnZGV0YWlsJyxcbiAgICBUb29sdGlwID0gJ3Rvb2x0aXAnLFxuICAgIFNoYXBlID0gJ3NoYXBlJyxcbiAgICBQYXRoID0gJ3BhdGgnLFxuICAgIEFuZ2xlID0gJ2FuZ2xlJyxcbiAgICBHZW9tZXRyeSA9ICdnZW9tZXRyeScsXG4gICAgQ3VzdG9tID0gJ2N1c3RvbScsXG4gIH1cblxuICAvKipcbiAgICogIFR5cGUgb2YgYWdncmVnYXRpb24gb24gYSBmaWVsZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpZWxkQWdncmVnYXRpb25UeXBlIHtcbiAgICBTdW0gPSAnc3VtJyxcbiAgICBBdmcgPSAnYXZnJyxcbiAgICBNaW4gPSAnbWluJyxcbiAgICBNYXggPSAnbWF4JyxcbiAgICBTdGRldiA9ICdzdGRldicsXG4gICAgU3RkZXZwID0gJ3N0ZGV2cCcsXG4gICAgVmFyID0gJ3ZhcicsXG4gICAgVmFycCA9ICd2YXJwJyxcbiAgICBDb2xsZWN0ID0gJ2NvbGxlY3QnLFxuICAgIENvdW50ID0gJ2NvdW50JyxcbiAgICBDb3VudGQgPSAnY291bnRkJyxcbiAgICBNZWRpYW4gPSAnbWVkaWFuJyxcbiAgICBBdHRyID0gJ2F0dHInLFxuICAgIE5vbmUgPSAnbm9uZScsXG4gICAgWWVhciA9ICd5ZWFyJyxcbiAgICBRdHIgPSAncXRyJyxcbiAgICBNb250aCA9ICdtb250aCcsXG4gICAgRGF5ID0gJ2RheScsXG4gICAgSG91ciA9ICdob3VyJyxcbiAgICBNaW51dGUgPSAnbWludXRlJyxcbiAgICBTZWNvbmQgPSAnc2Vjb25kJyxcbiAgICBXZWVrID0gJ3dlZWsnLFxuICAgIFdlZWtkYXkgPSAnd2Vla2RheScsXG4gICAgTW9udGhZZWFyID0gJ21vbnRoLXllYXInLFxuICAgIE1keSA9ICdtZHknLFxuICAgIEVuZCA9ICdlbmQnLFxuICAgIFRydW5jWWVhciA9ICd0cnVuYy15ZWFyJyxcbiAgICBUcnVuY1F0ciA9ICd0cnVuYy1xdHInLFxuICAgIFRydW5jTW9udGggPSAndHJ1bmMtbW9udGgnLFxuICAgIFRydW5jV2VlayA9ICd0cnVuYy13ZWVrJyxcbiAgICBUcnVuY0RheSA9ICd0cnVuYy1kYXknLFxuICAgIFRydW5jSG91ciA9ICd0cnVuYy1ob3VyJyxcbiAgICBUcnVuY01pbnV0ZSA9ICd0cnVuYy1taW51dGUnLFxuICAgIFRydW5jU2Vjb25kID0gJ3RydW5jLXNlY29uZCcsXG4gICAgUXVhcnQxID0gJ3F1YXJ0MScsXG4gICAgUXVhcnQzID0gJ3F1YXJ0MycsXG4gICAgU2tld25lc3MgPSAnc2tld25lc3MnLFxuICAgIEt1cnRvc2lzID0gJ2t1cnRvc2lzJyxcbiAgICBJbk91dCA9ICdpbi1vdXQnLFxuICAgIFVzZXIgPSAndXNlcicsXG4gIH1cblxuICAvKipcbiAgICogUm9sZSBvZiBhIGZpZWxkLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gICAgRGltZW5zaW9uID0gJ2RpbWVuc2lvbicsXG4gICAgTWVhc3VyZSA9ICdtZWFzdXJlJyxcbiAgICBVbmtub3duID0gJ3Vua25vd24nLFxuICB9XG5cbiAgLyoqXG4gICAqIEFuIGVudW1lcmF0aW9uIG9mIHRoZSB2YWxpZCB0eXBlcyBvZiBmaWx0ZXJzIHRoYXQgY2FuIGJlIGFwcGxpZWQuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJUeXBlIHtcbiAgICBDYXRlZ29yaWNhbCA9ICdjYXRlZ29yaWNhbCcsXG4gICAgUmFuZ2UgPSAncmFuZ2UnLFxuICAgIEhpZXJhcmNoaWNhbCA9ICdoaWVyYXJjaGljYWwnLFxuICAgIFJlbGF0aXZlRGF0ZSA9ICdyZWxhdGl2ZS1kYXRlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgICBBZGQgPSAnYWRkJyxcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICAgIFJlbW92ZSA9ICdyZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkb21haW4gdHlwZSBmb3IgYSBmaWx0ZXJcbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICAgIC8qKlxuICAgICAqIFRoZSBkb21haW4gdmFsdWVzIHRoYXQgYXJlIHJlbGV2YW50IHRvIHRoZSBzcGVjaWZpZWQgZmlsdGVyXG4gICAgICogaS5lLiB0aGUgZG9tYWluIGlzIHJlc3RyaWN0ZWQgYnkgYSBwcmV2aW91cyBmaWx0ZXJcbiAgICAgKi9cbiAgICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gICAgLyoqXG4gICAgICogbGlzdCBvZiBhbGwgcG9zc2libGUgZG9tYWluIHZhbHVlcyBmcm9tIGRhdGFiYXNlXG4gICAgICovXG4gICAgRGF0YWJhc2UgPSAnZGF0YWJhc2UnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvcHRpb24gZm9yIHNwZWNpZnlpbmcgd2hpY2ggdmFsdWVzIHRvIGluY2x1ZGUgZm9yIGZpbHRlcmluZ1xuICAgKiBJbmRpY2F0ZXMgd2hhdCB0byBkbyB3aXRoIG51bGwgdmFsdWVzIGZvciBhIGdpdmVuIGZpbHRlciBvciBtYXJrIHNlbGVjdGlvbiBjYWxsLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmlsdGVyTnVsbE9wdGlvbiB7XG4gICAgTnVsbFZhbHVlcyA9ICdudWxsLXZhbHVlcycsXG4gICAgTm9uTnVsbFZhbHVlcyA9ICdub24tbnVsbC12YWx1ZXMnLFxuICAgIEFsbFZhbHVlcyA9ICdhbGwtdmFsdWVzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgc2VydmVzIGFzIGEgZmlsdGVyIG9uIHRoZSBEYXRhVmFsdWVzIHJldHVybmVkIGZyb20gYGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmNgLFxuICAgKiBgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jYCBhbmQgYGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luY2AuXG4gICAqIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uIG9mIHJldHVybmVkIGRhdGEgdmFsdWVzIG9ubHkuIFRhYmxlYXUgdmVyc2lvbnMgcHJpb3IgdG8gMjAyMS4yXG4gICAqIHdpbGwgcGFzcyB0aGUgZGF0YSBhY3Jvc3MgYW5kIHBvcHVsYXRlIHRoZSBEYXRhVmFsdWUgcHJvcGVydGllcy5cbiAgICogUGxlYXNlIG5vdGUgdGhhdCBhbGwgcHJvcGVydGllcyBub3QgcmVxdWVzdGVkIHdpbGwgYmUgYHVuZGVmaW5lZGAgaW4gdGhlIERhdGFWYWx1ZSByZXN1bHRzLlxuICAgKiBAc2luY2UgMS41LjBcbiAgICovXG4gIGV4cG9ydCBlbnVtIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHtcbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIGluY2x1ZGUgYWxsIHByb3BlcnRpZXMuKi9cbiAgICBBbGxWYWx1ZXMgPSAnYWxsLXZhbHVlcycsXG5cbiAgICAvKiogRGF0YVZhbHVlcyB3aWxsIG9ubHkgaW5jbHVkZSB2YWx1ZSBhbmQgbmF0aXZlVmFsdWUgcHJvcGVydGllcy4qL1xuICAgIE9ubHlOYXRpdmVWYWx1ZXMgPSAnb25seS1uYXRpdmUtdmFsdWVzJyxcblxuICAgIC8qKiBEYXRhVmFsdWVzIHdpbGwgb25seSBpbmNsdWRlIGZvcm1hdHRlZFZhbHVlIHByb3BlcnRpZXMuICovXG4gICAgT25seUZvcm1hdHRlZFZhbHVlcyA9ICdvbmx5LWZvcm1hdHRlZC12YWx1ZXMnLFxuICB9XG5cbiAgLyoqXG4gICAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICAgKi9cbiAgZXhwb3J0IGVudW0gTWFya1R5cGUge1xuICAgIEJhciA9ICdiYXInLFxuICAgIExpbmUgPSAnbGluZScsXG4gICAgQXJlYSA9ICdhcmVhJyxcbiAgICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgICBDaXJjbGUgPSAnY2lyY2xlJyxcbiAgICBTaGFwZSA9ICdzaGFwZScsXG4gICAgVGV4dCA9ICd0ZXh0JyxcbiAgICBNYXAgPSAnbWFwJyxcbiAgICBQaWUgPSAncGllJyxcbiAgICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICAgIFBvbHlnb24gPSAncG9seWdvbicsXG4gICAgSGVhdG1hcCA9ICdoZWF0bWFwJyxcbiAgICBWaXpFeHRlbnNpb24gPSAndml6LWV4dGVuc2lvbicsXG4gIH1cblxuICAvKipcbiAgICogQW4gZW51bWVyYXRpb24gZGVzY3JpYmluZyB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGFsbG93YWJsZSB2YWx1ZXMuXG4gICAqIFRoaXMgaXMgdXNlZCBmb3IgcmVzdHJpY3RpbmcgdGhlIGRvbWFpbiBvZiBhIHBhcmFtZXRlclxuICAgKi9cbiAgZXhwb3J0IGVudW0gUGFyYW1ldGVyVmFsdWVUeXBlIHtcbiAgICBBbGwgPSAnYWxsJyxcbiAgICBMaXN0ID0gJ2xpc3QnLFxuICAgIFJhbmdlID0gJ3JhbmdlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBEYXRlIHBlcmlvZCB1c2VkIGluIGZpbHRlcnMgYW5kIGluIHBhcmFtZXRlcnMuXG4gICAqL1xuICBleHBvcnQgZW51bSBQZXJpb2RUeXBlIHtcbiAgICBZZWFycyA9ICd5ZWFycycsXG4gICAgUXVhcnRlcnMgPSAncXVhcnRlcnMnLFxuICAgIE1vbnRocyA9ICdtb250aHMnLFxuICAgIFdlZWtzID0gJ3dlZWtzJyxcbiAgICBEYXlzID0gJ2RheXMnLFxuICAgIEhvdXJzID0gJ2hvdXJzJyxcbiAgICBNaW51dGVzID0gJ21pbnV0ZXMnLFxuICAgIFNlY29uZHMgPSAnc2Vjb25kcycsXG4gICAgSXNvWWVhcnMgPSAnaXNvLXllYXJzJyxcbiAgICBJc29RdWFydGVycyA9ICdpc28tcXVhcnRlcnMnLFxuICAgIElzb1dlZWtzID0gJ2lzby13ZWVrcycsXG4gIH1cblxuICBleHBvcnQgZW51bSBRdWlja1RhYmxlQ2FsY1R5cGUge1xuICAgIFJ1bm5pbmdUb3RhbCA9ICdydW5uaW5nLXRvdGFsJyxcbiAgICBEaWZmZXJlbmNlID0gJ2RpZmZlcmVuY2UnLFxuICAgIFBlcmNlbnREaWZmZXJlbmNlID0gJ3BlcmNlbnQtZGlmZmVyZW5jZScsXG4gICAgUGVyY2VudE9mVG90YWwgPSAncGVyY2VudC1vZi10b3RhbCcsXG4gICAgUmFuayA9ICdyYW5rJyxcbiAgICBQZXJjZW50aWxlID0gJ3BlcmNlbnRpbGUnLFxuICAgIE1vdmluZ0F2ZXJhZ2UgPSAnbW92aW5nLWF2ZXJhZ2UnLFxuICAgIFlURFRvdGFsID0gJ3l0ZC10b3RhbCcsXG4gICAgQ29tcG91bmRHcm93dGhSYXRlID0gJ2NvbXBvdW5kLWdyb3d0aC1yYXRlJyxcbiAgICBZZWFyT3ZlclllYXJHcm93dGggPSAneWVhci1vdmVyLXllYXItZ3Jvd3RoJyxcbiAgICBZVERHcm93dGggPSAneXRkLWdyb3d0aCcsXG4gICAgVW5kZWZpbmVkID0gJ3VuZGVmaW5lZCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSBmb3Igc3BlY2lmeWluZyB0aGUgc2VsZWN0aW9uIHR5cGUgZm9yIHNlbGVjdCBtYXJrcyBhcGkuXG4gICAqL1xuICBleHBvcnQgZW51bSBTZWxlY3Rpb25VcGRhdGVUeXBlIHtcbiAgICBSZXBsYWNlID0gJ3NlbGVjdC1yZXBsYWNlJyxcbiAgICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gICAgUmVtb3ZlID0gJ3NlbGVjdC1yZW1vdmUnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gZm9yIHNwZWNpZnlpbmcgdGhlIHNlbGVjdCBvcHRpb24gZm9yIHRoZSBgZXh0ZW5zaW9ucy5Xb3Jrc2hlZXQuc2VsZWN0VHVwbGVzQXN5bmNgIG1ldGhvZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIFNlbGVjdE9wdGlvbnMge1xuICAgIC8qKlxuICAgICAqIENsZWFycyBleGlzdGluZyBzZWxlY3Rpb24gYmVmb3JlIHNlbGVjdGluZyB0aGUgdHVwbGVzIHNwZWNpZmllZFxuICAgICAqL1xuICAgIFNpbXBsZSA9ICdzZWxlY3Qtb3B0aW9ucy1zaW1wbGUnLFxuICAgIC8qKlxuICAgICAqIEFkZHMgc3BlY2lmaWVkIHR1cGxlcyB0byB0aGUgZXhpc3Rpbmcgc2VsZWN0aW9uXG4gICAgICovXG4gICAgVG9nZ2xlID0gJ3NlbGVjdC1vcHRpb25zLXRvZ2dsZScsXG4gIH1cblxuICAvKipcbiAgICogVGhlIHR5cGUgb2Ygc2hlZXQgYSBbW1NoZWV0XV0gb2JqZWN0IHJlcHJlc2VudHNcbiAgICovXG4gIGV4cG9ydCBlbnVtIFNoZWV0VHlwZSB7XG4gICAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gICAgU3RvcnkgPSAnc3RvcnknLFxuICAgIFdvcmtzaGVldCA9ICd3b3Jrc2hlZXQnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gU29ydERpcmVjdGlvbiB7XG4gICAgSW5jcmVhc2luZyA9ICdpbmNyZWFzaW5nJyxcbiAgICBEZWNyZWFzaW5nID0gJ2RlY3JlYXNpbmcnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gVHJlbmRMaW5lTW9kZWxUeXBlIHtcbiAgICBMaW5lYXIgPSAnbGluZWFyJyxcbiAgICBMb2dhcml0aG1pYyA9ICdsb2dhcml0aG1pYycsXG4gICAgRXhwb25lbnRpYWwgPSAnZXhwb25lbnRpYWwnLFxuICAgIFBvbHlub21pYWwgPSAncG9seW5vbWlhbCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHJlcGxheSBzcGVlZCBvZiBhbiBhbmltYXRpb24uXG4gICAqIEBzaW5jZSAxLjcuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gUmVwbGF5U3BlZWRUeXBlIHtcbiAgICAvKiogVXNlZCBmb3Igc2V0dGluZyB0aGUgcmVwbGF5IHNwZWVkIG9mIGFuIGFuaW1hdGlvbiB0byAwLjV4LiovXG4gICAgU2xvdyA9ICdzbG93JyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDEuMHguKi9cbiAgICBOb3JtYWwgPSAnbm9ybWFsJyxcblxuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDIuMHguKi9cbiAgICBGYXN0ID0gJ2Zhc3QnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBzZWxlY3Rpb24gc3RhdGUgb2YgYSBsZXZlbCBpbiBhIGhpZXJhcmNoaWNhbCBmaWx0ZXJcbiAgICogQHNpbmNlIEV4dGVuc2lvbnMgMS4xMC4wXG4gICAqL1xuICBleHBvcnQgZW51bSBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIHtcbiAgICBBbGxTZWxlY3RlZCA9ICdhbGwtc2VsZWN0ZWQnLFxuICAgIE5vbmVTZWxlY3RlZCA9ICdub25lLXNlbGVjdGVkJyxcbiAgICBTb21lU2VsZWN0ZWQgPSAnc29tZS1zZWxlY3RlZCcsXG4gICAgVW5rbm93blNlbGVjdGVkID0gJ3Vua25vd24tc2VsZWN0ZWQnLFxuICB9XG5cbiAgLyoqXG4gICAqIFpvbmVWaXNpYmlsaXR5VHlwZVxuICAgKiBAZGVwcmVjYXRlZCB1c2UgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGVcbiAgICovXG4gIGV4cG9ydCBkZWNsYXJlIHR5cGUgWm9uZVZpc2liaWxpdHlUeXBlID0gRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGU7XG4gIGV4cG9ydCBjb25zdCBab25lVmlzaWJpbGl0eVR5cGUgPSB7IC4uLkRhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlIH07XG59XG5leHBvcnQgPSBUYWJsZWF1O1xuIiwiLy8gVGhpcyBmaWxlIHJlLWV4cG9ydHMgZXZlcnl0aGluZyB3aGljaCBpcyBwYXJ0IG9mIHRoZSBzaGFyZWQgYXBpIHB1YmxpYyBpbnRlcmZhY2VcblxuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Bbm5vdGF0aW9uSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0RhdGFTb3VyY2VJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRGF0YVRhYmxlSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRW52aXJvbm1lbnRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRmlsdGVySW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBBbmFseXRpY3NPYmplY3RUeXBlLFxuICBBbm5vdGF0aW9uVHlwZSxcbiAgQ2xhc3NOYW1lS2V5LFxuICBDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UsXG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLFxuICBEYXRhVHlwZSxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRGlhbG9nU3R5bGUsXG4gIEVuY29kaW5nVHlwZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlckRvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24sXG4gIEZpbHRlclR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBNYXJrVHlwZSxcbiAgUGFyYW1ldGVyVmFsdWVUeXBlLFxuICBQZXJpb2RUeXBlLFxuICBRdWlja1RhYmxlQ2FsY1R5cGUsXG4gIFJlcGxheVNwZWVkVHlwZSxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2VsZWN0T3B0aW9ucyxcbiAgU2hlZXRUeXBlLFxuICBTb3J0RGlyZWN0aW9uLFxuICBUcmVuZExpbmVNb2RlbFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9TZWxlY3Rpb25JbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvU2hlZXRJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvVmlzdWFsTW9kZWxJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9Xb3JrYm9va0Zvcm1hdHRpbmdJbnRlcmZhY2VzJztcbiIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuLy8gRXhwb3J0IHRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB0byBiZSBhdmFpbGFibGUgYXQgcnVudGltZVxuLy8gIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnkgeWFybiBwdWJsaXNoOmJ1bXAgdmlhIHNjcmlwdHMvcHVibGlzaC1jaGVjay50c1xuLy8gIHVwZGF0ZUludGVybmFsQ29udHJhY3RSdW50aW1lVmVyc2lvbiBpbiB0aGUgbW9ub3JlcG8gcm9vdC5cbmltcG9ydCAqIGFzIGludGVybmFsQ29udHJhY3RWZXJzaW9uIGZyb20gJy4uL2ludGVybmFsLWNvbnRyYWN0LXZlcnNpb24uanNvbic7XG5leHBvcnQgY29uc3QgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiA9IGludGVybmFsQ29udHJhY3RWZXJzaW9uO1xuXG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L0RhdGFUeXBlQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvRW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9Nb2RlbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9Ob3RpZmljYXRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvUGFyYW1ldGVycyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L1ZlcmJzJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0Fza0RhdGFJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0ludGVybmFsQXBpRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9QdWxzZUludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9WZXJzaW9uTnVtYmVyJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL1ZxbEludGVyZmFjZSc7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9Dcm9zc0ZyYW1lTWVzc2VuZ2VyJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzYWdlRGlzcGF0Y2hlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZUxpc3RlbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3Nlbmdlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsVmVyc2lvbkNvbnZlcnRlckZhY3RvcnknO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9WZXJzaW9uQ29udmVydGVyRmFjdG9yeSc7XG5cbi8vIEV4cG9ydCB0aGUgdmVyc2lvbiBudW1iZXIgb2YgbWVzc2FnaW5nIGZvciBjb25zdW1lcnMgdG8gdXNlLlxuLy8gQmUgdmVyeSBjYXJlZnVsIG1ha2luZyBhbnkgdXBkYXRlcyB0byB0aGlzIGNvbnRyYWN0IHdoaWNoIGJyZWFrIHZlcnNpb24gY29tcGF0aWJpbGl0eS5cbmV4cG9ydCBjb25zdCBNRVNTQUdJTkdfVkVSU0lPTiA9IHtcbiAgbWFqb3I6IDEsXG4gIG1pbm9yOiAwLFxuICBmaXg6IDAsXG59O1xuIiwiaW1wb3J0IHsgRGF0YVR5cGUgfSBmcm9tICcuL0VudW1zJztcblxuZXhwb3J0IGNsYXNzIERhdGFUeXBlQ29udmVydGVyIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaXNTcGVjaWFsKHZhbHVlQXNTdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIC8vIFByaW9yIHRvIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHNwZWNpYWwgdmFsdWVzIGNvbWUgdG8gdXMgYXNcbiAgICAvLyAnJW51bGwlJywgJyVhbGwlJywgJyV3aWxkY2FyZCUnLCAnJW1pc3NpbmclJy4uLlxuICAgIC8vIFdoaWxlIHRoaXMgZnVuY3Rpb24gd2lsbCBuZXZlciByZXR1cm4gdHJ1ZSBmb3IgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCBjb252ZXJzaW9uLFxuICAgIC8vIGl0IGlzIGFzIGNoZWFwIGFzIHBhc3NpbmcgYXJvdW5kIGEgdmVyc2lvbiBhbmQgY2hlY2tpbmcgdGhhdC5cbiAgICAvLyAoU2VlIERhdGFWYWx1ZUZvcm1hdHRlci5jcHApXG5cbiAgICBpZiAodmFsdWVBc1N0cmluZy5sZW5ndGggPiAyICYmIHZhbHVlQXNTdHJpbmdbMF0gPT09ICclJyAmJiB2YWx1ZUFzU3RyaW5nW3ZhbHVlQXNTdHJpbmcubGVuZ3RoIC0gMV0gPT09ICclJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHNwZWNpYWxWYWx1ZUluZGljYXRvciA9ICclbnVsbCUnO1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VCb29sZWFuKGJvb2xlYW5TdHJpbmc6IHN0cmluZyk6IGJvb2xlYW4gfCBzdHJpbmcge1xuICAgIC8vIGJvb2xlYW4gdmFsdWVzIGNvbWUgdG8gdXMgYXMgJ3RydWUnfCdmYWxzZSdcbiAgICBjb25zdCBub3JtYWxpemVkQm9vbGVhbjogc3RyaW5nID0gYm9vbGVhblN0cmluZy50b0xvd2VyQ2FzZSgpO1xuICAgIHJldHVybiBub3JtYWxpemVkQm9vbGVhbiAhPT0gJ3RydWUnICYmIG5vcm1hbGl6ZWRCb29sZWFuICE9PSAnZmFsc2UnID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiBub3JtYWxpemVkQm9vbGVhbiA9PT0gJ3RydWUnO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBwcml2YXRlIHN0YXRpYyBwYXJzZU51bWJlcih2YWx1ZUFzU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIgfCBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHVlID0gTnVtYmVyKHZhbHVlQXNTdHJpbmcpO1xuICAgIHJldHVybiBpc05hTih2YWx1ZSkgPyB0aGlzLnNwZWNpYWxWYWx1ZUluZGljYXRvciA6IHZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VEYXRlKGRhdGVBc1N0cmluZzogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIC8vIE5vdGUgdGhhdCB3aXRob3V0IGEgdGltZSwgdGhlIGRhdGUgaXMgYXNzdW1lZCB0byBiZSBVVENcbiAgICAvLyBJbnB1dCBvZiAyMDIwLTAzLTI1IGlzIHByaW50ZWQgYXM6IE1hciAyNCAyMDIwIDE3OjAwOjAwIEdNVC0wNzAwXG4gICAgLy8gVGhpcyBtYXRjaGVzIHN0eWxlIHVzZWQgaW4gZXhpc3RpbmcgY29udmVydEZpbHRlclZhbHVlUHJlc01vZGVsXG4gICAgY29uc3QgdmFsdWUgPSBuZXcgRGF0ZShkYXRlQXNTdHJpbmcpO1xuICAgIHJldHVybiBOdW1iZXIuaXNOYU4odmFsdWUuZ2V0VGltZSgpKSA/IG51bGwgOiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlRGF0ZVRpbWUoZGF0ZUFzU3RyaW5nOiBzdHJpbmcpOiBEYXRlIHwgbnVsbCB7XG4gICAgLy8gV2l0aCBhIHRpbWUsIHRoZSBkYXRlIGlzIGFzc3VtZWQgdG8gYmUgVVRDLlxuICAgIC8vIE91ciBkYXRlIGZvcm1hdCBpcyBhbHdheXM6IHl5eXktbW0tZGQgaGg6bW06c3NcbiAgICAvLyBVbmZvcnR1bmF0ZWx5LCBJRTExIGNhbid0IHBhcnNlIHRoYXQgZm9ybWF0IHNvIHdlIGFkZCBhIFQgYmV0d2VlbiB0aGUgZGF5IGFuZCB0aW1lLlxuICAgIC8vIFdlIGFsc28gYWRkIGEgWiBzbyB0aGF0IGl0IGlzIFVUQy4gKFdpdGhvdXQgdGhlIFosIHNvbWUgYnJvd3NlcnMgYXNzdW1lIGxvY2FsLCBhbmQgb3RoZXJzIFVUQylcbiAgICAvLyBFdmVuIHRob3VnaCB3ZSd2ZSBkcm9wcGVkIHN1cHBvcnQgZm9yIElFMTEsIGl0J3Mgcmlza2llci9jb3N0bGllciB0byBtYWtlIHVwZGF0ZXMgaGVyZS5cbiAgICBjb25zdCBmb3JtYXR0ZWREYXRlU3RyaW5nOiBzdHJpbmcgPSBkYXRlQXNTdHJpbmcucmVwbGFjZSgnICcsICdUJykuY29uY2F0KCdaJyk7XG4gICAgY29uc3QgdmFsdWUgPSBuZXcgRGF0ZShmb3JtYXR0ZWREYXRlU3RyaW5nKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogdmFsdWU7XG4gIH1cblxuICAvLyBJdCB3b3VsZCBiZSBuaWNlIHRvIG1lcmdlIHRoaXMgYW5kIHRoZSBtZXRob2QgRmlsdGVyQ29udmVydGVyOjpjb252ZXJ0RmlsdGVyVmFsdWVQcmVzTW9kZWwgaW4gYXBpLXBsYXRmb3JtLWpzXG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFZhbHVlQXNTdHJpbmdUb1ZhbHVlKHZhbHVlQXNTdHJpbmc6IHN0cmluZywgdHlwZTogRGF0YVR5cGUpOiBib29sZWFuIHwgbnVtYmVyIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAvLyBUaGlzIGlzIGJvdGggRGF0YURpY3Rpb25hcnkgYW5kIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgY29tcGF0aWJsZS5cbiAgICAvLyBJbiB0aGUgRGF0YURpY3Rpb25hcnksIHZhbHVlQXNTdHJpbmcgY2FuIGJlICclbnVsbCUnIG9yICclbWlzc2luZyUnLCB3aGlsZSBpblxuICAgIC8vIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHdlIGNhbiBnZXQgJ251bGwnIG9yICdtaXNzaW5nJywgb3IgJyVudWxsJScgZm9yIHN0cmluZyBzcGVjaWFsIHZhbHVlcy5cbiAgICAvLyBGb3IgZWl0aGVyIG9mIHRoZXNlIGNhc2VzLCB3ZSByZXR1cm4gc3BlY2lhbFZhbHVlSW5kaWNhdG9yIChvciB0aGUgb3JpZ2luYWwgc3BlY2lhbCBzdHJpbmcpLlxuICAgIC8vIFRvIG1haW50YWluIGJhY2t3YXJkcyBjb21wYXRpYmlsdHksIHRoaXMgY29udmVydGVyOlxuICAgIC8vIDEuIHJldHVybnMgYSBzdHJpbmcgZm9yIGFueSBzcGVjaWFsIHZhbHVlc1xuICAgIC8vIDIuIHJldHVybnMgYSBzdHJpbmcgZm9yIGFueSBkYXRlXG5cbiAgICAvLyBQYXJhbWV0ZXIgbWluL21heCB2YWx1ZXMgY2FuIGJlIHVuZGVmaW5lZCwgc28gcmVzdWx0IGlzIGFsc28gdW5kZWZpbmVkXG4gICAgaWYgKHZhbHVlQXNTdHJpbmcgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZUFzU3RyaW5nID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmlzU3BlY2lhbCh2YWx1ZUFzU3RyaW5nKSkge1xuICAgICAgcmV0dXJuIHZhbHVlQXNTdHJpbmc7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIERhdGFUeXBlLkJvb2w6XG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlQm9vbGVhbih2YWx1ZUFzU3RyaW5nKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5JbnQ6XG4gICAgICBjYXNlIERhdGFUeXBlLkZsb2F0OlxuICAgICAgICAvLyBSZXR1cm4gc3BlY2lhbCB2YWx1ZSAnJW51bGwlJyBmb3IgYW55IGZhaWx1cmUgaW4gcGFyc2luZy5cbiAgICAgICAgLy8gV2UgbmVlZCB0byBkbyB0aGF0IGJlY2F1c2UgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCB3aWxsIGdpdmUgdXMgc3RyaW5ncyBsaWtlICdudWxsJ1xuICAgICAgICAvLyBmb3Igc3BlY2lhbCB2YWx1ZXMuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlTnVtYmVyKHZhbHVlQXNTdHJpbmcpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGU6XG4gICAgICAgIC8vIEZvciBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyB3aWxsIGJlIFwibnVsbFwiIHdoaWNoIHdpbGwgZmFpbCB0byBwYXJzZS5cbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSByZXR1cm4gJyVudWxsJScuXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZSh2YWx1ZUFzU3RyaW5nKSA9PT0gbnVsbCA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogdmFsdWVBc1N0cmluZztcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgLy8gRm9yIFNob3dEYXRhVGFibGVQcmVzTW9kZWwsIHNwZWNpYWwgdmFsdWVzIHdpbGwgYmUgXCJudWxsXCIgd2hpY2ggd2lsbCBmYWlsIHRvIHBhcnNlLlxuICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIHJldHVybiAnJW51bGwlJ1xuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGVUaW1lKHZhbHVlQXNTdHJpbmcpID09PSBudWxsID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiB2YWx1ZUFzU3RyaW5nO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLlNwYXRpYWw6XG4gICAgICBjYXNlIERhdGFUeXBlLlN0cmluZzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZUFzU3RyaW5nO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKHZhbHVlOiBhbnksIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IERhdGUgfCBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBUaGlzIGNvbnZlcnRzIGZyb20gb3VyIDEuMiBBUEkgdGhhdCByZXR1cm5zIHN0cmluZ3MgZm9yIHNwZWNpYWxzLCBhbmQgZGF0ZXMgYXMgc3RyaW5ncy5cbiAgICAvLyBJdCB0YWtlcyB0aGUgc3BlY2lhbCBjYXNlIG9mICclbnVsbCUnIGFuZCByZXR1cm5zIGEgbnVsbC5cbiAgICAvLyBGb3IgZGF0ZXMsIGl0IHJldHVybnMgYSBEYXRlIG9iamVjdCByYXRoZXIgdGhhbiBhIHN0cmluZy5cbiAgICAvLyBjb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlIHNob3VsZCBiZSB1c2VkIHRvIGJ1aWxkIGEgRGF0YVZhbHVlLm5hdGl2ZVZhbHVlIGZpZWxkLlxuXG4gICAgLy8gUGFyYW1ldGVyIG1pbi9tYXggY2FuIGJlIHVuZGVmaW5lZC4gSWYgdGhhdCBpcyB0aGUgY2FzZSwgbmF0aXZlVmFsdWUgaXMgdHJlYXRlZCBsaWtlIGEgc3BlY2lhbFxuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHZhbHVlID09PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgRGF0YVR5cGUuQm9vbDpcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuSW50OlxuICAgICAgY2FzZSBEYXRhVHlwZS5GbG9hdDpcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZTpcbiAgICAgICAgLy8gQ29udmVydCB0aGUgc3RyaW5nIHRvIERhdGUgb2JqZWN0IChvciBudWxsIGlmIHBhcnNpbmcgZmFpbHMgLi4uIHdlIGFzc3VtZSBzcGVjaWFsKVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGUodmFsdWUpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGVUaW1lOlxuICAgICAgICAvLyBDb252ZXJ0IHRoZSBzdHJpbmcgdG8gRGF0ZSBvYmplY3QgKG9yIG51bGwgaWYgcGFyc2luZyBmYWlscyAuLi4gd2UgYXNzdW1lIHNwZWNpYWwpXG4gICAgICAgIHJldHVybiB0aGlzLnBhcnNlRGF0ZVRpbWUodmFsdWUpO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLlN0cmluZzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNTcGVjaWFsKHZhbHVlKSA/IG51bGwgOiB2YWx1ZTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TcGF0aWFsOlxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0U3RyaW5nVmFsdWVUb05hdGl2ZVZhbHVlKHZhbHVlOiBzdHJpbmcsIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IERhdGUgfCBzdHJpbmcgfCBudWxsIHtcbiAgICAvLyBUaGlzIGhhbmRsZXMgdGhlIGNvbnZlcnNpb24gZnJvbSBzdHJpbmcgZGlyZWN0bHkgdG8gbmF0aXZlIHZhbHVlIGZvciBhbGwgdHlwZXNcbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0VmFsdWVUb05hdGl2ZVZhbHVlKHRoaXMuY29udmVydFZhbHVlQXNTdHJpbmdUb1ZhbHVlKHZhbHVlLCB0eXBlKSwgdHlwZSk7XG4gIH1cbn1cbiIsImV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICBEZXNrdG9wID0gJ2Rlc2t0b3AnLFxuICBTZXJ2ZXIgPSAnc2VydmVyJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbiAgQ2xvdWQgPSAnY2xvdWQnLFxuICBQdWJsaWNXZWIgPSAncHVibGljLXdlYicsXG4gIFB1YmxpY0Rlc2t0b3AgPSAncHVibGljLWRlc2t0b3AnLFxufVxuXG5leHBvcnQgZW51bSBFeHRlbnNpb25Nb2RlIHtcbiAgQXV0aG9yaW5nID0gJ2F1dGhvcmluZycsXG4gIFZpZXdpbmcgPSAndmlld2luZycsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbmV4cG9ydCBlbnVtIEFubm90YXRlRW51bSB7XG4gIE1hcmsgPSAnbWFyaycsXG4gIFBvaW50ID0gJ3BvaW50JyxcbiAgQXJlYSA9ICdhcmVhJyxcbn1cblxuZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG4gIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgQ29udGludW91cyA9ICdjb250aW51b3VzJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbn1cblxuZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VHlwZSB7XG4gIEJsYW5rID0gJ2JsYW5rJyxcbiAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG4gIFF1aWNrRmlsdGVyID0gJ3F1aWNrLWZpbHRlcicsXG4gIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICBQYWdlRmlsdGVyID0gJ3BhZ2UtZmlsdGVyJyxcbiAgTGVnZW5kID0gJ2xlZ2VuZCcsXG4gIFRpdGxlID0gJ3RpdGxlJyxcbiAgVGV4dCA9ICd0ZXh0JyxcbiAgSW1hZ2UgPSAnaW1hZ2UnLFxuICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgRXh0ZW5zaW9uID0gJ2V4dGVuc2lvbicsXG59XG5cbmV4cG9ydCBlbnVtIERhdGFUeXBlIHtcbiAgU3RyaW5nID0gJ3N0cmluZycsXG4gIEludCA9ICdpbnQnLFxuICBGbG9hdCA9ICdmbG9hdCcsXG4gIEJvb2wgPSAnYm9vbCcsXG4gIERhdGUgPSAnZGF0ZScsXG4gIERhdGVUaW1lID0gJ2RhdGUtdGltZScsXG4gIFNwYXRpYWwgPSAnc3BhdGlhbCcsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbmV4cG9ydCBlbnVtIERpYWxvZ1N0eWxlIHtcbiAgV2luZG93ID0gJ3dpbmRvdycsXG4gIE1vZGFsID0gJ21vZGFsJyxcbiAgTW9kZWxlc3MgPSAnbW9kZWxlc3MnLFxufVxuXG5leHBvcnQgZW51bSBFbmNvZGVkRGF0YVR5cGUge1xuICBOdW1iZXIgPSAnbnVtYmVyJyxcbiAgU3RyaW5nID0gJ3N0cmluZycsXG4gIERhdGUgPSAnZGF0ZScsXG4gIEJvb2xlYW4gPSAnYm9vbGVhbicsXG59XG5cbmV4cG9ydCBlbnVtIEVycm9yQ29kZXMge1xuICBJTklUSUFMSVpBVElPTl9FUlJPUiA9ICdpbml0aWFsaXphdGlvbi1lcnJvcicsXG4gIElOVEVSTkFMX0VSUk9SID0gJ2ludGVybmFsLWVycm9yJyxcbiAgTUlTU0lOR19FTlVNX01BUFBJTkcgPSAnbWlzc2luZy1lbnVtLW1hcHBpbmcnLFxuICBNSVNTSU5HX1BBUkFNRVRFUiA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gIFBFUk1JU1NJT05fREVOSUVEID0gJ3Blcm1pc3Npb24tZGVuaWVkJyxcbiAgUFJFU19NT0RFTF9QQVJTSU5HX0VSUk9SID0gJ3ByZXMtbW9kZWwtcGFyc2luZy1lcnJvcicsXG4gIFZFUlNJT05fTk9UX0NPTkZJR1VSRUQgPSAndmVyc2lvbi1ub3QtY29uZmlndXJlZCcsXG4gIFZJU0lCSUxJVFlfRVJST1IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gIFVOS05PV05fVkVSQl9JRCA9ICd1bmtub3duLXZlcmItaWQnLFxufVxuXG5leHBvcnQgZW51bSBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSB7XG4gIFN1bSA9ICdzdW0nLFxuICBBdmcgPSAnYXZnJyxcbiAgTWluID0gJ21pbicsXG4gIE1heCA9ICdtYXgnLFxuICBTdGRldiA9ICdzdGRldicsXG4gIFN0ZGV2cCA9ICdzdGRldnAnLFxuICBWYXIgPSAndmFyJyxcbiAgVmFycCA9ICd2YXJwJyxcbiAgQ29sbGVjdCA9ICdjb2xsZWN0JyxcbiAgQ291bnQgPSAnY291bnQnLFxuICBDb3VudGQgPSAnY291bnRkJyxcbiAgTWVkaWFuID0gJ21lZGlhbicsXG4gIEF0dHIgPSAnYXR0cicsXG4gIE5vbmUgPSAnbm9uZScsXG4gIFllYXIgPSAneWVhcicsXG4gIFF0ciA9ICdxdHInLFxuICBNb250aCA9ICdtb250aCcsXG4gIERheSA9ICdkYXknLFxuICBIb3VyID0gJ2hvdXInLFxuICBNaW51dGUgPSAnbWludXRlJyxcbiAgU2Vjb25kID0gJ3NlY29uZCcsXG4gIFdlZWsgPSAnd2VlaycsXG4gIFdlZWtkYXkgPSAnd2Vla2RheScsXG4gIE1vbnRoWWVhciA9ICdtb250aC15ZWFyJyxcbiAgTWR5ID0gJ21keScsXG4gIEVuZCA9ICdlbmQnLFxuICBUcnVuY1llYXIgPSAndHJ1bmMteWVhcicsXG4gIFRydW5jUXRyID0gJ3RydW5jLXF0cicsXG4gIFRydW5jTW9udGggPSAndHJ1bmMtbW9udGgnLFxuICBUcnVuY1dlZWsgPSAndHJ1bmMtd2VlaycsXG4gIFRydW5jRGF5ID0gJ3RydW5jLWRheScsXG4gIFRydW5jSG91ciA9ICd0cnVuYy1ob3VyJyxcbiAgVHJ1bmNNaW51dGUgPSAndHJ1bmMtbWludXRlJyxcbiAgVHJ1bmNTZWNvbmQgPSAndHJ1bmMtc2Vjb25kJyxcbiAgUXVhcnQxID0gJ3F1YXJ0MScsXG4gIFF1YXJ0MyA9ICdxdWFydDMnLFxuICBTa2V3bmVzcyA9ICdza2V3bmVzcycsXG4gIEt1cnRvc2lzID0gJ2t1cnRvc2lzJyxcbiAgSW5PdXQgPSAnaW4tb3V0JyxcbiAgVXNlciA9ICd1c2VyJyxcbn1cblxuZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gIERpbWVuc2lvbiA9ICdkaW1lbnNpb24nLFxuICBNZWFzdXJlID0gJ21lYXN1cmUnLFxuICBVbmtub3duID0gJ3Vua25vd24nLFxufVxuXG4vKipcbiAqICBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyLlxuICovXG5leHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgQWRkID0gJ2FkZCcsXG4gIEFsbCA9ICdhbGwnLFxuICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICBSZW1vdmUgPSAncmVtb3ZlJyxcbn1cblxuZXhwb3J0IGVudW0gU2hlZXRUeXBlIHtcbiAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gIFN0b3J5ID0gJ3N0b3J5JyxcbiAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG59XG5cbmV4cG9ydCBlbnVtIERvbWFpblJlc3RyaWN0aW9uVHlwZSB7XG4gIEFsbCA9ICdhbGwnLFxuICBMaXN0ID0gJ2xpc3QnLFxuICBSYW5nZSA9ICdyYW5nZScsXG59XG5cbmV4cG9ydCBlbnVtIERhdGVTdGVwUGVyaW9kIHtcbiAgWWVhcnMgPSAneWVhcnMnLFxuICBRdWFydGVycyA9ICdxdWFydGVycycsXG4gIE1vbnRocyA9ICdtb250aHMnLFxuICBXZWVrcyA9ICd3ZWVrcycsXG4gIERheXMgPSAnZGF5cycsXG4gIEhvdXJzID0gJ2hvdXJzJyxcbiAgTWludXRlcyA9ICdtaW51dGVzJyxcbiAgU2Vjb25kcyA9ICdzZWNvbmRzJyxcbiAgSXNvWWVhcnMgPSAnaXNvLXllYXJzJyxcbiAgSXNvUXVhcnRlcnMgPSAnaXNvLXF1YXJ0ZXJzJyxcbiAgSXNvV2Vla3MgPSAnaXNvLXdlZWtzJyxcbn1cblxuLyoqXG4gKiBUaGUgb3B0aW9uIGZvciBzcGVjaWZ5aW5nIHdoaWNoIHZhbHVlcyB0byBpbmNsdWRlIGZvciBmaWx0ZXJpbmcuXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlck51bGxPcHRpb24ge1xuICBOdWxsVmFsdWVzID0gJ251bGx2YWx1ZXMnLFxuICBOb25OdWxsVmFsdWVzID0gJ25vbm51bGx2YWx1ZXMnLFxuICBBbGxWYWx1ZXMgPSAnYWxsdmFsdWVzJyxcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBmaWx0ZXIgZG9tYWluXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gIERhdGFiYXNlID0gJ2RhdGFiYXNlJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Rpb24gdHlwZSBmb3Igc2VsZWN0IG1hcmtzIGFwaS5cbiAqL1xuZXhwb3J0IGVudW0gU2VsZWN0aW9uVXBkYXRlVHlwZSB7XG4gIFJlcGxhY2UgPSAnc2VsZWN0LXJlcGxhY2UnLFxuICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gIFJlbW92ZSA9ICdzZWxlY3QtcmVtb3ZlJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Qgb3B0aW9uIGZvciB0aGUgc2VsZWN0IHR1cGxlcyBhcGkuXG4gKi9cbmV4cG9ydCBlbnVtIFNlbGVjdE9wdGlvbnMge1xuICBTaW1wbGUgPSAnc2VsZWN0LW9wdGlvbnMtc2ltcGxlJyxcbiAgVG9nZ2xlID0gJ3NlbGVjdC1vcHRpb25zLXRvZ2dsZScsXG4gIE1lbnUgPSAnc2VsZWN0LW9wdGlvbnMtbWVudScsIC8vIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgZXh0ZXJuYWwgY29udHJhY3RcbiAgUmFuZ2UgPSAnc2VsZWN0LW9wdGlvbnMtcmFuZ2UnLCAvLyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dGVybmFsIGNvbnRyYWN0XG4gIFNlYXJjaCA9ICdzZWxlY3Qtb3B0aW9ucy1zZWFyY2gnLCAvLyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dGVybmFsIGNvbnRyYWN0XG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgaW5jbHVkZWQgdmFsdWVzIHR5cGUgZm9yIHJhbmdlIHNlbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMge1xuICBJbmNsdWRlTnVsbCA9ICdpbmNsdWRlLW51bGwnLFxuICBJbmNsdWRlTm9uTnVsbCA9ICdpbmNsdWRlLW5vbi1udWxsJyxcbiAgSW5jbHVkZUFsbCA9ICdpbmNsdWRlLWFsbCcsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyBhIGhpZXJhcmNoaWNhbCBsZXZlbCBzZWxlY3Rpb24gc3RhdGUuXG4gKi9cbmV4cG9ydCBlbnVtIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUge1xuICBBbGxTZWxlY3RlZCA9ICdhbGwtc2VsZWN0ZWQnLFxuICBOb25lU2VsZWN0ZWQgPSAnbm9uZS1zZWxlY3RlZCcsXG4gIFNvbWVTZWxlY3RlZCA9ICdzb21lLXNlbGVjdGVkJyxcbiAgVW5rbm93blNlbGVjdGVkID0gJ3Vua25vd24tc2VsZWN0ZWQnLFxufVxuXG4vKipcbiAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICovXG5leHBvcnQgZW51bSBNYXJrVHlwZSB7XG4gIEJhciA9ICdiYXInLFxuICBMaW5lID0gJ2xpbmUnLFxuICBBcmVhID0gJ2FyZWEnLFxuICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgQ2lyY2xlID0gJ2NpcmNsZScsXG4gIFNoYXBlID0gJ3NoYXBlJyxcbiAgVGV4dCA9ICd0ZXh0JyxcbiAgTWFwID0gJ21hcCcsXG4gIFBpZSA9ICdwaWUnLFxuICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICBQb2x5Z29uID0gJ3BvbHlnb24nLFxuICBIZWF0bWFwID0gJ2hlYXRtYXAnLFxuICBWaXpFeHRlbnNpb24gPSAndml6LWV4dGVuc2lvbicsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBmaWx0ZXJcbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyVHlwZSB7XG4gIENhdGVnb3JpY2FsID0gJ2NhdGVnb3JpY2FsJyxcbiAgUmFuZ2UgPSAncmFuZ2UnLFxuICBSZWxhdGl2ZURhdGUgPSAncmVsYXRpdmVEYXRlJyxcbiAgSGllcmFyY2hpY2FsID0gJ2hpZXJhcmNoaWNhbCcsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgRGF0ZVJhbmdlVHlwZSBvZiBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyXG4gKi9cbmV4cG9ydCBlbnVtIERhdGVSYW5nZVR5cGUge1xuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBsYXN0IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTGFzdCA9ICdsYXN0JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbGFzdCBOIGRheXMsIHdlZWtzLCBtb250aHMsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTGFzdE4gPSAnbGFzdE4nLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBuZXh0IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTmV4dCA9ICduZXh0JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbmV4dCBOIGRheXMsIHdlZWtzLCBtb250aHMsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTmV4dE4gPSAnbmV4dE4nLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBjdXJyZW50IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgQ3VycmVudCA9ICdjdXJyZW50JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byBldmVyeXRoaW5nIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBUb0RhdGUgPSAndG9EYXRlJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGRldGVybWluZSBpZiB0aGUgbGF1bmNoaW5nIG9mIGFuIGV4dGVuc2lvbiBkaWFsb2cgc3VjY2VlZGVkIG9yIGZhaWxlZC5cbiAqL1xuZXhwb3J0IGVudW0gRXh0ZW5zaW9uRGlhbG9nUmVzdWx0IHtcbiAgRGlhbG9nQWxyZWFkeU9wZW4gPSAnZGlhbG9nLWFscmVhZHktb3BlbicsXG4gIEludmFsaWREb21haW4gPSAnaW52YWxpZC1kb21haW4nLFxuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gb3B0aW1pemUgdGhlIGdldFN1bW1hcnlEYXRhL2dldFVuZGVybHlpbmdUYWJsZURhdGEgcmVzdWx0c1xuICogTWFwcGVkIGZyb20gZXh0ZXJuYWwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb25cbiAqL1xuZXhwb3J0IGVudW0gQXBpU2hvd0RhdGFUYWJsZUZvcm1hdCB7XG4gIE5hdGl2ZVZhbHVlc09ubHkgPSAnbmF0aXZlLXZhbHVlcy1vbmx5JyxcbiAgRm9ybWF0dGVkVmFsdWVzT25seSA9ICdmb3JtYXR0ZWQtdmFsdWVzLW9ubHknLFxuICBOYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMgPSAnbmF0aXZlLWFuZC1mb3JtYXR0ZWQtdmFsdWVzJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGRlbm90ZSB0aGUgc2VjdGlvbnMgb2YgZm9ybWF0dGluZyB3aXRoaW4gdGFibGVhdVxuICovXG5leHBvcnQgY29uc3QgZW51bSBDbGFzc05hbWVLZXkge1xuICBXb3Jrc2hlZXRUaXRsZSA9ICd0YWJsZWF1LXdvcmtzaGVldC10aXRsZScsXG4gIFdvcmtzaGVldCA9ICd0YWJsZWF1LXdvcmtzaGVldCcsXG4gIFRvb2x0aXAgPSAndGFibGVhdS10b29sdGlwJyxcbiAgU3RvcnlUaXRsZSA9ICd0YWJsZWF1LXN0b3J5LXRpdGxlJyxcbiAgRGFzaGJvYXJkVGl0bGUgPSAndGFibGVhdS1kYXNoYm9hcmQtdGl0bGUnLFxuICBQYW5lID0gJ3RhYmxlYXUtcGFuZScsXG4gIFJvd0RpdmlkZXJzID0gJ3RhYmxlYXUtcm93LWRpdmlkZXJzJyxcbiAgQ29sdW1uRGl2aWRlcnMgPSAndGFibGVhdS1jb2x1bW4tZGl2aWRlcnMnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gc2V0IHBhZ2Ugc2l6ZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBQYWdlU2l6ZU9wdGlvbiB7XG4gIExldHRlciA9ICdsZXR0ZXInLFxuICBMZWdhbCA9ICdsZWdhbCcsXG4gIE5vdGUgPSAnbm90ZScsXG4gIEZvbGlvID0gJ2ZvbGlvJyxcbiAgVGFibG9pZCA9ICd0YWJsb2lkJyxcbiAgTGVkZ2VyID0gJ2xlZGdlcicsXG4gIFN0YXRlbWVudCA9ICdzdGF0ZW1lbnQnLFxuICBFeGVjdXRpdmUgPSAnZXhlY3V0aXZlJyxcbiAgQTMgPSAnYTMnLFxuICBBNCA9ICdhNCcsXG4gIEE1ID0gJ2E1JyxcbiAgQjQgPSAnYjQnLFxuICBCNSA9ICdiNScsXG4gIFF1YXJ0byA9ICdxdWFydG8nLFxuICBVbnNwZWNpZmllZCA9ICd1bnNwZWNpZmllZCcsXG59XG5cbi8qKlxuICogVXNlZCB0byBzZXQgdGhlIHBhZ2Ugb3JpZW50YXRpb24gbW9kZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBQYWdlT3JpZW50YXRpb24ge1xuICBQcmludGVyID0gJ3ByaW50ZXInLFxuICBQb3J0cmFpdCA9ICdwb3J0cmFpdCcsXG4gIExhbmRzY2FwZSA9ICdsYW5kc2NhcGUnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gc2V0IHNjYWxlIG1vZGUgZm9yIGV4cG9ydCBsYXlvdXQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gU2NhbGVNb2RlIHtcbiAgU2NhbGVBdXRvID0gJ2F1dG8nLFxuICBTY2FsZVBlcmNlbnRhZ2UgPSAncGVyY2VudCcsXG4gIFNjYWxlRml0UGFnZXMgPSAnZml0LXBhZ2VzJyxcbn1cblxuLyoqXG4gKiBVc2VkIGJ5IHNldEZpdEFuZFNjYWxlVmFsdWVzIHRvIHNjYWxlIHBlcmNlbnQgdmFsdWVzXG4gKi9cbmV4cG9ydCBlbnVtIFBhZ2VTY2FsaW5nT3B0aW9uIHtcbiAgU2NhbGVQY3RBdXRvID0gJ2F1dG8nLFxuICBTY2FsZVBjdDQwMCA9ICdwY3Q0MDAnLFxuICBTY2FsZVBjdDIwMCA9ICdwY3QyMDAnLFxuICBTY2FsZVBjdDEwMCA9ICdwY3QxMDAnLFxuICBTY2FsZVBjdDkwID0gJ3BjdDkwJyxcbiAgU2NhbGVQY3Q4MCA9ICdwY3Q4MCcsXG4gIFNjYWxlUGN0NzUgPSAncGN0NzUnLFxuICBTY2FsZVBjdDYwID0gJ3BjdDYwJyxcbiAgU2NhbGVQY3Q1MCA9ICdwY3Q1MCcsXG4gIFNjYWxlUGN0MjUgPSAncGN0MjUnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgc2V0Rml0QW5kU2NhbGVWYWx1ZXMgdG8gc2NhbGUgZml0IHBhZ2UgdmFsdWVzXG4gKi9cbmV4cG9ydCBlbnVtIEZpdFBhZ2VzIHtcbiAgRml0T25lSGlnaCA9ICdmaXQweDEnLFxuICBGaXRUd29IaWdoID0gJ2ZpdDB4MicsXG4gIEZpdE9uZVdpZGUgPSAnZml0MXgwJyxcbiAgRml0VHdvV2lkZSA9ICdmaXQyeDAnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jXG4gKi9cbmV4cG9ydCBlbnVtIEVuY29kaW5nVHlwZSB7XG4gIENvbG9yID0gJ2NvbG9yJyxcbiAgU2l6ZSA9ICdzaXplJyxcbiAgTGFiZWwgPSAnbGFiZWwnLFxuICBEZXRhaWwgPSAnZGV0YWlsJyxcbiAgVG9vbHRpcCA9ICd0b29sdGlwJyxcbiAgU2hhcGUgPSAnc2hhcGUnLFxuICBQYXRoID0gJ3BhdGgnLFxuICBBbmdsZSA9ICdhbmdsZScsXG4gIEdlb21ldHJ5ID0gJ2dlb21ldHJ5JyxcbiAgQ3VzdG9tID0gJ2N1c3RvbScsXG59XG5cbmV4cG9ydCBlbnVtIFB1bHNlVGltZURpbWVuc2lvbiB7XG4gIFRvZGF5ID0gJ1RvZGF5JyxcbiAgWWVzdGVyZGF5ID0gJ1llc3RlcmRheScsXG4gIFdlZWtUb0RhdGUgPSAnV2Vla1RvRGF0ZScsXG4gIExhc3RXZWVrID0gJ0xhc3RXZWVrJyxcbiAgTW9udGhUb0RhdGUgPSAnTW9udGhUb0RhdGUnLFxuICBMYXN0TW9udGggPSAnTGFzdE1vbnRoJyxcbiAgUXVhcnRlclRvRGF0ZSA9ICdRdWFydGVyVG9EYXRlJyxcbiAgTGFzdFF1YXJ0ZXIgPSAnTGFzdFF1YXJ0ZXInLFxuICBZZWFyVG9EYXRlID0gJ1llYXJUb0RhdGUnLFxuICBMYXN0WWVhciA9ICdMYXN0WWVhcicsXG59XG5cbmV4cG9ydCBlbnVtIFB1bHNlRXJyb3JNZXNzYWdlVmlzaWJpbGl0eSB7XG4gIFZpc2libGUgPSAndmlzaWJsZScsXG4gIEhpZGRlbiA9ICdoaWRkZW4nLFxuICBTdXBwcmVzc2VkID0gJ3N1cHByZXNzZWQnLFxufVxuIiwiZXhwb3J0IGVudW0gTm90aWZpY2F0aW9uSWQge1xuICBDdXN0b21NYXJrQ29udGV4dE1lbnVDbGlja2VkID0gJ2N1c3RvbS1tYXJrLWNvbnRleHQtbWVudS1jbGlja2VkJyxcbiAgQ29udGV4dE1lbnVDbGljayA9ICdjb250ZXh0LW1lbnUtY2xpY2snLFxuICBDdXN0b21WaWV3UmVtb3ZlZCA9ICdjdXN0b20tdmlldy1yZW1vdmVkJyxcbiAgQ3VzdG9tVmlld1NhdmVkID0gJ2N1c3RvbS12aWV3LXNhdmVkJyxcbiAgQ3VzdG9tVmlld1NldERlZmF1bHQgPSAnY3VzdG9tLXZpZXctc2V0LWRlZmF1bHQnLFxuICBDdXN0b21WaWV3c0xvYWRlZCA9ICdjdXN0b20tdmlld3MtbG9hZGVkJyxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCA9ICdkYXNoYm9hcmQtbGF5b3V0LWNoYW5nZWQnLFxuICBFZGl0QnV0dG9uQ2xpY2tlZCA9ICdlZGl0LWJ1dHRvbi1jbGlja2VkJyxcbiAgRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQgPSAnZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbi1jbGlja2VkJyxcbiAgRXh0ZW5zaW9uRGlhbG9nVXBkYXRlID0gJ2V4dGVuc2lvbi1kaWFsb2ctdXBkYXRlJyxcbiAgRXh0ZW5zaW9uRGlhbG9nTWVzc2FnZSA9ICdleHRlbnNpb24tZGlhbG9nLW1lc3NhZ2UnLFxuICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcbiAgRmlyc3RWaXpTaXplS25vd24gPSAnZmlyc3Qtdml6LXNpemUta25vd24nLFxuICBGaXJzdFB1bHNlTWV0cmljU2l6ZUtub3duID0gJ2ZpcnN0LXB1bHNlLW1ldHJpYy1zaXplLWtub3duJyxcbiAgUGFyYW1ldGVyQ2hhbmdlZCA9ICdwYXJhbWV0ZXItY2hhbmdlZCcsXG4gIFB1bHNlRXJyb3IgPSAncHVsc2UtZXJyb3InLFxuICBQdWxzZUZpbHRlcnNDaGFuZ2VkID0gJ3B1bHNlLWZpbHRlcnMtY2hhbmdlZCcsXG4gIFB1bHNlTWV0cmljU2l6ZUNoYW5nZWQgPSAncHVsc2UtbWV0cmljLXNpemUtY2hhbmdlZCcsXG4gIFB1bHNlSW5zaWdodERpc2NvdmVyZWQgPSAncHVsc2UtaW5zaWdodC1kaXNjb3ZlcmVkJyxcbiAgUHVsc2VJbnRlcmFjdGl2ZSA9ICdwdWxzZS1pbnRlcmFjdGl2ZScsXG4gIFB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWQgPSAncHVsc2UtdGltZS1kaW1lbnNpb24tY2hhbmdlZCcsXG4gIFB1bHNlVXJsQ2hhbmdlZCA9ICdwdWxzZS11cmwtY2hhbmdlZCcsXG4gIFNlbGVjdGVkTWFya3NDaGFuZ2VkID0gJ3NlbGVjdGVkLW1hcmtzLWNoYW5nZWQnLFxuICBTZXR0aW5nc0NoYW5nZWQgPSAnc2V0dGluZ3MtY2hhbmdlZCcsXG4gIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG4gIFRlc3RDb252ZXJzaW9uTm90aWZpY2F0aW9uID0gJ3Rlc3QtY29udmVyc2lvbi1ub3RpZmljYXRpb24nLFxuICBUb29sYmFyU3RhdGVDaGFuZ2VkID0gJ3Rvb2xiYXItc3RhdGUtY2hhbmdlZCcsXG4gIFZpekludGVyYWN0aXZlID0gJ3Zpei1pbnRlcmFjdGl2ZScsXG4gIEFza0RhdGFJbnRlcmFjdGl2ZSA9ICdhc2stZGF0YS1pbnRlcmFjdGl2ZScsXG4gIFdvcmtib29rUmVhZHlUb0Nsb3NlID0gJ3dvcmtib29rLXJlYWR5LXRvLWNsb3NlJyxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCA9ICd3b3JrYm9vay1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuICBXb3JrYm9va1B1Ymxpc2hlZCA9ICd3b3JrYm9vay1wdWJsaXNoZWQnLFxuICBXb3JrYm9va1B1Ymxpc2hlZEFzID0gJ3dvcmtib29rLXB1Ymxpc2hlZC1hcycsXG4gIFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkID0gJ3dvcmtzaGVldC1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuICBVcmxBY3Rpb24gPSAndXJsLWFjdGlvbicsXG4gIFRhYlN3aXRjaGVkID0gJ3RhYi1zd2l0Y2hlZCcsXG4gIFN0b3J5UG9pbnRTd2l0Y2hlZCA9ICdzdG9yeS1wb2ludC1zd2l0Y2hlZCcsXG4gIFJlYWR5VG9SZWNlaXZlQXV0aFRva2VuID0gJ3JlYWR5LXRvLXJlY2VpdmUtYXV0aC10b2tlbicsXG59XG4iLCIvLyBQTEVBU0UgS0VFUCBJTiBBTFBIQUJFVElDQUwgT1JERVIuIFRoaXMgaGVscHMgd2l0aCB2aXN1YWxseSBmaW5kaW5nIGVudHJpZXMsIGtub3dpbmcgd2hlcmUgdG8gcHV0XG4vLyBuZXcgb25lcywgYW5kIG1lcmdlIGNvbmZsaWN0cy5cbmV4cG9ydCBlbnVtIFBhcmFtZXRlcklkIHtcbiAgQWN0aXZlVGFibGVzSW5mbyA9ICdhY3RpdmUtdGFibGVzLWluZm8nLFxuICBBbmNob3JEYXRlID0gJ2FuY2hvci1kYXRlJyxcbiAgQW5ub3RhdGVFbnVtID0gJ2Fubm90YXRlLWVudW0nLFxuICBBbm5vdGF0aW9uTGlzdCA9ICdhbm5vdGF0aW9uLWxpc3QnLFxuICBBcHBseVdvcmtzaGVldEZvcm1hdHRpbmcgPSAnYXBwbHktd29ya3NoZWV0LWZvcm1hdHRpbmcnLFxuXG4gIENhdGVnb3JpY2FsRG9tYWluID0gJ2NhdGVnb3JpY2FsLWRvbWFpbicsXG4gIENsaWNrVGhyb3VnaEVuYWJsZWQgPSAnY2xpY2stdGhyb3VnaC1lbmFibGVkJyxcbiAgQ29sdW1ucyA9ICdjb2x1bW5zJyxcbiAgQ29sdW1uc1RvSW5jbHVkZSA9ICdjb2x1bW5zLXRvLWluY2x1ZGUnLFxuICBDb2x1bW5zVG9JbmNsdWRlQnlJZCA9ICdjb2x1bW5zLXRvLWluY2x1ZGUtYnktaWQnLFxuICBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMgPSAnY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBDdXJyZW50U2hlZXRUeXBlID0gJ2N1cnJlbnQtc2hlZXQtdHlwZScsXG4gIEN1c3RvbVZpZXcgPSAnY3VzdG9tLXZpZXcnLFxuICBDdXN0b21WaWV3SXNEZWZhdWx0ID0gJ2N1c3RvbS12aWV3LWlzLWRlZmF1bHQnLFxuICBDdXN0b21WaWV3SXNQdWJsaWMgPSAnY3VzdG9tLXZpZXctaXMtcHVibGljJyxcbiAgQ3VzdG9tVmlld0x1aWQgPSAnY3VzdG9tLXZpZXctbHVpZCcsXG4gIEN1c3RvbVZpZXdOYW1lID0gJ2N1c3RvbS12aWV3LW5hbWUnLFxuICBDdXN0b21WaWV3cyA9ICdjdXN0b20tdmlld3MnLFxuXG4gIERhc2hib2FyZCA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRGaWx0ZXJzID0gJ2Rhc2hib2FyZC1maWx0ZXJzJyxcbiAgRGFzaGJvYXJkTmFtZSA9ICdkYXNoYm9hcmQnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgPSAnZGFzaGJvYXJkLW9iamVjdC1wb3NpdGlvbi1hbmQtc2l6ZS11cGRhdGUnLFxuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVMaXN0ID0gJ2Rhc2hib2FyZC1vYmplY3QtcG9zaXRpb24tYW5kLXNpemUtdXBkYXRlLWxpc3QnLFxuICBEYXRhUm93SW5kZXggPSAnZGF0YS1yb3ctaW5kZXgnLFxuICBEYXRhU2NoZW1hID0gJ2RhdGEtc2NoZW1hJyxcbiAgRGF0YVNvdXJjZSA9ICdkYXRhLXNvdXJjZScsXG4gIERhdGFTb3VyY2VEYXRhVGFibGUgPSAnZGF0YS1zb3VyY2UtZGF0YS10YWJsZScsXG4gIERhdGFTb3VyY2VJZCA9ICdkYXRhLXNvdXJjZS1pZCcsXG4gIERhdGFTb3VyY2VOYW1lID0gJ2RhdGEtc291cmNlLW5hbWUnLFxuICBEYXRhVGFibGUgPSAnZGF0YS10YWJsZScsXG4gIERhdGFUYWJsZVJlYWRlciA9ICdkYXRhLXRhYmxlLXJlYWRlcicsXG4gIERhdGVSYW5nZVR5cGUgPSAnZGF0ZS1yYW5nZS10eXBlJyxcbiAgRGVsZXRlQ291bnQgPSAnZGVsZXRlLWNvdW50JyxcbiAgRGVsdGFUaW1lTXMgPSAnZGVsdGEtdGltZS1tcycsXG4gIERpbVZhbFNlbGVjdGlvbk1vZGVscyA9ICdkaW1lbnNpb25WYWx1ZVNlbGVjdGlvbk1vZGVscycsXG4gIERvbWFpblR5cGUgPSAnZG9tYWluLXR5cGUnLFxuXG4gIEVtYmVkZGluZ0Fic3RyYWN0UXVlcnkgPSAnZW1iZWRkaW5nLWFic3RyYWN0LXF1ZXJ5JyxcbiAgRW1iZWRkaW5nQm9vdHN0cmFwSW5mbyA9ICdlbWJlZGRpbmctYm9vdHN0cmFwLWluZm8nLFxuICBFbmNvZGluZ1R5cGUgPSAnZW5jb2RpbmctdHlwZScsXG4gIEV4cG9ydENyb3NzdGFiU2hlZXRNYXAgPSAnZXhwb3J0LWNyb3NzdGFiLXNoZWV0LW1hcCcsXG4gIEV4cG9ydEZpbGUgPSAnZXhwb3J0LWZpbGUnLFxuICBFeHBvcnRPcmlnaW5VcmwgPSAnZXhwb3J0LW9yaWdpbi11cmwnLFxuICBFeHBvcnRQZGZPcHRpb25zID0gJ2V4cG9ydC1wZGYtb3B0aW9ucycsXG4gIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8gPSAnZXh0ZW5zaW9uLWJvb3RzdHJhcC1pbmZvJyxcbiAgRXh0ZW5zaW9uQ29udGV4dE1lbnVJZHMgPSAnZXh0ZW5zaW9uLWNvbnRleHQtbWVudS1pZHMnLFxuICBFeHRlbnNpb25EaWFsb2dIID0gJ2V4dGVuc2lvbi1kaWFsb2ctaGVpZ2h0JyxcbiAgRXh0ZW5zaW9uRGlhbG9nTWVzc2FnZSA9ICdleHRlbnNpb24tZGlhbG9nLW1lc3NhZ2UnLFxuICBFeHRlbnNpb25EaWFsb2dQYXlsb2FkID0gJ2V4dGVuc2lvbi1kaWFsb2ctcGF5bG9hZCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdCA9ICdleHRlbnNpb24tZGlhbG9nLXJlc3VsdCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1N0eWxlID0gJ2V4dGVuc2lvbi1kaWFsb2ctc3R5bGUnLFxuICBFeHRlbnNpb25EaWFsb2dVcmwgPSAnZXh0ZW5zaW9uLWRpYWxvZy11cmwnLFxuICBFeHRlbnNpb25EaWFsb2dVcmxTb3VyY2UgPSAnZXh0ZW5zaW9uLWRpYWxvZy11cmwtc291cmNlJyxcbiAgRXh0ZW5zaW9uRGlhbG9nVyA9ICdleHRlbnNpb24tZGlhbG9nLXdpZHRoJyxcbiAgRXh0ZW5zaW9uTG9jYXRvciA9ICdleHRlbnNpb24tbG9jYXRvcicsXG4gIEV4dGVuc2lvblNldHRpbmdzSW5mbyA9ICdleHRlbnNpb24tc2V0dGluZ3MtaW5mbycsXG4gIEV4dGVuc2lvblpvbmVJZCA9ICdleHRlbnNpb24tem9uZS1pZCcsXG4gIEV4dGVybmFsTWVudURlc2NyaXB0aW9uID0gJ2V4dGVybmFsLW1lbnUtZGVzY3JpcHRpb24nLFxuICBFeHRlcm5hbE1lbnVIZWFkZXIgPSAnZXh0ZXJuYWwtbWVudS1oZWFkZXInLFxuICBFeHRlcm5hbE1lbnVJdGVtRGlzcGxheU5hbWUgPSAnZXh0ZXJuYWwtbWVudS1pdGVtLWRpc3BsYXktbmFtZScsXG4gIEV4dGVybmFsTWVudUl0ZW1JZCA9ICdleHRlcm5hbC1tZW51LWl0ZW0taWQnLFxuXG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgRmllbGRDb3VudCA9ICdmaWVsZC1jb3VudCcsXG4gIEZpZWxkSWQgPSAnZmllbGQtaWQnLFxuICBGaWVsZE5hbWUgPSAnZmllbGQtbmFtZScsXG4gIEZpbHRlckxldmVscyA9ICdmaWx0ZXItbGV2ZWxzJyxcbiAgRmlsdGVyUmFuZ2VNYXggPSAnZmlsdGVyLXJhbmdlLW1heCcsXG4gIEZpbHRlclJhbmdlTWluID0gJ2ZpbHRlci1yYW5nZS1taW4nLFxuICBGaWx0ZXJSYW5nZU51bGxPcHRpb24gPSAnZmlsdGVyLXJhbmdlLW51bGwtb3B0aW9uJyxcbiAgRmlsdGVyVXBkYXRlVHlwZSA9ICdmaWx0ZXItdXBkYXRlLXR5cGUnLFxuICBGaWx0ZXJWYWx1ZXMgPSAnZmlsdGVyLXZhbHVlcycsXG4gIEZvbnROYW1lTGlzdEl0ZW1zID0gJ2ZvbnQtbmFtZS1saXN0LWl0ZW1zJyxcbiAgRm9ybWF0dGVkVGV4dCA9ICdmb3JtYXR0ZWQtdGV4dCcsXG4gIEZ1bmN0aW9uTmFtZSA9ICdmdW5jdGlvbi1uYW1lJyxcbiAgRnJvbUluZGV4ID0gJ2Zyb20taW5kZXgnLFxuXG4gIEhpZXJWYWxTZWxlY3Rpb25Nb2RlbHMgPSAnaGllcmFyY2hpY2FsVmFsdWVTZWxlY3Rpb25Nb2RlbHMnLFxuICBIaWdobGlnaHRlZERhdGEgPSAnaGlnaGxpZ2h0ZWQtZGF0YScsXG4gIEhvdmVyVHVwbGVJbnRlcmFjdGlvbiA9ICdob3Zlci10dXBsZS1pbnRlcmFjdGlvbicsXG5cbiAgSWdub3JlQWxpYXNlcyA9ICdpZ25vcmUtYWxpYXNlcycsXG4gIElnbm9yZVNlbGVjdGlvbiA9ICdpZ25vcmUtc2VsZWN0aW9uJyxcbiAgSW5jbHVkZUFsbENvbHVtbnMgPSAnaW5jbHVkZS1hbGwtY29sdW1ucycsXG4gIEludmFsaWRBZ2dGaWVsZE5hbWUgPSAnaW52YWxpZC1hZ2ctZmllbGQtbmFtZScsXG4gIEludmFsaWREYXRlcyA9ICdpbnZhbGlkLWRhdGVzJyxcbiAgSW52YWxpZEZpZWxkQ2FwdGlvbiA9ICdpbnZhbGlkLWZpZWxkLWNhcHRpb24nLFxuICBJbnZhbGlkRmllbGRzID0gJ2ludmFsaWQtZmllbGRzJyxcbiAgSW52YWxpZFZhbHVlcyA9ICdpbnZhbGlkLXZhbHVlcycsXG4gIElzQW5hbHl0aWNzQXNzaXN0YW50QXZhaWxhYmxlID0gJ2lzLWFuYWx5dGljcy1hc3Npc3RhbnQtYXZhaWxhYmxlJyxcbiAgSXNFeGNsdWRlTW9kZSA9ICdpcy1leGNsdWRlJyxcbiAgSXNFeHRlbnNpb25EaWFsb2cgPSAnaXMtZXh0ZW5zaW9uLWRpYWxvZycsXG4gIElzRnJvbUNhbGNEaWFsb2cgPSAnaXMtZnJvbS1jYWxjLWRpYWxvZycsXG5cbiAgSm9pbkRlc2NyaXB0aW9uID0gJ2pvaW4tZGVzY3JpcHRpb24nLFxuXG4gIExvZ2ljYWxUYWJsZUlkID0gJ2xvZ2ljYWwtdGFibGUtaWQnLFxuICBMb2dpY2FsVGFibGVJbmZvTGlzdCA9ICdsb2dpY2FsLXRhYmxlLWluZm8tbGlzdCcsXG5cbiAgTWFya3NDYXJkSW5kZXggPSAnbWFya3MtY2FyZC1pbmRleCcsXG4gIE1heEhlaWdodCA9ICdtYXgtaGVpZ2h0JyxcbiAgTWF4Um93cyA9ICdtYXgtcm93cycsXG4gIE1heFdpZHRoID0gJ21heC13aWR0aCcsXG4gIE1pbkhlaWdodCA9ICdtaW4taGVpZ2h0JyxcbiAgTWluV2lkdGggPSAnbWluLXdpZHRoJyxcblxuICBQYWdlUm93Q291bnQgPSAncGFnZS1yb3ctY291bnQnLFxuICBQYXJhbWV0ZXJDYXB0aW9uID0gJ3BhcmVtZXRlci1jYXB0aW9uJyxcbiAgUGFyYW1ldGVyRXJyb3IgPSAncGFyYW1ldGVyLWVycm9yJyxcbiAgUGFyYW1ldGVyRmllbGROYW1lID0gJ3BhcmFtZXRlci1maWVsZC1uYW1lJyxcbiAgUGFyYW1ldGVySW5mbyA9ICdwYXJhbWV0ZXItaW5mbycsXG4gIFBhcmFtZXRlckluZm9zID0gJ3BhcmFtZXRlci1pbmZvcycsXG4gIFBhcmFtZXRlclZhbHVlID0gJ3BhcmFtZXRlci12YWx1ZScsXG4gIFBlcmlvZFR5cGUgPSAncGVyaW9kLXR5cGUnLFxuICBQdWxzZUZpZWxkTmFtZSA9ICdmaWVsZE5hbWUnLFxuICBQdWxzZUZpZWxkTmFtZXMgPSAnZmllbGROYW1lcycsXG4gIFB1bHNlRmlsdGVyRG9tYWluVHlwZSA9ICdkb21haW5UeXBlJyxcbiAgUHVsc2VGaWx0ZXJEb21haW5TZWFyY2hUZXJtID0gJ3NlYXJjaFRlcm0nLFxuICBQdWxzZVBhZ2VTaXplID0gJ3BhZ2VTaXplJyxcbiAgUHVsc2VOZXh0UGFnZVRva2VuID0gJ25leHRQYWdlVG9rZW4nLFxuICBQdWxzZUZpbHRlcnMgPSAnZmlsdGVycycsXG4gIFB1bHNlVGltZURpbWVuc2lvbiA9ICd0aW1lRGltZW5zaW9uJyxcblxuICBRdWFudGl0YXRpdmVEb21haW4gPSAncXVhbnRpdGF0aXZlLWRtYWluJyxcbiAgUXVhbnRSYW5nZVNlbGVjdGlvbk1vZGVscyA9ICdxdWFudGF0aXZlUmFuZ2VTZWxlY3Rpb25Nb2RlbHMnLFxuXG4gIFJhbmdlTiA9ICdyYW5nZS1uJyxcbiAgUmVwbGF5U3BlZWQgPSAncmVwbGF5LXNwZWVkJyxcblxuICBTZWxlY3RlZERhdGEgPSAnc2VsZWN0ZWQtZGF0YScsXG4gIFNlbGVjdGVkU2hlZXROYW1lcyA9ICdzZWxlY3RlZC1zaGVldC1uYW1lcycsXG4gIFNlbGVjdGlvbiA9ICdzZWxlY3Rpb24nLFxuICBTZWxlY3Rpb25MaXN0ID0gJ3NlbGVjdGlvbi1saXN0JyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSA9ICdzZWxlY3Rpb25VcGRhdGVUeXBlJyxcbiAgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb24gPSAnc2VsZWN0LXR1cGxlcy1pbnRlcmFjdGlvbicsXG4gIFNlbmROb3RpZmljYXRpb25zID0gJ3NlbmQtbm90aWZpY2F0aW9ucycsXG4gIFNldHRpbmdzVmFsdWVzID0gJ3NldHRpbmdzLXZhbHVlcycsXG4gIFNoYXJlZEZpbHRlclNoZWV0cyA9ICdzaGFyZWQtZmlsdGVyLXNoZWV0cycsXG4gIFNoYXJlZEZpbHRlcnNJbmZvID0gJ3NoYXJlZC1maWx0ZXJzLWluZm8nLFxuICBTaGVldElkZW50aWZpZXIgPSAnc2hlZXQtaWRlbnRpZmllcicsXG4gIFNoZWV0TmFtZSA9ICdzaGVldC1uYW1lJyxcbiAgU2hlZXRQYXRoID0gJ3NoZWV0LXBhdGgnLFxuICBTaG91bGRSZWZyZXNoRFMgPSAnc2hvdWxkLXJlZnJlc2gtZHMnLFxuICBTaG93RGF0YVRhYmxlRm9ybWF0ID0gJ3Nob3ctZGF0YS10YWJsZS1mb3JtYXQnLFxuICBTdGFydEluZGV4ID0gJ3N0YXJ0LWluZGV4JyxcbiAgU3RhdGUgPSAnc3RhdGUnLFxuICBTdG9yeVBvaW50SW5kZXggPSAnc3RvcnktcG9pbnQtaW5kZXgnLFxuICBTdG9yeVBvaW50SW5mbyA9ICdzdG9yeS1wb2ludC1pbmZvJyxcbiAgU3dpdGNoVG9TaGVldE5hbWUgPSAnc3dpdGNoLXRvLXNoZWV0LW5hbWUnLFxuXG4gIFRhcmdldFBvaW50ID0gJ3RhcmdldC1wb2ludCcsXG4gIFRlc3RDb252ZXJzaW9uUGFyYW1ldGVyID0gJ3Rlc3QtY29udmVyc2lvbi1wYXJhbWV0ZXInLFxuICBUZXh0ID0gJ2Zvcm1hdHRlZC10ZXh0JyxcbiAgVG9JbmRleCA9ICd0by1pbmRleCcsXG4gIFRvb2x0aXBDb250ZXh0ID0gJ3Rvb2x0aXAtY29udGV4dCcsXG4gIFRvb2x0aXBUZXh0UmVxdWVzdCA9ICd0b29sdGlwLXRleHQtcmVxdWVzdCcsXG4gIFRvb2x0aXBUZXh0ID0gJ3Rvb2x0aXAtdGV4dCcsXG5cbiAgVW5kZXJseWluZ0RhdGFUYWJsZSA9ICd1bmRlcmx5aW5nLWRhdGEtdGFibGUnLFxuICBVbmRlcmx5aW5nU3VtbWFyeURhdGFUYWJsZSA9ICd1bmRlcmx5aW5nLXN1bW1hcnktZGF0YS10YWJsZScsXG4gIFVybCA9ICd1cmwnLFxuICBVc2VUYWJEZWxpbWl0ZXJzID0gJ3VzZS10YWItZGVsaW1pdGVycycsXG5cbiAgVmlld0RhdGFUYWJsZUNhY2hlSWQgPSAndmlldy1kYXRhLXRhYmxlLWNhY2hlLWlkJyxcbiAgVmlld0RhdGFUYWJsZUlkID0gJ3ZpZXctZGF0YS10YWJsZS1pZCcsXG4gIFZpc3VhbElkID0gJ3Zpc3VhbC1pZCcsXG4gIFZpc3VhbFNwZWNpZmljYXRpb24gPSAndmlzdWFsLXNwZWNpZmljYXRpb24nLFxuICBWaXpBUElJbnB1dEpzb24gPSAndml6YXBpLWlucHV0LWpzb24nLFxuICBWaXpBUElTdGF0ZVdpdGhEYXRhTW9kZWwgPSAndml6YXBpLXN0YXRlLXdpdGgtZGF0YS1tb2RlbCcsXG4gIFZpekFQSVN0YXRlV2FybmluZ01zZyA9ICd2aXphcGktc3RhdGUtd2FybmluZy1tc2cnLFxuICBWaXpBUElTVkcgPSAndml6YXBpLXN2ZycsXG5cbiAgV29ya3NoZWV0TmFtZSA9ICd3b3Jrc2hlZXQtbmFtZScsXG4gIFdvcmtzaGVldEZpbHRlcnMgPSAnd29ya3NoZWV0LWZpbHRlcnMnLFxuXG4gIFpvbmVJZHNWaXNpYmlsaXR5TWFwID0gJ3pvbmUtaWRzLXZpc2liaWxpdHktbWFwJyxcbn1cbiIsIi8vIERlY2xhcmUgdGhpcyBrZXkgdHlwZSBhbmQgZXhwb3J0IHRoZSBOb3RpZmljYXRpb25JZCB0byBtYWtlIHRoaXMgYmVoYXZlIGxpa2UgYSBzdHJpbmcgZW51bS5cbi8vXG4vLyBQTEVBU0UgS0VFUCBJTiBBTFBIQUJFVElDQUwgT1JERVIuIFRoaXMgaGVscHMgd2l0aCB2aXN1YWxseSBmaW5kaW5nIGVudHJpZXMsIGtub3dpbmcgd2hlcmUgdG8gcHV0XG4vLyBuZXcgb25lcywgYW5kIG1lcmdlIGNvbmZsaWN0cy5cbmV4cG9ydCBlbnVtIFZlcmJJZCB7XG4gIEFjdGl2YXRlTmV4dFN0b3J5UG9pbnQgPSAnYWN0aXZhdGUtbmV4dC1zdG9yeS1wb2ludCcsXG4gIEFjdGl2YXRlUHJldmlvdXNTdG9yeVBvaW50ID0gJ2FjdGl2YXRlLXByZXZpb3VzLXN0b3J5LXBvaW50JyxcbiAgQWN0aXZhdGVTaGVldCA9ICdhY3RpdmF0ZVNoZWV0JyxcbiAgQWN0aXZhdGVTdG9yeVBvaW50ID0gJ2FjdGl2YXRlLXN0b3J5LXBvaW50JyxcbiAgQWRkTWFya3NDYXJkRmllbGRzID0gJ2FkZC1tYXJrcy1jYXJkLWZpZWxkcycsXG4gIEFwcGVuZEV4dGVybmFsTWVudUl0ZW0gPSAnYXBwZW5kLWV4dGVybmFsLW1lbnUtaXRlbScsXG4gIEFwcGx5Q2F0ZWdvcmljYWxGaWx0ZXIgPSAnY2F0ZWdvcmljYWwtZmlsdGVyJyxcbiAgQXBwbHlQdWxzZUZpbHRlcnMgPSAnYXBwbHktcHVsc2UtZmlsdGVycycsXG4gIEFwcGx5UHVsc2VUaW1lRGltZW5zaW9uID0gJ2FwcGx5LXB1bHNlLXRpbWUtZGltZW5zaW9uJyxcbiAgQXBwbHlSYW5nZUZpbHRlciA9ICdyYW5nZS1maWx0ZXInLFxuICBBcHBseVJlbGF0aXZlRGF0ZUZpbHRlciA9ICdhcHBseS1yZWxhdGl2ZS1kYXRlLUZpbHRlcicsXG4gIEF1dGhlbnRpY2F0ZSA9ICdhdXRoZW50aWNhdGUnLFxuXG4gIEJsb2NrRXh0ZW5zaW9uID0gJ2Jsb2NrLWV4dGVuc2lvbicsXG5cbiAgQ2hhbmdlUGFyYW1ldGVyVmFsdWUgPSAnY2hhbmdlLXBhcmFtZXRlci12YWx1ZScsXG4gIENoYW5nZVNoYXJlZEZpbHRlciA9ICdjaGFuZ2Utc2hhcmVkLWZpbHRlcicsXG4gIENsZWFyQWxsUHVsc2VGaWx0ZXJzID0gJ2NsZWFyLWFsbC1wdWxzZS1maWx0ZXJzJyxcbiAgQ2xlYXJGaWx0ZXIgPSAnY2xlYXItZmlsdGVyJyxcbiAgQ2xlYXJQdWxzZUZpbHRlcnMgPSAnY2xlYXItcHVsc2UtZmlsdGVycycsXG4gIENsZWFyU2VsZWN0ZWRNYXJrcyA9ICdjbGVhci1zZWxlY3RlZC1tYXJrcycsXG4gIENsb3NlRGlhbG9nID0gJ2Nsb3NlLWRpYWxvZycsXG4gIENyZWF0ZUFubm90YXRpb24gPSAnY3JlYXRlLWFubm90YXRpb24nLFxuXG4gIERhc2hib2FyZENhdGVnb3JpY2FsRmlsdGVyID0gJ2Rhc2hib2FyZC1jYXRlZ29yaWNhbC1maWx0ZXInLFxuICBEaXNwbGF5RGlhbG9nID0gJ2Rpc3BsYXktZGlhbG9nJyxcbiAgRG93bmxvYWRXb3JrYm9vayA9ICdkb3dubG9hZC13b3JrYm9vaycsXG5cbiAgRWRpdEFsaWFzZXNEaWFsb2cgPSAnZWRpdC1hbGlhc2VzLWRpYWxvZycsXG4gIEV4ZWN1dGVFeHRlcm5hbE1lbnVJdGVtID0gJ2V4ZWN1dGUtZXh0ZXJuYWwtbWVudS1pdGVtJyxcbiAgRXhwb3J0Q3Jvc3N0YWIgPSAnZXhwb3J0LWNyb3NzdGFiJyxcbiAgRXhwb3J0Q3Jvc3N0YWJDc3ZEb3dubG9hZCA9ICdleHBvcnQtY3Jvc3N0YWItY3N2LWRvd25sb2FkJyxcbiAgRXhwb3J0Q3Jvc3N0YWJFeGNlbERvd25sb2FkID0gJ2V4cG9ydC1jcm9zc3RhYi1leGNlbC1kb3dubG9hZCcsXG4gIEV4cG9ydERhdGEgPSAnZXhwb3J0LWRhdGEnLFxuICBFeHBvcnREYXRhRG93bmxvYWQgPSAnZXhwb3J0LWRhdGEtZG93bmxvYWQnLFxuICBFeHBvcnRJbWFnZSA9ICdleHBvcnQtaW1hZ2UnLFxuICBFeHBvcnRQZGYgPSAnZXhwb3J0LXBkZicsXG4gIEV4cG9ydFBkZkRvd25sb2FkID0gJ2V4cG9ydC1wZGYtZG93bmxvYWQnLFxuICBFeHBvcnRQb3dlcnBvaW50ID0gJ2V4cG9ydC1wb3dlcnBvaW50JyxcbiAgRXhwb3J0UG93ZXJwb2ludERvd25sb2FkID0gJ2V4cG9ydC1wb3dlcnBvaW50LWRvd25sb2FkJyxcblxuICBGaW5kUGFyYW1ldGVyID0gJ2ZpbmQtcGFyYW1ldGVyJyxcblxuICBHZXRBY3RpdmVUYWJsZXMgPSAnZ2V0LWFjdGl2ZS10YWJsZXMnLFxuICBHZXRBbGxEYXRhU291cmNlcyA9ICdnZXQtYWxsLWRhdGEtc291cmNlcycsXG4gIEdldEFubm90YXRpb25zID0gJ2dldC1hbm5vdGF0aW9ucycsXG4gIEdldENhdGVnb3JpY2FsRG9tYWluID0gJ2dldC1jYXRlZ29yaWNhbC1kb21haW4nLFxuICBHZXRDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMgPSAnZ2V0LWNvbm5lY3Rpb24tZGVzY3JpcHRpb24tc3VtbWFyaWVzJyxcbiAgR2V0Q3VycmVudFNyYyA9ICdnZXQtY3VycmVudC1zcmMnLFxuICBHZXRDdXN0b21WaWV3cyA9ICdnZXQtY3VzdG9tLXZpZXdzJyxcbiAgR2V0RGFzaGJvYXJkRmlsdGVycyA9ICdnZXQtZGFzaGJvYXJkLWZpbHRlcnMnLFxuICBHZXREYXRhU291cmNlID0gJ2dldC1kYXRhc291cmNlJyxcbiAgR2V0RGF0YVNvdXJjZURhdGEgPSAnZ2V0LWRhdGFzb3VyY2UtZGF0YScsXG4gIEdldERhdGFTb3VyY2VzID0gJ2dldC1kYXRhLXNvdXJjZXMnLFxuICBHZXREYXRhU3VtbWFyeURhdGEgPSAnZ2V0LXN1bW1hcnktZGF0YScsXG4gIEdldERhdGFTdW1tYXJ5RGF0YVJlYWRlciA9ICdnZXQtc3VtbWFyeS1kYXRhLXJlYWRlcicsXG4gIEdldERhdGFUYWJsZVJlYWRlclBhZ2UgPSAnZ2V0LWRhdGEtdGFibGUtcmVhZGVyLXBhZ2UnLFxuICBHZXRFbWJlZGRpbmdBYnN0cmFjdFF1ZXJ5V2l0aERhdGFNb2RlbCA9ICdnZXQtZW1iZWRkaW5nLWFic3RyYWN0LXF1ZXJ5LXdpdGgtZGF0YS1tb2RlbCcsXG4gIEdldEVtYmVkZGluZ0NsaWVudEluZm8gPSAnZ2V0LWVtYmVkZGluZy1jbGllbnQtaW5mbycsXG4gIEdldFZpelN0YXRlV2l0aERhdGFNb2RlbCA9ICdnZXQtdml6LXN0YXRlLXdpdGgtZGF0YS1tb2RlbCcsXG4gIEdldEV4cG9ydENyb3NzdGFiU2hlZXRNYXAgPSAnZ2V0LWV4cG9ydC1jcm9zc3RhYi1zaGVldC1tYXAnLFxuICBHZXRFeHBvcnRQZGZPcHRpb25zID0gJ2dldC1leHBvcnQtcGRmLW9wdGlvbnMnLFxuICBHZXRGaWVsZCA9ICdnZXQtZmllbGQnLFxuICBHZXRGaWVsZEFuZERhdGFTb3VyY2UgPSAnZ2V0LWZpZWxkLWFuZC1kYXRhc291cmNlJyxcbiAgR2V0VmlzdWFsU3BlY2lmaWNhdGlvbiA9ICdnZXQtdmlzdWFsLXNwZWNpZmljYXRpb24nLFxuICBHZXRGaWx0ZXJzID0gJ2dldC1maWx0ZXJzJyxcbiAgR2V0Rm9udHMgPSAnZ2V0LWZvbnRzJyxcbiAgR2V0SGlnaGxpZ2h0ZWRNYXJrcyA9ICdnZXQtaGlnaGxpZ2h0ZWQtbWFya3MnLFxuICBHZXRKb2luRGVzY3JpcHRpb24gPSAnZ2V0LWpvaW4tZGVzY3JpcHRpb24nLFxuICBHZXRMb2dpY2FsVGFibGVEYXRhID0gJ2dldC1sb2dpY2FsLXRhYmxlLWRhdGEnLFxuICBHZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyID0gJ2dldC1sb2dpY2FsLXRhYmxlLWRhdGEtcmVhZGVyJyxcbiAgR2V0TG9naWNhbFRhYmxlcyA9ICdnZXQtbG9naWNhbC10YWJsZXMnLFxuICBHZXRQYXJhbWV0ZXJzRm9yU2hlZXQgPSAnZ2V0LXBhcmFtZXRlcnMtZm9yLXNoZWV0JyxcbiAgR2V0UHVsc2VDYXRlZ29yaWNhbERvbWFpbiA9ICdnZXQtcHVsc2UtY2F0ZWdvcmljYWwtZG9tYWluJyxcbiAgR2V0UHVsc2VGaWx0ZXJzID0gJ2dldC1wdWxzZS1maWx0ZXJzJyxcbiAgR2V0UHVsc2VUaW1lRGltZW5zaW9uID0gJ2dldC1wdWxzZS10aW1lLWRpbWVuc2lvbicsXG4gIEdldFJhbmdlRG9tYWluID0gJ2dldC1yYW5nZS1kb21haW4nLFxuICBHZXRTZWxlY3RlZE1hcmtzID0gJ2dldC1zZWxlY3RlZC1tYXJrcycsXG4gIEdldFNoYXJlZEZpbHRlciA9ICdnZXQtc2hhcmVkLWZpbHRlcicsXG4gIEdldFRvb2x0aXBUZXh0ID0gJ2dldC10b29sdGlwLXRleHQnLFxuICBHZXRVbmRlcmx5aW5nRGF0YSA9ICdnZXQtdW5kZXJseWluZy1kYXRhJyxcbiAgR2V0VW5kZXJseWluZ1RhYmxlRGF0YSA9ICdnZXQtdW5kZXJseWluZy10YWJsZS1kYXRhJyxcbiAgR2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlciA9ICdnZXQtdW5kZXJseWluZy10YWJsZS1kYXRhLXJlYWRlcicsXG4gIEdldFVuZGVybHlpbmdUYWJsZXMgPSAnZ2V0LXVuZGVybHlpbmctdGFibGVzJyxcblxuICBIaWVyYXJjaGljYWxGaWx0ZXIgPSAnaGllcmFjaGljYWwtZmlsdGVyJyxcblxuICBJbml0aWFsaXplRXh0ZW5zaW9uID0gJ2luaXRpYWxpemUtZXh0ZW5zaW9uJyxcbiAgSXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUgPSAnaXMtYW5hbHl0aWNzLWFzc2lzdGFudC1hdmFpbGFibGUnLFxuXG4gIExhdW5jaEFuYWx5dGljc0Fzc2lzdGFudCA9ICdsYXVuY2gtYW5hbHl0aWNzLWFzc2lzdGFudCcsXG5cbiAgTW92ZUFuZFJlc2l6ZVpvbmVzID0gJ21vdmUtYW5kLXJlc2l6ZS16b25lcycsXG4gIE1vdmVNYXJrc0NhcmRGaWVsZCA9ICdtb3ZlLW1hcmtzLWNhcmQtZmllbGQnLFxuXG4gIFJhaXNlTGVhdmVNYXJrTmF2Tm90aWZpY2F0aW9uID0gJ3JhaXNlLWxlYXZlLW1hcmstbmF2LW5vdGlmaWNhdGlvbicsXG4gIFJhaXNlSG92ZXJUdXBsZU5vdGlmaWNhdGlvbiA9ICdyYWlzZS1ob3Zlci10dXBsZS1ub3RpZmljYXRpb24nLFxuICBSYWlzZVNlbGVjdFR1cGxlc05vdGlmaWNhdGlvbiA9ICdyYWlzZS1zZWxlY3QtdHVwbGVzLW5vdGlmaWNhdGlvbicsXG4gIFJlZG8gPSAncmVkbycsXG4gIFJlZnJlc2hEYXRhU291cmNlID0gJ3JlZnJlc2gtZGF0YS1zb3VyY2UnLFxuICBSZWxlYXNlRGF0YVRhYmxlUmVhZGVyID0gJ3JlbGVhc2UtZGF0YS10YWJsZS1yZWFkZXInLFxuICBSZW1vdmVBbm5vdGF0aW9uID0gJ3JlbW92ZS1hbm5vdGF0aW9uJyxcbiAgUmVtb3ZlQ3VzdG9tVmlldyA9ICdyZW1vdmUtY3VzdG9tLXZpZXcnLFxuICBSZW1vdmVFeHRlcm5hbE1lbnVJdGVtID0gJ3JlbW92ZS1leHRlcm5hbC1tZW51LWl0ZW0nLFxuICBSZW5hbWVFeHRlcm5hbE1lbnUgPSAncmVuYW1lLWV4dGVybmFsLW1lbnUnLFxuICBSZXBsYXlBbmltYXRpb24gPSAncmVwbGF5LWFuaW1hdGlvbicsXG4gIFJldmVydFN0b3J5UG9pbnQgPSAncmV2ZXJ0LXN0b3J5LXBvaW50JyxcbiAgUmV2ZXJ0V29ya2Jvb2sgPSAncmV2ZXJ0LXdvcmtib29rJyxcblxuICBTYXZlRXh0ZW5zaW9uU2V0dGluZ3MgPSAnc2F2ZS1leHRlbnNpb24tc2V0dGluZ3MnLFxuICBTYXZlV29ya2Jvb2tBc0N1c3RvbVZpZXcgPSAnc2F2ZS13b3JrYm9vay1hcy1jdXN0b20tdmlldycsXG4gIFNlbGVjdEJ5VmFsdWUgPSAnc2VsZWN0LWJ5LXZhbHVlJyxcbiAgU2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdCA9ICdzZXQtYWN0aXZlLWN1c3RvbS12aWV3LWFzLWRlZmF1bHQnLFxuICBTZXRBdXRvVXBkYXRlID0gJ3NldC1hdXRvLXVwZGF0ZScsXG4gIFNldENsaWNrVGhyb3VnaCA9ICdzZXQtY2xpY2stdGhyb3VnaCcsXG4gIFNlbmREaWFsb2dNZXNzYWdlID0gJ3NlbmQtZGlhbG9nLW1lc3NhZ2UnLFxuICBTZW5kTWVzc2FnZVRvUGFyZW50ID0gJ3NlbmQtbWVzc2FnZS10by1wYXJlbnQnLFxuICBTZXRWaXpTdGF0ZVdpdGhEYXRhTW9kZWwgPSAnc2V0LXZpei1zdGF0ZS13aXRoLWRhdGEtbW9kZWwnLFxuICBTZXRTaGVldFNpemUgPSAnc2V0LXNoZWV0LXNpemUnLFxuICBTZXRab25lVmlzaWJpbGl0eSA9ICdzZXQtem9uZS12aXNpYmlsaXR5JyxcbiAgU2hhcmUgPSAnc2hhcmUnLFxuICBTaG93Q3VzdG9tVmlldyA9ICdzaG93LWN1c3RvbS12aWV3JyxcbiAgU3BsaWNlTWFya3NDYXJkRmllbGRzID0gJ3NwbGljZS1tYXJrcy1jYXJkLWZpZWxkcycsXG5cbiAgVGVzdENvbnZlcnNpb25WZXJiID0gJ3Rlc3QtY29udmVyc2lvbi12ZXJiJyxcblxuICBVbmRvID0gJ3VuZG8nLFxuICBVcGRhdGVDdXN0b21WaWV3ID0gJ3VwZGF0ZS1jdXN0b20tdmlldycsXG5cbiAgVml6QVBJID0gJ3Zpei1hcGknLFxufVxuIiwiZXhwb3J0IGVudW0gQXNrRGF0YU9wdGlvbk5hbWVzIHtcbiAgdG9rZW4gPSAndG9rZW4nLFxuICBvcmlnaW4gPSAnb3JpZ2luJyxcbiAgc2hvd0VtYmVkID0gJ3Nob3dFbWJlZCcsXG4gIHNob3dQaW4gPSAnc2hvd1BpbicsXG4gIHNob3dTYXZlID0gJ3Nob3dTYXZlJyxcbiAgc2hvd1NoYXJlID0gJ3Nob3dTaGFyZScsXG4gIGRlYnVnID0gJzpqc2RlYnVnJyxcbiAgQXBpSUQgPSAnOmFwaUlEJyxcbiAgQXBpRXh0ZXJuYWxWZXJzaW9uID0gJzphcGlFeHRlcm5hbFZlcnNpb24nLFxuICBBcGlJbnRlcm5hbFZlcnNpb24gPSAnOmFwaUludGVybmFsVmVyc2lvbicsXG4gIEFza0RhdGFXZWJDb21wb25lbnQgPSAnOmFza0RhdGFXZWJDb21wb25lbnQnLFxufVxuIiwiZXhwb3J0IGVudW0gUHVsc2VPcHRpb25OYW1lcyB7XG4gIGVtYmVkID0gJ2VtYmVkJyxcbiAgdG9rZW4gPSAndG9rZW4nLFxuICBkaXNhYmxlRXhwbG9yZUZpbHRlciA9ICdkaXNhYmxlRXhwbG9yZUZpbHRlcicsXG4gIGxheW91dCA9ICdlbWJlZF9sYXlvdXQnLFxuICB0aGVtZSA9ICdlbWJlZF90aGVtZScsXG4gIEFwaUV4dGVybmFsVmVyc2lvbiA9ICc6YXBpRXh0ZXJuYWxWZXJzaW9uJyxcbiAgQXBpSW50ZXJuYWxWZXJzaW9uID0gJzphcGlJbnRlcm5hbFZlcnNpb24nLFxuICBQdWxzZVdlYkNvbXBvbmVudCA9ICc6cHVsc2VXZWJDb21wb25lbnQnLFxufVxuIiwiLyoqXG4gKiBUaGVzZSBzdHJpbmdzIHdlcmUgKm1hbnVhbGx5IGNvcGllZCogZnJvbSB0aGUgc2VydmVyLFxuICogd29ya2dyb3VwL3NyYy9zaWxvcy90YWJsZWF1LXNlcnZlci9saWJyYXJpZXMvdGFiLWNvbnRyb2xsZXItdml6cWwvc3JjL2NvbS90YWJsZWF1c29mdHdhcmUvXG4gKiBjb250cm9sbGVyL3ZpenFsL2NvbnN0YW50cy9QYXJhbWV0ZXJLZXlzLmphdmEjTDlcbiAqIHNob3VsZCBiZSBleHBvcnRlZCBpbnN0ZWFkXG4gKiBwYXJhbWV0ZXJzIHRoYXQgdml6cWwgd2lsbCBhY2NlcHQgaW4gYW4gZW1iZWRkaW5nIFVSTFxuICoqL1xuZW51bSBWcWxQYXJhbWV0ZXJOYW1lcyB7XG4gIE9ORSA9ICcxJyxcbiAgQUxFUlRTID0gJzphbGVydHMnLFxuICBBTElBUyA9ICdhbGlhcycsXG4gIEFMTE9XX0RFRkVSUkVEX0JPT1RTVFJBUCA9ICc6YWxsb3dEZWZlcnJlZEJvb3RzdHJhcCcsXG4gIEFMTE9XX0FVVE9HRU5fV09SS1NIRUVUX1BIT05FX0xBWU9VVFMgPSAnYWxsb3dBdXRvZ2VuV29ya3NoZWV0UGhvbmVMYXlvdXRzJyxcbiAgQVBJX0lEID0gJzphcGlJRCcsXG4gIEFQUCA9ICc6YXBwJyxcbiAgQVRUQUNITUVOVCA9ICdhdHRhY2htZW50JyxcbiAgSVNfSVBBRF9BUFAgPSAnYXBwJyxcbiAgQU5JTUFURV9UUkFOU0lUSU9OID0gJzphbmltYXRlX3RyYW5zaXRpb24nLFxuICBBU0NFTkRJTkcgPSAnYXNjZW5kaW5nJyxcbiAgQVVUSEVOVElDQVRJT04gPSAnYXV0aGVudGljYXRpb24nLFxuICBBVFRSSUJVVEVTID0gJ2F0dHJpYnV0ZXMnLFxuICBBVVRIT1JJTkdfU0hFRVQgPSAnOmF1dGhTaGVldCcsXG4gIEFYSVMgPSAnYXhpcycsXG4gIEJPT1RTVFJBUF9XSEVOX05PVElGSUVEID0gJzpib290c3RyYXBXaGVuTm90aWZpZWQnLFxuICBCUk9XU0VSX0JBQ0tfQlVUVE9OX1VORE8gPSAnOmJyb3dzZXJCYWNrQnV0dG9uVW5kbycsXG4gIEJST1dTRVJfUkVOREVSSU5HX09OID0gJ2lzQnJvd3NlclJlbmRlcmluZycsXG4gIEJST1dTRVJfUkVOREVSSU5HX1RIUkVTSE9MRCA9ICdicm93c2VyUmVuZGVyaW5nVGhyZXNob2xkJyxcbiAgQ0hBUlNFVCA9ICdjaGFyc2V0JyxcbiAgQ0xJRU5UX0RJTUVOU0lPTiA9ICdjbGllbnREaW1lbnNpb24nLFxuICBDTElFTlRfSVAgPSAnY2xpZW50X2lwJyxcbiAgQ0xJRU5UX05VTSA9ICdjbGllbnROdW0nLFxuICBDT0xPTl9FTUJFRERFRCA9ICc6ZW1iZWRkZWQnLFxuICBDT0xPTl9NT0JJTEUgPSAnOm1vYmlsZScsXG4gIENPTE9OX0RFRVBfTElOS0lOR19ESVNBQkxFRCA9ICc6ZGVlcExpbmtpbmdEaXNhYmxlZCcsXG4gIENPTE9OX1dBVEVSTUFSSyA9ICc6d2F0ZXJtYXJrJyxcbiAgQ09NTUVOVFMgPSAnOmNvbW1lbnRzJyxcbiAgQ09NTUVOVElOR19FTkFCTEVEID0gJzpjb21tZW50aW5nRW5hYmxlZCcsXG4gIENPTU1FTlRJTkdfTUVOVElPTlNfRU5BQkxFRCA9ICc6Y29tbWVudGluZ01lbnRpb25zJyxcbiAgQ09OTkVDVElPTiA9ICdjb25uZWN0aW9uJyxcbiAgQ1JFQVRFRF9CWV9GRUFUVVJFID0gJ2NyZWF0ZWRCeUZlYXR1cmUnLFxuICBDUllQVEVEX1BBU1NXT1JEID0gJ2NyeXB0ZWQnLFxuICBDU1NERUJVRyA9ICc6Y3NzZGVidWcnLFxuICBDU1YgPSAnY3N2JyxcbiAgQ1VTVE9NX1ZJRVdTID0gJzpjdXN0b21WaWV3cycsXG4gIENWID0gJzpjdicsXG4gIENWX0lEID0gJ2N2SWQnLFxuICBEQVNIQk9BUkRfUE9SVF9TSVpFID0gJ2Rhc2hib2FyZFBvcnRTaXplJyxcbiAgREFUQV9ERVRBSUxTID0gJzpkYXRhRGV0YWlscycsXG4gIERBVEFTT1VSQ0UgPSAnZGF0YXNvdXJjZScsXG4gIERFQlVHID0gJzpkZWJ1ZycsXG4gIERFTEFZID0gJzpkZWxheScsXG4gIERFUFRIID0gJ2RlcHRoJyxcbiAgREVWSUNFX1RZUEUgPSAnOmRldmljZScsXG4gIERFVklDRV9QSVhFTF9SQVRJTyA9ICdkZXZpY2VQaXhlbFJhdGlvJyxcbiAgREVWSUNFX1BSRVZJRVdfTU9ERSA9ICc6ZGV2aWNlcHJldmlld21vZGUnLFxuICBESU1FTlNJT05TID0gJzpkaW1lbnNpb25zJyxcbiAgRElTQUJMRV9TSEFSRURfU0VTU0lPTlMgPSAnOmRpc2FibGVfc2hhcmVkX3Nlc3Npb25zJyxcbiAgRElTQUJMRV9VUkxfQUNUSU9OU19QT1BVUFMgPSAnOmRpc2FibGVVcmxBY3Rpb25zUG9wdXBzJyxcbiAgRElSRUNUSU9OID0gJ2RpcmVjdGlvbicsXG4gIERJU1BMQVlfT1ZFUkxBWSA9ICc6ZGlzcGxheV9vdmVybGF5JyxcbiAgRElTUExBWV9TSEFSRSA9ICc6ZGlzcGxheV9zaGFyZScsXG4gIERJU1BMQVlfU1BJTk5FUiA9ICc6ZGlzcGxheV9zcGlubmVyJyxcbiAgRElTUExBWV9TVEFUSUNfSU1BR0UgPSAnOmRpc3BsYXlfc3RhdGljX2ltYWdlJyxcbiAgRElTUExBWV9UQUJTID0gJ2Rpc3BsYXlfdGFicycsXG4gIERJU1BMQVlfVklFV19DT1VOVCA9ICc6ZGlzcGxheV9jb3VudCcsXG4gIElHTk9SRV9TVElDS1lfU0VTU0lPTiA9ICc6aWdub3JlX3N0aWNreV9zZXNzaW9uJyxcbiAgSU5DUkVNRU5UX1ZJRVdfQ09VTlQgPSAnOmluY3JlbWVudF92aWV3X2NvdW50JyxcbiAgRE9DTU9ERSA9ICdkb2Ntb2RlJyxcbiAgRE9NQUlOID0gJ2RvbWFpbicsXG4gIERPX1dPUksgPSAnZG9fd29yaycsXG4gIERYID0gJ2R4JyxcbiAgRFkgPSAnZHknLFxuICBFRElUX0RBVEFfQUxFUlQgPSAnOmVkaXREYXRhQWxlcnQnLFxuICBFTUJFRCA9ICc6ZW1iZWQnLFxuICBFTUJFRERFRCA9ICdlbWJlZGRlZCcsXG4gIEVOQ1JZUFRFRCA9ICdlbmNyeXB0ZWQnLFxuICBBUElfRVhURVJOQUxfVkVSU0lPTiA9ICc6YXBpRXh0ZXJuYWxWZXJzaW9uJyxcbiAgQVBJX0lOVEVSTkFMX1ZFUlNJT04gPSAnOmFwaUludGVybmFsVmVyc2lvbicsXG4gIEVYQ0xVREUgPSAnZXhjbHVkZScsXG4gIEVYUE9SVF9GT1JNQVQgPSAnOmV4cG9ydF9mb3JtYXQnLFxuICBGSUVMRE5BTUUgPSAnZmllbGRuYW1lJyxcbiAgRklFTERfTkFNRSA9ICdmaWVsZF9uYW1lJyxcbiAgRklFTERfU0VQID0gJ2ZpZWxkX3NlcCcsXG4gIEZJTEUgPSAnZmlsZScsXG4gIEZJTFRFUl9USUxFX1NJWkUgPSAnZmlsdGVyVGlsZVNpemUnLFxuICBGTiA9ICdmbicsXG4gIEZPQ1VTID0gJ2ZvY3VzJyxcbiAgRk9SQ0VfQ0FDSEUgPSAnZm9yY2VfY2FjaGUnLFxuICBGT1JNQVQgPSAnZm9ybWF0JyxcbiAgRk9STUFUX0RBVEFfVkFMVUVfTE9DQUxMWSA9ICdmb3JtYXREYXRhVmFsdWVMb2NhbGx5JyxcbiAgRlJPTV9XRyA9ICc6ZnJvbV93ZycsXG4gIEdSQVBIUUxfREFUQUJBU0VfSUQgPSAnOmdyYXBoUUxEYXRhYmFzZUlkJyxcbiAgR1JBUEhRTF9UQUJMRV9JRCA9ICc6Z3JhcGhRTFRhYmxlSWQnLFxuICBHVUlEID0gJzpndWlkJyxcbiAgSCA9ICdoJyxcbiAgSElEREVOID0gJ2hpZGRlbicsXG4gIEhJREVfQ0xPU0VfQlVUVE9OID0gJzpoaWRlQ2xvc2VCdXR0b24nLFxuICBISURFX0VESVRfQlVUVE9OID0gJzpoaWRlRWRpdEJ1dHRvbicsXG4gIEhJREVfRURJVF9JTl9ERVNLVE9QX0JVVFRPTiA9ICc6aGlkZUVkaXRJbkRlc2t0b3BCdXR0b24nLFxuICBISUdIX0RQSSA9ICc6aGlnaGRwaScsXG4gIElNQUdFX1NJWkVfTElNSVQgPSAnaW1hZ2VTaXplTGltaXQnLFxuICBUUkFOU1BBUkVOVF9MSU5FX01BUktTX0xJTUlUID0gJ3RyYW5zcGFyZW50TGluZU1hcmtMaW1pdCcsXG4gIENMSUVOVF9SRU5ERVJfUElYRUxfTElNSVQgPSAnY2xpZW50UmVuZGVyUGl4ZWxMaW1pdCcsXG4gIElOID0gJ2luJyxcbiAgSU5TVEFOQ0VfSUQgPSAnOmlpZCcsXG4gIElTX0dVRVNUX1JFRElSRUNUX0ZST01fVklaUE9SVEFMID0gJzppc0d1ZXN0UmVkaXJlY3RGcm9tVml6cG9ydGFsJyxcbiAgSVNfTUFSS19BTklNQVRJT05fRU5BQkxFRCA9ICdpc01hcmtBbmltYXRpb25FbmFibGVkJyxcbiAgSVNfVklaUE9SVEFMID0gJzppc1ZpelBvcnRhbCcsXG4gIElOUFVUXyA9ICdpbnB1dF9zdHJpbmcnLFxuICBKU0RFQlVHID0gJzpqc2RlYnVnJyxcbiAgSlNPTiA9ICdqc29uJyxcbiAgSlNPTl9PTkxZID0gJzpqc29uT25seScsXG4gIEtFRVBGSUxFID0gJ2tlZXBmaWxlJyxcbiAgS0VZID0gJ2tleScsXG4gIExBTkdVQUdFID0gJ2xhbmd1YWdlJyxcbiAgTEFOR1VBR0VfUkVRVUVTVEVEID0gJzpsYW5ndWFnZScsXG4gIExJTktUQVJHRVQgPSAnOmxpbmt0YXJnZXQnLFxuICBMT0FEX09SREVSX0lEID0gJzpsb2FkT3JkZXJJRCcsIC8vIHVzZWQgZm9yIFB1YmxpY1xuICBMT0FEX05FV0VTVF9SRVZJU0lPTiA9ICc6bG9hZE5ld2VzdFJldmlzaW9uJyxcbiAgTE9DQUxfUEFUSFMgPSAnOmxvY2FsUGF0aHMnLFxuICBMT0NBTEUgPSAnbG9jYWxlJyxcbiAgTE9DQVRJT05fSUQgPSAnbG9jYXRpb25pZCcsXG4gIExPQ0FUSU9OX1RZUEUgPSAnbG9jYXRpb250eXBlJyxcbiAgV09SS0JPT0tfTE9DQUxFID0gJ3dvcmtib29rTG9jYWxlJyxcbiAgTUFYUk9XUyA9ICdtYXhyb3dzJyxcbiAgTUFYX0FHRSA9ICdtYXhBZ2UnLFxuICBNQVhfUk9XUyA9ICdtYXhSb3dzJyxcbiAgTUVUSE9EID0gJ21ldGhvZCcsXG4gIE1PQklMRSA9ICdtb2JpbGUnLFxuICBNT0RJRklFUiA9ICdtb2RpZmllcicsXG4gIE5BTUUgPSAnbmFtZScsXG4gIE5BVl9UWVBFID0gJ25hdlR5cGUnLFxuICBOQVZfU1JDID0gJ25hdlNyYycsXG4gIE5PQVRUQUNITUVOVCA9ICduby1hdHRhY2htZW50JyxcbiAgTk9fT1ZFUldSSVRFID0gJ25vX292ZXJ3cml0ZScsXG4gIE9QRU5fQVVUSE9SSU5HX0lOX1RPUF9XSU5ET1cgPSAnOm9wZW5BdXRob3JpbmdJblRvcFdpbmRvdycsXG4gIE9QRU5JRF9IRCA9ICc6b3BlbmlkX2hkJyxcbiAgT1BFTklEX0xPR0lOX0hJTlQgPSAnOm9wZW5pZF9sb2dpbl9oaW50JyxcbiAgT0FVVEhSRVFVRVNUID0gJ29hdXRocmVxdWVzdCcsXG4gIE9BVVRIX0NSRURFTlRJQUxfSURTID0gJ29hdXRoX2NyZWRlbnRpYWxfaWRzJyxcbiAgT0ZGTElORV9NT0RFID0gJzpvZmZsaW5lbW9kZScsXG4gIE9SSUdJTiA9ICc6b3JpZ2luJyxcbiAgT1ZFUkxBWSA9ICc6b3ZlcmxheScsXG4gIFAgPSAncCcsXG4gIFBBVEggPSAncGF0aCcsXG4gIFBBTkVfUkVTT0xWRVJfWCA9ICdwYW5lUmVzb2x2ZXJYJyxcbiAgUEFORV9SRVNPTFZFUl9ZID0gJ3BhbmVSZXNvbHZlclknLFxuICBQQVJBTSA9ICdwYXJhbScsXG4gIFBBUkVOVF9JRCA9ICdwYXJlbnRfaWQnLFxuICBQQVNTV09SRCA9ICdwYXNzd29yZCcsXG4gIFBBVFRFUk4gPSAncGF0dGVybicsXG4gIFBJWEVMX1JBVElPID0gJzpwaXhlbHJhdGlvJyxcbiAgUFJFRklYID0gJzpwcmVmaXgnLFxuICBQUkVWSUVXID0gJzpwcmV2aWV3JyxcbiAgUFJJTUFSWV9DT05URU5UX1VSTCA9ICdwcmltYXJ5X2NvbnRlbnRfdXJsJyxcbiAgUFJPSkVDVCA9ICdwcm9qZWN0JyxcbiAgUFJPVE9DT0wgPSAncHJvdG9jb2wnLFxuICBQU0VVRE8gPSAnOnBzZXVkbycsXG4gIFFVRVJZID0gJ3F1ZXJ5JyxcbiAgUiA9ICdyJyxcbiAgUkFOR0VfVFlQRSA9ICdyYW5nZV90eXBlJyxcbiAgUkVDT1JEX1NFUCA9ICdyZWNvcmRfc2VwJyxcbiAgUkVDT1JEX0NMSUVOVF9QRVJGT1JNQU5DRSA9ICc6cmVjb3JkX2NsaWVudF9wZXJmb3JtYW5jZScsXG4gIFJFQ09SRF9QRVJGT1JNQU5DRSA9ICc6cmVjb3JkX3BlcmZvcm1hbmNlJyxcbiAgUkVDT1ZFUl9PTERfU0VTU0lPTl9JRCA9ICc6cmVjb3Zlcl9vbGRfc2Vzc2lvbl9pZCcsXG4gIFJFQ09WRVJfU0VTU0lPTl9TVEFURV9USUNLRVRTID0gJzpyZWNvdmVyX3Nlc3Npb25fc3RhdGVfdGlja2V0cycsXG4gIFJFRlJFU0ggPSAnOnJlZnJlc2gnLFxuICBSRUZSRVNIVU5NT0RJRklFRCA9ICc6cmVmcmVzaHVubW9kaWZpZWQnLFxuICBSRUdJT04gPSAncmVnaW9uJyxcbiAgUkVMT0FEX09OX0NVU1RPTV9WSUVXX1NBVkUgPSAnOnJlbG9hZE9uQ3VzdG9tVmlld1NhdmUnLFxuICBSRU5ERVIgPSAnOnJlbmRlcicsXG4gIFJFTkRFUl9NQVBTX0NMSUVOVF9TSURFID0gJ3JlbmRlck1hcHNDbGllbnRTaWRlJyxcbiAgUkVUUlkgPSAnOnJldHJ5JyxcbiAgUkVVU0UgPSAncmV1c2UnLFxuICBSRVVTRV9GT1JFVkVSID0gJ3JldXNlX2ZvcmV2ZXInLFxuICBSRVZFUlQgPSAnOnJldmVydCcsXG4gIFNBVkVfREJfUEFTU1dPUkRTID0gJ3NhdmVfZGJfcGFzc3dvcmRzJyxcbiAgU0VMRUNUX1ggPSAnc2VsZWN0X3gnLFxuICBTRUxFQ1RfWSA9ICdzZWxlY3RfeScsXG4gIFNFU1NJT05fRkVBVFVSRV9QUkVGSVggPSAnOmZmXycsXG4gIFNFU1NJT05fRkxBR1MgPSAnOnNlc3Npb25fZmVhdHVyZV9mbGFncycsXG4gIFNIQVJFX0JVVFRPTiA9ICdzaGFyZV9idXR0b24nLFxuICBTSEVFVF9JRCA9ICdzaGVldF9pZCcsXG4gIFNIQVJFRCA9ICdzaGFyZWQnLFxuICBTSE9XQUxMID0gJ3Nob3dhbGwnLFxuICBTSE9XX0FQUF9CQU5ORVIgPSAnOnNob3dBcHBCYW5uZXInLFxuICBTSE9XX0FTS19EQVRBID0gJzpzaG93QXNrRGF0YScsXG4gIFNIT1dfUEFSQU1TID0gJ3Nob3dQYXJhbXMnLFxuICBTSE9XX1NIQVJFX09QVElPTlMgPSAnOnNob3dTaGFyZU9wdGlvbnMnLFxuICBTSVpFID0gJzpzaXplJyxcbiAgU09VUkNFID0gJ3NvdXJjZScsXG4gIFNUQVRFID0gJ3N0YXRlJyxcbiAgU1RJQ0tZX1NFU1NJT05fS0VZID0gJ3N0aWNreVNlc3Npb25LZXknLFxuICBTVUJTQ1JJUFRJT05TID0gJzpzdWJzY3JpcHRpb25zJyxcbiAgU1VNTUFSWSA9ICdzdW1tYXJ5JyxcbiAgU1VQUFJFU1NfREVGQVVMVF9FRElUX0JFSEFWSU9SID0gJzpzdXBwcmVzc0RlZmF1bHRFZGl0QmVoYXZpb3InLFxuICBTWU5DX1NFU1NJT04gPSAnOnN5bmNfc2Vzc2lvbicsXG4gIFNZTkNfU0VTU0lPTl9TVEFURSA9ICdzeW5jX3Nlc3Npb25fc3RhdGUnLFxuICBUQUJTID0gJzp0YWJzJyxcbiAgVEFSR0VUID0gJ3RhcmdldCcsXG4gIFRBUkdFVF9TSVRFID0gJ3RhcmdldF9zaXRlJyxcbiAgVE9PTEJBUiA9ICc6dG9vbGJhcicsXG4gIFRPT0xUSVAgPSAnOnRvb2x0aXAnLFxuICBUUyA9ICd0cycsXG4gIFVOREVSTFlJTkdfVEFCTEVfSUQgPSAndW5kZXJseWluZ190YWJsZV9pZCcsXG4gIFVOREVSTFlJTkdfVEFCTEVfQ0FQVElPTiA9ICd1bmRlcmx5aW5nX3RhYmxlX2NhcHRpb24nLFxuICBVUERBVEVfVFlQRSA9ICd1cGRhdGVfdHlwZScsXG4gIFVTRV9HVUVTVCA9ICc6dXNlR3Vlc3QnLFxuICBVU0VfSU5MSU5FX0lNQUdFUyA9ICd1c2VfaW5saW5lX2ltYWdlcycsXG4gIFVTRVJBR0VOVCA9ICd1c2VyYWdlbnQnLFxuICBVU0VSTkFNRSA9ICd1c2VybmFtZScsXG4gIFZBTFVFID0gJ3ZhbHVlJyxcbiAgVkVSQk9TRV9NT0RFID0gJ3ZlcmJvc2VNb2RlJyxcbiAgVklFV19JRCA9ICd2aWV3c19pZCcsXG4gIFZJWl9TTkFQU0hPVF9JRCA9ICd2aXpfc25hcHNob3RfaWQnLFxuICBWVyA9ICc6dncnLFxuICBXID0gJ3cnLFxuICBXT1JLU0hFRVRfUE9SVF9TSVpFID0gJ3dvcmtzaGVldFBvcnRTaXplJyxcbiAgV0FURVJNQVJLID0gJ3dhdGVybWFyaycsXG4gIFdBVEVSTUFSS19NQVJHSU4gPSAnOndhdGVybWFya19tYXJnaW4nLFxuICBXQiA9ICc6d2InLFxuICBXSElDSCA9ICd3aGljaCcsXG4gIFggPSAneCcsXG4gIFkgPSAneScsXG4gIFpJRCA9ICd6aWQnLFxuICBaT05FX0lEID0gJ3pvbmVfaWQnLFxuICBLRVlDSEFJTl9WRVJTSU9OID0gJ2tleWNoYWluX3ZlcnNpb24nLFxuICBEQVRBU09VUkNFX0lEID0gJ2RhdGFzb3VyY2VfaWQnLFxuICBEQVRBU09VUkNFX05BTUUgPSAnZGF0YXNvdXJjZV9uYW1lJyxcbiAgTEVOU19JRCA9ICdsZW5zX2lkJyxcbiAgV0lEVEggPSAnd2lkdGgnLFxuICBIRUlHSFQgPSAnaGVpZ2h0JyxcblxuICAvLyBEZWZhdWx0IExheW91dCBwYXJhbXNcbiAgTEFZT1VUX1ZJRVdTID0gJ3ZpZXdzJyxcbiAgTEFZT1VUX01FTlVTID0gJ21lbnVzJyxcbiAgTEFZT1VUX0dFT01FVFJZID0gJ2dlb21ldHJ5JyxcbiAgTEFZT1VUX1BBR0VTID0gJ3BhZ2VzJyxcbiAgTEFZT1VUX0NBQ0hFVVJMID0gJ2NhY2hldXJsJyxcbiAgTEFZT1VUX1NIRUVUID0gJ3NoZWV0JyxcbiAgTEFZT1VUX0RFUFRIID0gJ2RlcHRoJyxcbn1cblxuLyoqXG4gKiBwYXJhbWV0ZXJzIHRoYXQgYXJlIG9ubHkgcmVsZXZhbnQgd2hlbiB3b3JraW5nIHdpdGggVGFibGVhdSBQdWJsaWNcbiAqIG1heWJlIG5vdCByZWFsbHkgbmVjZXNzcnkgdG8gc3BsaXQgdGhlbSBvdXRcbiAqL1xuZW51bSBQdWJsaWNQYXJhbWV0ZXJOYW1lcyB7XG4gIFNIT1dfVklaX0hPTUUgPSAnOnNob3dWaXpIb21lJyxcbiAgLy8gZGlzcGxheSB2aWV3IGNvdW50XG59XG5cbi8qKlxuICogTWFwIHRoZSBwYXJhbWV0ZXIgbmFtZXMgYXMgdXNlZCBpbiB0aGUgdXJsIHRvIHdoYXQgd2UgY2FsbCB0aGVtIHB1YmxpY2x5IGluIHRoZSBlbWJlZGRpbmcgbGlicmFyeS5cbiAqIFRoZSBvbmx5IHBhcmFtZXRlcnMgbGlzdGVkIGhlcmUgc2hvdWxkIGJlIHRoZSBvbmVzIHRoYXQgZ2V0IHNlbnQgdG8gdml6cWxcbiAqICAtIHRoaXMgc2hvdWxkIG1hdGNoIHRoZSBpbnRlcmZhY2UgYXQgZXh0ZXJuYWwtY29udHJhY3Q6Vml6SW50ZXJmYWNlczpWaXpTZXR0aW5nc1xuICovXG5leHBvcnQgZW51bSBWaXpPcHRpb25OYW1lcyB7XG4gIC8vIHB1YmxpY05hbWUgPSBpbnRlcm5hbFN0cmluZ1ZhbHVlXG4gIFNpemUgPSBWcWxQYXJhbWV0ZXJOYW1lcy5TSVpFLFxuICBFbWJlZCA9IFZxbFBhcmFtZXRlck5hbWVzLkVNQkVELFxuICBBcGlJbnRlcm5hbFZlcnNpb24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5BUElfSU5URVJOQUxfVkVSU0lPTixcbiAgQXBpRXh0ZXJuYWxWZXJzaW9uID0gVnFsUGFyYW1ldGVyTmFtZXMuQVBJX0VYVEVSTkFMX1ZFUlNJT04sXG4gIFNob3dWaXpIb21lID0gUHVibGljUGFyYW1ldGVyTmFtZXMuU0hPV19WSVpfSE9NRSxcbiAgSnNkZWJ1ZyA9IFZxbFBhcmFtZXRlck5hbWVzLkpTREVCVUcsXG4gIEJvb3RzdHJhcFdoZW5Ob3RpZmllZCA9IFZxbFBhcmFtZXRlck5hbWVzLkJPT1RTVFJBUF9XSEVOX05PVElGSUVELFxuICBOYXZUeXBlID0gVnFsUGFyYW1ldGVyTmFtZXMuTkFWX1RZUEUsXG4gIE5hdlNyYyA9IFZxbFBhcmFtZXRlck5hbWVzLk5BVl9TUkMsXG4gIGRlYnVnID0gVnFsUGFyYW1ldGVyTmFtZXMuSlNERUJVRyxcbiAgQXBpSUQgPSBWcWxQYXJhbWV0ZXJOYW1lcy5BUElfSUQsXG5cbiAgZGlzYWJsZVVybEFjdGlvbnNQb3B1cHMgPSBWcWxQYXJhbWV0ZXJOYW1lcy5ESVNBQkxFX1VSTF9BQ1RJT05TX1BPUFVQUyxcbiAgaGlkZVRhYnMgPSBWcWxQYXJhbWV0ZXJOYW1lcy5UQUJTLFxuICB0b29sYmFyID0gVnFsUGFyYW1ldGVyTmFtZXMuVE9PTEJBUixcbiAgZGV2aWNlID0gVnFsUGFyYW1ldGVyTmFtZXMuREVWSUNFX1RZUEUsXG4gIGluc3RhbmNlSWRUb0Nsb25lID0gVnFsUGFyYW1ldGVyTmFtZXMuSU5TVEFOQ0VfSUQsXG4gIHRvdWNoT3B0aW1pemUgPSBWcWxQYXJhbWV0ZXJOYW1lcy5NT0JJTEUsXG4gIGhpZGVFZGl0QnV0dG9uID0gVnFsUGFyYW1ldGVyTmFtZXMuSElERV9FRElUX0JVVFRPTixcbiAgaGlkZUVkaXRJbkRlc2t0b3BCdXR0b24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5ISURFX0VESVRfSU5fREVTS1RPUF9CVVRUT04sXG4gIHN1cHByZXNzRGVmYXVsdEVkaXRCZWhhdmlvciA9IFZxbFBhcmFtZXRlck5hbWVzLlNVUFBSRVNTX0RFRkFVTFRfRURJVF9CRUhBVklPUixcbiAgaGlkZUNsb3NlQnV0dG9uID0gVnFsUGFyYW1ldGVyTmFtZXMuSElERV9DTE9TRV9CVVRUT04sXG59XG4iLCJpbXBvcnQgKiBhcyBndWlkIGZyb20gJ2d1aWQnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIE1vZGVsLCBOb3RpZmljYXRpb25JZCwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZS9Jbml0aWFsaXphdGlvbk9wdGlvbnMnO1xuaW1wb3J0IHsgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZSB9IGZyb20gJy4vQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZSc7XG5pbXBvcnQge1xuICBpc0NvbW1hbmRNZXNzYWdlLFxuICBpc0NvbW1hbmRSZXNwb25zZU1lc3NhZ2UsXG4gIGlzSGFuZHNoYWtlTWVzc2FnZSxcbiAgaXNJbml0TWVzc2FnZSxcbiAgaXNNZXNzYWdlLFxuICBpc05vdGlmaWNhdGlvbk1lc3NhZ2UsXG59IGZyb20gJy4vTWVzc2FnZVR5cGVDaGVja3MnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZE1lc3NhZ2VIYW5kbGVyLFxuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcixcbiAgSGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIsXG4gIEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcixcbiAgTm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIsXG59IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VMaXN0ZW5lcic7XG5pbXBvcnQge1xuICBDb21tYW5kTWVzc2FnZSxcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgSGFuZHNoYWtlTWVzc2FnZSxcbiAgSW5pdGlhbGl6ZU1lc3NhZ2UsXG4gIE1lc3NhZ2UsXG4gIE1lc3NhZ2VUeXBlLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxufSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuaW1wb3J0IHsgTWVzc2VuZ2VyIH0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2VuZ2VyJztcbmltcG9ydCB7IFByZXBhcmVkTWVzc2FnZSB9IGZyb20gJy4vaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5cbi8qKlxuICogVGhlIENyb3NzRnJhbWVNZXNzZW5nZXIgaXMgdGhlIHByaW1hcnkgZXhwb3J0IGZyb20gdGhlIGFwaS1tZXNzYWdpbmcgbW9kdWxlLiBBbiBpbnN0YW5jZSBvZlxuICogdGhpcyBjbGFzcyBjYW4gYmUgaW5zdGFudGlhdGVkIG9uIGJvdGggc2lkZXMgb2YgYSBmcmFtZSBib3VuZGFyeSB0byBmYWNpbGl0YXRlIGNvbW11bmljYXRpb25cbiAqIGluIGJvdGggZGlyZWN0aW9ucyBiZXR3ZWVuIHRoZSBmcmFtZXMuIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBib3RoIHRoZSBkaXNwYXRjaGVyIGFuZCB0aGUgbGlzdGVuZXJcbiAqIHBvcnRpb25zLCBidXQgZG9lc24ndCByZXF1aXJlIGNhbGxlcnMgdG8gY2FyZSBhYm91dCBib3RoLlxuICovXG5leHBvcnQgY2xhc3MgQ3Jvc3NGcmFtZU1lc3NlbmdlciBpbXBsZW1lbnRzIE1lc3NlbmdlciB7XG4gIHByaXZhdGUgdW5yZWdpc3RlckZ1bmN0aW9uPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBpbml0aWFsaXplTWVzc2FnZUhhbmRsZXI/OiBJbml0aWFsaXplTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXI/OiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBjb21tYW5kTWVzc2FnZUhhbmRsZXI/OiBDb21tYW5kTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXI/OiBOb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBoYW5kc2hha2VNZXNzYWdlSGFuZGxlcj86IEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENyb3NzRnJhbWVNZXNzZW5nZXIuIElmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB0aGUgQ3Jvc3NGcmFtZU1lc3NlbmdlciBhcyBhIE1lc3NhZ2VMaXN0ZW5lcixcbiAgICogYmUgc3VyZSB0byBjYWxsIFN0YXJ0TGlzdGVuaW5nIGFuZCByZWdpc3RlciBtZXNzYWdlIGhhbmRsZXJzLlxuICAgKiBAcGFyYW0gdGhpc1dpbmRvdyBUaGUgd2luZG93IG9iamVjdCB3aGljaCB0aGUgQ3Jvc3NGcmFtZU1lc3NlbmdlciBsaXZlcy4gQW4gb25NZXNzYWdlIGxpc3RlbmVyIHdpbGwgYmUgYWRkZWQgaGVyZS5cbiAgICogQHBhcmFtIFtvdGhlcldpbmRvd10gT3B0aW9uYWwgb3RoZXJXaW5kb3cgd2hpY2ggbWVzc2FnZXMgd2lsbCBiZSBwb3N0ZWQgdG8uXG4gICAqICAgICAgICAgICAgICAgICAgICAgIElmIGRlZmluZWQsIGluY29taW5nIG1lc3NhZ2VzIG11c3Qgb3JpZ2luYXRlIGZyb20gb3RoZXJXaW5kb3cgdG8gYmUgcGFzc2VkIG9uXG4gICAqIEBwYXJhbSBbb3RoZXJXaW5kb3dPcmlnaW5dIFRoZSB0YXJnZXQgb3JpZ2luIHdoaWNoIG90aGVyV2luZG93IG11c3QgaGF2ZSBpbiBvcmRlciB0byByZWNlaXZlIGRpc3BhdGNoZWQgbWVzc2FnZXMuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgd2lsbCBiZSBzZW50IGFzIHRoZSB0YXJnZXRPcmlnaW4gb2YgYSBwb3N0TWVzc2FnZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9wb3N0TWVzc2FnZSlcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIHRoaXNXaW5kb3c6IFdpbmRvdywgcHJpdmF0ZSBvdGhlcldpbmRvdz86IFdpbmRvdywgcHJpdmF0ZSBvdGhlcldpbmRvd09yaWdpbj86IHN0cmluZykge1xuICAgIC8vIE1ha2Ugc3VyZSB0byBjYWxsIFN0YXJ0TGlzdGVuaW5nXG4gIH1cblxuICAvLy8vLyBNZXNzYWdlTGlzdGVuZXIgSW1wbGVtZW50YXRpb25cblxuICBwdWJsaWMgc3RhcnRMaXN0ZW5pbmcoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBhcmUgbGlzdGVuaW5nLCBpZiBub3QsIGhvb2sgdXAgYSBtZXNzYWdlIGxpc3RlbmVyXG4gICAgaWYgKCF0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbikge1xuICAgICAgY29uc3QgYm91bmRIYW5kbGVyID0gdGhpcy5vbk1lc3NhZ2VSZWNlaXZlZC5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy50aGlzV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBib3VuZEhhbmRsZXIsIHRydWUpO1xuICAgICAgdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24gPSAoKSA9PiB0aGlzLnRoaXNXaW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGJvdW5kSGFuZGxlciwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0b3BMaXN0ZW5pbmcoKTogdm9pZCB7XG4gICAgLy8gU3RvcCBsaXN0ZW5pbmcgaWYgd2UgaGF2ZSBzdGFydGVkIGxpc3RlbmluZ1xuICAgIGlmICh0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbikge1xuICAgICAgdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24oKTtcbiAgICAgIHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRJbml0aWFsaXplTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb21tYW5kTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IENvbW1hbmRNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZE1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXROb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogTm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRIYW5kc2hha2VNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogSGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIC8vLy8vIE1lc3NhZ2VEaXNwYXRjaGVyIEltcGxlbWVudGF0aW9uXG5cbiAgLyoqXG4gICAqIEBwYXJhbSBhcGlWZXJzaW9uIGFwaS1pbnRlcm5hbC1jb250cmFjdC1qcyB2ZXJzaW9uIChleHBvcnRlZCBpbiBKc0FwaUludGVybmFsQ29ubnRyYWN0KVxuICAgKiBAcGFyYW0gY3Jvc3NGcmFtZVZlcnNpb24gY3Jvc3NmcmFtZSBtZXNzYWdpbmcgdmVyc2lvbiAoZXhwb3J0ZWQgaW4gSnNBcGlJbnRlcm5hbENvbm50cmFjdClcbiAgICogQHBhcmFtIG9wdGlvbnMgYWRkaXRpb25hbCBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCBhdCBpbml0aWFsaXphdGlvbiAoaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlcnNpb24gb2ZcbiAgICogICAgICAgICAgICAgICAgZXh0ZXJuYWwgYmVpbmcgdXNlZCBmb3IgZXhhbXBsZSlcbiAgICovXG4gIHB1YmxpYyBwcmVwYXJlSW5pdGlhbGl6YXRpb25NZXNzYWdlKFxuICAgIGFwaVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgY3Jvc3NGcmFtZVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgb3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucyxcbiAgKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBJbml0aWFsaXplTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Jbml0aWFsaXplLFxuICAgICAgY3Jvc3NGcmFtZVZlcnNpb246IGNyb3NzRnJhbWVWZXJzaW9uLFxuICAgICAgYXBpVmVyc2lvbjogYXBpVmVyc2lvbixcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVDb21tYW5kTWVzc2FnZSh2ZXJiSWQ6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IENvbW1hbmRNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkNvbW1hbmQsXG4gICAgICB2ZXJiSWQ6IHZlcmJJZCxcbiAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVDb21tYW5kUmVzcG9uc2VNZXNzYWdlKGNvbW1hbmRHdWlkOiBzdHJpbmcsIGRhdGE6IE1vZGVsIHwgdW5kZWZpbmVkLCBlcnJvcjogTW9kZWwgfCB1bmRlZmluZWQpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuQ29tbWFuZFJlc3BvbnNlLFxuICAgICAgY29tbWFuZEd1aWQ6IGNvbW1hbmRHdWlkLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9O1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAvLyBzdHJpbmdpZnkgZXJyb3Igb2JqZWN0IHRvIHJlbW92ZSB1bnNlcmlhbGl6YWJsZSBmaWVsZHMgbGlrZSBmdW5jdGlvbnMgYW5kIHByZXZlbnQgc2VyaWFsaXphdGlvbiBlcnJvcnNcbiAgICAgIG1lc3NhZ2UuZXJyb3IgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZU5vdGlmaWNhdGlvbk1lc3NhZ2Uobm90aWZpY2F0aW9uSWQ6IE5vdGlmaWNhdGlvbklkLCBkYXRhOiBNb2RlbCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogTm90aWZpY2F0aW9uTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24sXG4gICAgICBub3RpZmljYXRpb25JZDogbm90aWZpY2F0aW9uSWQsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlQWNrTWVzc2FnZSgpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IEhhbmRzaGFrZU1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuQWNrLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uOiBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBhIHBlbmRpbmcgbWVzc2FnZSBmb3Igc2VuZGluZyBhbmQgcmV0dXJucyB0aGUgcHJlcGFyZWQgbWVzc2FnZVxuICAgKlxuICAgKiBAcGFyYW0gbXNnIFRoZSBtZXNzYWdlIHRvIGJlIHNlbnQgdG8gdGhpcy5vdGhlcldpbmRvd1xuICAgKiBAcmV0dXJucyBUaGUgcHJlcGFyZWQgbWVzc2FnZVxuICAgKi9cbiAgcHJpdmF0ZSBwcmVwYXJlTWVzc2FnZShtc2c6IE1lc3NhZ2UpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGlmICghdGhpcy5vdGhlcldpbmRvdyB8fCAhdGhpcy5vdGhlcldpbmRvd09yaWdpbikge1xuICAgICAgdGhyb3cgJ090aGVyIHdpbmRvdyBub3QgaW5pdGlhbGl6ZWQsIGNhbm5vdCBkaXNwYXRjaCBtZXNzYWdlcyc7XG4gICAgfVxuXG4gICAgY29uc3QgcHJlcGFyZWRNZXNzYWdlID0gbmV3IENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UobXNnLCB0aGlzLm90aGVyV2luZG93LCB0aGlzLm90aGVyV2luZG93T3JpZ2luKTtcbiAgICByZXR1cm4gcHJlcGFyZWRNZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZC4gRG9lcyBzb21lIHZhbGlkYXRpb24gb2YgdGhlIG1lc3NhZ2UsIGFuZCB0aGVuXG4gICAqIGNhbGxzIGFuIGFwcHJvcHJpYXRlIG1lc3NhZ2UgaGFuZGxlciBpZiBvbmUgaXMgZGVmaW5lZFxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGluY29taW5nIE1lc3NhZ2VFdmVudFxuICAgKi9cbiAgcHJpdmF0ZSBvbk1lc3NhZ2VSZWNlaXZlZChldmVudDogTWVzc2FnZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhbiBvdGhlcldpbmRvdyBkZWZpbmVkLCBtYWtlIHN1cmUgdGhlIG1lc3NhZ2UgaXMgY29taW5nIGZyb20gdGhlcmVcbiAgICBpZiAodGhpcy5vdGhlcldpbmRvdyAmJiBldmVudC5zb3VyY2UgIT09IHRoaXMub3RoZXJXaW5kb3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEbyBzb21lIHZhbGlkYXRpb24gb24gZXZlbnQuZGF0YSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIHJlY2VpdmVkIGEgcmVhbCBtZXNzYWdlXG4gICAgaWYgKCFldmVudC5kYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGE7XG4gICAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayB0aGUgZGVjbGFyZWQgbWVzc2FnZSB0eXBlLCB2YWxpZGF0ZSB0aGUgbWVzc2FnZSwgYW5kIGNhbGwgYW4gYXBwcm9wcmlhdGUgaGFuZGVyIGlmIG9uZSBleGlzdHNcbiAgICBzd2l0Y2ggKG1lc3NhZ2UubXNnVHlwZSkge1xuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Jbml0aWFsaXplOiB7XG4gICAgICAgIGlmICghaXNJbml0TWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5pbml0aWFsaXplTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRpYWxpemVNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuQ29tbWFuZFJlc3BvbnNlOiB7XG4gICAgICAgIGlmICghaXNDb21tYW5kUmVzcG9uc2VNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuQ29tbWFuZDoge1xuICAgICAgICBpZiAoIWlzQ29tbWFuZE1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuY29tbWFuZE1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21tYW5kTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbjoge1xuICAgICAgICBpZiAoIWlzTm90aWZpY2F0aW9uTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkhhbmRzaGFrZToge1xuICAgICAgICBpZiAoIWlzSGFuZHNoYWtlTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5oYW5kc2hha2VNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgLy8gSnVzdCBpZ25vcmUgdGhpcyBzaW5jZSB3ZSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdGhlIG1lc3NhZ2UgdHlwZVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRPdGhlcldpbmRvdyhvdGhlcldpbmRvdzogV2luZG93KTogdm9pZCB7XG4gICAgdGhpcy5vdGhlcldpbmRvdyA9IG90aGVyV2luZG93O1xuICB9XG5cbiAgcHVibGljIHNldE90aGVyV2luZG93T3JpZ2luKG9yaWdpbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vdGhlcldpbmRvd09yaWdpbiA9IG9yaWdpbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VUeXBlcyc7XG5pbXBvcnQgeyBQcmVwYXJlZE1lc3NhZ2UgfSBmcm9tICcuL2ludGVyZmFjZS9QcmVwYXJlZE1lc3NhZ2UnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBQcmVwYXJlZE1lc3NhZ2UgaW50ZXJmYWNlIHVzZWQgdG8gcG9zdCBtZXNzYWdlcyBiZXR3ZWVuXG4gKiB0d28gZnJhbWVzIHVzaW5nIHdpbmRvdy5wb3N0TWVzc2FnZVxuICovXG5leHBvcnQgY2xhc3MgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZSBpbXBsZW1lbnRzIFByZXBhcmVkTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UuXG4gICAqIEBwYXJhbSBfbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBiZSBzZW50XG4gICAqIEBwYXJhbSBfdGFyZ2V0IFRoZSB0YXJnZXQgd2luZG93IHdoZXJlIHRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudFxuICAgKiBAcGFyYW0gX29yaWdpbiBUaGUgdGFyZ2V0T3JpZ2luIHdoZXJlIHRoaXMgbWVzc2FnZSBjYW4gYmUgcmVjZWl2ZWRcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tZXNzYWdlOiBNZXNzYWdlLCBwcml2YXRlIF90YXJnZXQ6IFdpbmRvdywgcHJpdmF0ZSBfb3JpZ2luOiBzdHJpbmcpIHt9XG5cbiAgcHVibGljIGdldCBtZXNzYWdlR3VpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlLm1zZ0d1aWQ7XG4gIH1cblxuICBwdWJsaWMgc2VuZCgpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIHRoaXMuX3RhcmdldC5wb3N0TWVzc2FnZSh0aGlzLl9tZXNzYWdlLCB0aGlzLl9vcmlnaW4pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBndWlkIGZyb20gJ2d1aWQnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uSWQgfSBmcm9tICcuLi9jb250cmFjdC9Ob3RpZmljYXRpb25zJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9pbnRlcmZhY2UvVmVyc2lvbk51bWJlcic7XG5pbXBvcnQge1xuICBDb21tYW5kTWVzc2FnZSxcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgSGFuZHNoYWtlTWVzc2FnZSxcbiAgSW5pdGlhbGl6ZU1lc3NhZ2UsXG4gIE1lc3NhZ2UsXG4gIE1lc3NhZ2VUeXBlLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxufSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuXG5jb25zdCBleHBlY3RlZEVtcHR5Tm90aWZpY2F0aW9ucyA9IG5ldyBTZXQoW1xuICBOb3RpZmljYXRpb25JZC5FZGl0QnV0dG9uQ2xpY2tlZCxcbiAgTm90aWZpY2F0aW9uSWQuRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQsXG4gIE5vdGlmaWNhdGlvbklkLldvcmtib29rUHVibGlzaGVkLFxuICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va1JlYWR5VG9DbG9zZSxcbiAgTm90aWZpY2F0aW9uSWQuUmVhZHlUb1JlY2VpdmVBdXRoVG9rZW4sXG5dKTtcblxuLyogdHNsaW50OmRpc2FibGUgbm8tYW55ICovXG5leHBvcnQgZnVuY3Rpb24gaXNNZXNzYWdlKGRhdGE6IE1lc3NhZ2UgfCBhbnkpOiBkYXRhIGlzIE1lc3NhZ2Uge1xuICBpZiAoIWRhdGEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gZGF0YSBhcyBNZXNzYWdlO1xuICBpZiAoIW1lc3NhZ2UgfHwgIW1lc3NhZ2UubXNnR3VpZCB8fCAhbWVzc2FnZS5tc2dUeXBlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFndWlkLmlzR3VpZChtZXNzYWdlLm1zZ0d1aWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBtZXNzYWdlLm1zZ1R5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZVR5cGVzOiBBcnJheTxzdHJpbmc+ID0gW1xuICAgIE1lc3NhZ2VUeXBlLkNvbW1hbmQsXG4gICAgTWVzc2FnZVR5cGUuQ29tbWFuZFJlc3BvbnNlLFxuICAgIE1lc3NhZ2VUeXBlLkluaXRpYWxpemUsXG4gICAgTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uLFxuICAgIE1lc3NhZ2VUeXBlLkhhbmRzaGFrZSxcbiAgXTtcblxuICBpZiAobWVzc2FnZVR5cGVzLmluZGV4T2YobWVzc2FnZS5tc2dUeXBlKSA8IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmVyc2lvbih2ZXJzaW9uTnVtYmVyOiBWZXJzaW9uTnVtYmVyIHwgYW55KTogdmVyc2lvbk51bWJlciBpcyBWZXJzaW9uTnVtYmVyIHtcbiAgaWYgKCF2ZXJzaW9uTnVtYmVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgdiA9IHZlcnNpb25OdW1iZXIgYXMgVmVyc2lvbk51bWJlcjtcblxuICBpZiAodHlwZW9mIHYgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2LmZpeCAhPT0gJ251bWJlcicgfHwgdHlwZW9mIHYubWlub3IgIT09ICdudW1iZXInIHx8IHR5cGVvZiB2Lm1ham9yICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbml0TWVzc2FnZShtZXNzYWdlOiBJbml0aWFsaXplTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgSW5pdGlhbGl6ZU1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGluaXRNZXNzYWdlID0gbWVzc2FnZSBhcyBJbml0aWFsaXplTWVzc2FnZTtcbiAgaWYgKGluaXRNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkluaXRpYWxpemUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWluaXRNZXNzYWdlLmFwaVZlcnNpb24gfHwgIWlzVmVyc2lvbihpbml0TWVzc2FnZS5hcGlWZXJzaW9uKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaW5pdE1lc3NhZ2UuY3Jvc3NGcmFtZVZlcnNpb24gfHwgIWlzVmVyc2lvbihpbml0TWVzc2FnZS5jcm9zc0ZyYW1lVmVyc2lvbikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tbWFuZFJlc3BvbnNlTWVzc2FnZShtZXNzYWdlOiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBDb21tYW5kUmVzcG9uc2VNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjck1lc3NhZ2UgPSBtZXNzYWdlIGFzIENvbW1hbmRSZXNwb25zZU1lc3NhZ2U7XG4gIGlmIChjck1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuQ29tbWFuZFJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFndWlkLmlzR3VpZChjck1lc3NhZ2UuY29tbWFuZEd1aWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFjck1lc3NhZ2UuZGF0YSAmJiAhY3JNZXNzYWdlLmVycm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbW1hbmRNZXNzYWdlKG1lc3NhZ2U6IENvbW1hbmRNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBDb21tYW5kTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY29tbWFuZE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENvbW1hbmRNZXNzYWdlO1xuICBpZiAoY29tbWFuZE1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuQ29tbWFuZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghY29tbWFuZE1lc3NhZ2UucGFyYW1ldGVycyB8fCB0eXBlb2YgY29tbWFuZE1lc3NhZ2UucGFyYW1ldGVycyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWNvbW1hbmRNZXNzYWdlLnZlcmJJZCB8fCB0eXBlb2YgY29tbWFuZE1lc3NhZ2UudmVyYklkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOb3RpZmljYXRpb25NZXNzYWdlKG1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIE5vdGlmaWNhdGlvbk1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2UgPSBtZXNzYWdlIGFzIE5vdGlmaWNhdGlvbk1lc3NhZ2U7XG4gIGlmIChub3RpZmljYXRpb25NZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghbm90aWZpY2F0aW9uTWVzc2FnZS5kYXRhICYmICFleHBlY3RlZEVtcHR5Tm90aWZpY2F0aW9ucy5oYXMobm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIW5vdGlmaWNhdGlvbk1lc3NhZ2Uubm90aWZpY2F0aW9uSWQgfHwgdHlwZW9mIG5vdGlmaWNhdGlvbk1lc3NhZ2Uubm90aWZpY2F0aW9uSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hhbmRzaGFrZU1lc3NhZ2UobWVzc2FnZTogSGFuZHNoYWtlTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgSGFuZHNoYWtlTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaGFuZHNoYWtlTWVzc2FnZSA9IG1lc3NhZ2UgYXMgSGFuZHNoYWtlTWVzc2FnZTtcbiAgaWYgKGhhbmRzaGFrZU1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuSGFuZHNoYWtlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgTW9kZWwsIE5vdGlmaWNhdGlvbklkLCBWZXJiSWQsIFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi8uLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25PcHRpb25zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucyc7XG5cbi8qKlxuICogRW51bSBkZWZpbmluZyB0aGUgNCBkaWZmZXJlbnQgdHlwZXMgb2YgbWVzc2FnZXMgd2UgaGF2ZSBkZWZpbmVkXG4gKi9cbmV4cG9ydCBlbnVtIE1lc3NhZ2VUeXBlIHtcbiAgSW5pdGlhbGl6ZSA9ICdpbml0aWFsaXplJyxcbiAgTm90aWZpY2F0aW9uID0gJ25vdGlmaWNhdGlvbicsXG4gIENvbW1hbmQgPSAnY29tbWFuZCcsXG4gIENvbW1hbmRSZXNwb25zZSA9ICdjb21tYW5kLXJlc3BvbnNlJyxcbiAgSGFuZHNoYWtlID0gJ3YtaGFuZHNoYWtlJyxcbiAgQWNrID0gJ3YtYWNrJyxcbn1cblxuLyoqXG4gKiBUaGUgTWVzc2FnZSBpbnRlcmZhY2UgaXMgdGhlIGJhc2UgaW50ZXJmYWNlIGZvciBhbGwgdGhlIG90aGVyXG4gKiBtZXNzYWdlIHR5cGUgaW50ZXJmYWNlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEEgdW5pcXVlIGlkIGZvciB0aGlzIG1lc3NhZ2VcbiAgICovXG4gIG1zZ0d1aWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHR5cGUgb2YgdGhpcyBtZXNzYWdlXG4gICAqL1xuICBtc2dUeXBlOiBNZXNzYWdlVHlwZTtcbn1cblxuLyoqXG4gKiBUaGUgaW5pdGlhbGl6ZSBtZXNzYWdlIGlzIHRoZSBmaXJzdCBtZXNzYWdlIHdoaWNoIHdpbGwgYmUgc2VudFxuICogZnJvbSB0aGUgamF2YXNjcmlwdCB0byBzZXQgdXAgY29tbXVuaWNhdGlvbnNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbml0aWFsaXplTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2Uge1xuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhlIGFwaSB3aGljaCB0aGUgc2VuZGVyIHdhbnRzIHRvIHVzZVxuICAgKi9cbiAgYXBpVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcblxuICAvKipcbiAgICogVGhlIHZlcnNpb24gb2YgdGhpcyBtZXNzYWdpbmcgY29udHJhY3QgdG8gYmUgdXNlZC4gRm9yIG5vdywgdGhlcmVcbiAgICogc2hvdWxkIG9ubHkgYmUgYSBzaW5nbGUgdmVyc2lvbiBidXQgc2VuZGluZyB0aGlzIGFsb25nIHNob3VsZCBoZWxwXG4gICAqIGlmIHdlIG5lZWQgdG8gYWRkIGEgbmV3IHZlcnNpb24gaW4gYSBmdXR1cmUgcmVsZWFzZVxuICAgKi9cbiAgY3Jvc3NGcmFtZVZlcnNpb246IFZlcnNpb25OdW1iZXI7XG5cbiAgLyoqXG4gICAqIEFkZGl0aW9uYWwgb3B0aW9ucyB0aGF0IGNhbiBiZSBwYXNzZWQgYXQgdGhlIHRpbWUgb2YgaW5pdGlhbGl6YXRpb25cbiAgICovXG4gIG9wdGlvbnM/OiBJbml0aWFsaXphdGlvbk9wdGlvbnM7XG59XG5cbi8qKlxuICogVGhpcyBtZXNzYWdlIGlzIHNlbnQgd2hlbiBhIG5vdGlmaWNhdGlvbiBvY2N1cnMgZnJvbSB0aGUgcHJlc2xheWVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTm90aWZpY2F0aW9uTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2Uge1xuICAvKipcbiAgICogVGhlIGlkIGZvciB0aGlzIHR5cGUgb2Ygbm90aWZpY2F0aW9uXG4gICAqL1xuICBub3RpZmljYXRpb25JZDogTm90aWZpY2F0aW9uSWQ7XG5cbiAgLyoqXG4gICAqIFRoZSBkYXRhIHdoaWNoIGNhbWUgYWxvbmcgd2l0aCB0aGUgbm90aWZpY2F0aW9uXG4gICAqL1xuICBkYXRhOiBNb2RlbDtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGNhbGxpbmcgYW4gaW50ZXJuYWwgY29udHJhY3QgY29tbWFuZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbW1hbmRNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIGNvbW1hbmQgd2hpY2ggc2hvdWxkIGJlIGV4ZWN1dGVkXG4gICAqL1xuICB2ZXJiSWQ6IFZlcmJJZDtcblxuICAvKipcbiAgICogQW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlcnMgZm9yIHRoZSBjb21tYW5kXG4gICAqL1xuICBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycztcbn1cblxuLyoqXG4gKiBUaGlzIG1lc3NhZ2UgaXMgc2VudCBpbiByZXNwb25zZSB0byBhIENvbW1hbmRNZXNzYWdlIHdpdGggdGhlXG4gKiByZXN1bHQgb2YgdGhhdCBjb21tYW5kcyBpbnZvY2F0aW9uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2Uge1xuICAvKipcbiAgICogR3VpZCBvZiB0aGUgQ29tbWFuZE1lc3NhZ2Ugd2hpY2ggdGhpcyBpcyBpbiByZXNwb25zZSB0b1xuICAgKi9cbiAgY29tbWFuZEd1aWQ6IHN0cmluZztcblxuICAvKipcbiAgICogSWYgdGhlcmUgd2FzIGFuIGVycm9yIHJldHVybmVkIGZyb20gdGhlIGNvbW1hbmQsIHRoaXMgd2lsbCBiZSBkZWZpbmVkXG4gICAqIGFuZCBjb250YWluIHRoZSBlcnJvclxuICAgKi9cbiAgZXJyb3I/OiBNb2RlbDtcblxuICAvKipcbiAgICogSWYgdGhlIGNvbW1hbmQgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5LCB0aGlzIHdpbGwgY29udGFpbiB0aGUgY29tbWFuZCByZXN1bHRcbiAgICovXG4gIGRhdGE/OiBNb2RlbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIYW5kc2hha2VNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBJbnRlcm5hbCBBUEkgY29udHJhY3QgdmVyc2lvblxuICAgKi9cbiAgcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyO1xufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4ZWN1dGVSZXNwb25zZSwgTm90aWZpY2F0aW9uLCBWZXJiSWQgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKlxuICogVGhpcyB2ZXJzaW9uIGNvbnZlcnRlciBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nIGJ1dCBpcyB1c2VmdWwgZm9yIHRlc3Rpbmcgb3Igd2hlbiB3ZSBoYXZlXG4gKiBhIG1hdGNoaW5nIHBsYXRmb3JtIGFuZCBpbnRlcm5hbCB2ZXJzaW9uIG51bWJlclxuICovXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBwdWJsaWMgdXBncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJiOiB2ZXJiIGFzIFZlcmJJZCxcbiAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgYXMgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4ZWN1dGVSZXNwb25zZSwgTm90aWZpY2F0aW9uLCBWZXJiSWQsIFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9ucyBmcm9tICcuL1ZlcnNpb25UcmFuc2xhdGlvbnMnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBjb252ZXJ0ZXIgaXMgZGVzaWduZWQgdG8gYWxsb3cgdGhlIHBsYXRmb3JtIGFuZCBleHRlcm5hbCBtb2R1bGVzXG4gKiB0byBzZWVtbGVzc2x5IGNvbW11bmljYXRlIG92ZXIgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgaW50ZXJuYWwgQVBJLiBUaGUgb25seVxuICogbW9kZSBpdCBzdXBwb3J0cyBpcyBleHRlcm5hbCdzIHZlcnNpb24gPD0gcGxhdGZvcm0ncyB2ZXJzaW9uLiBXaGVuIGV4ZWN1dGluZ1xuICogY29tbWFuZHMsIGl0IGlzIHVzZWQgdG8gdXBncmFkZSB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdG8gd2hhdCBwbGF0Zm9ybSBrbm93cyBvbiB0aGUgd2F5IGluXG4gKiBhbmQgZG93bmdyYWRlIHRoZSByZXByZXNlbnRhdGlvbnMgb24gdGhlIHdheSBvdXQuIFNpbWlsYXJseSBmb3Igbm90aWZpY2F0aW9ucywgaXQgY2FuXG4gKiBkb3duZ3JhZGUgdGhvc2Ugb24gdGhlIHdheSBmcm9tIHBsYXRmb3JtIHRvIGV4dGVybmFsLlxuICovXG5leHBvcnQgY2xhc3MgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyXG4gICAqXG4gICAqIEBwYXJhbSBfZXh0ZXJuYWxWZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCBhcGktZXh0ZXJuYWwtanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9wbGF0Zm9ybVZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHRoZSBhcGktcGxhdGZvcm0tanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdGhlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIHdoZW4gdXBncmFkaW5nIGNtZCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgY21kXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gb24gYSBub3RpZmljYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbURhdGEoXG4gICAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICB1cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4sXG4gICAgZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICAgIGRvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZU5vdGlmaWNhdGlvbj4sXG4gICk6IFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKFxuICAgICAgZXh0ZXJuYWxWZXJzaW9uLm1ham9yLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uLm1ham9yLFxuICAgICAgdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMsXG4gICAgICBkb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zLFxuICAgICAgZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyXG4gICAqXG4gICAqIEBwYXJhbSBfZXh0ZXJuYWxNYWpvclZlcnNpb24gVGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IGFwaS1leHRlcm5hbC1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3BsYXRmb3JtTWFqb3JWZXJzaW9uIFRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB0aGUgYXBpLXBsYXRmb3JtLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHRoZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSB3aGVuIHVwZ3JhZGluZyBjbWQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBhZnRlciBhIGNtZFxuICAgKiBAcGFyYW0gX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIG9uIGEgbm90aWZpY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZXh0ZXJuYWxNYWpvclZlcnNpb246IG51bWJlcixcbiAgICBwcml2YXRlIF9wbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICAgIHByaXZhdGUgX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgICBwcml2YXRlIF9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4sXG4gICAgcHJpdmF0ZSBfZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPixcbiAgKSB7XG4gICAgaWYgKHRoaXMuX2V4dGVybmFsTWFqb3JWZXJzaW9uID4gdGhpcy5fcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgYmV0d2VlbiBleHRlcm5hbCB2ZXJzaW9uICR7dGhpcy5fZXh0ZXJuYWxNYWpvclZlcnNpb259IGFuZCAke3RoaXMuX3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfSB7XG4gICAgLy8gUGVyZm9ybSB0aGUgdXBncmFkZSBvZiB0aGUgdmVyYiBhbmQgcGFyYW1ldGVycyB0byB0aGUgbGV2ZWwgdGhhdCBwbGF0Zm9ybSBpcyB1c2luZ1xuICAgIGxldCB1cGdyYWRlZCA9IHsgdmVyYjogdmVyYiwgcGFyYW1ldGVyczogcGFyYW1ldGVycyB9O1xuICAgIGZvciAoY29uc3QgdXBncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zKSB7XG4gICAgICB1cGdyYWRlZCA9IHVwZ3JhZGVUcmFuc2xhdGlvbih1cGdyYWRlZC52ZXJiLCB1cGdyYWRlZC5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgLy8gRG93bmdyYWRlIHRoZSByZXNwb25zZSB0byB3aGF0IHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgZXhwZWN0aW5nXG4gICAgbGV0IGRvd25ncmFkZWQgPSBleGVjdXRlUmVzcG9uc2U7XG4gICAgZm9yIChjb25zdCBkb3duZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zKSB7XG4gICAgICBkb3duZ3JhZGVkID0gZG93bmdyYWRlVHJhbnNsYXRpb24oZG93bmdyYWRlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvd25ncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICAvLyBEb3duZ3JhZGUgdGhlIG5vdGlmaWNhdGlvbiB0byB3aGF0IHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgZXhwZWN0aW5nXG4gICAgbGV0IGRvd25ncmFkZWQgPSBub3RpZmljYXRpb247XG4gICAgZm9yIChjb25zdCBkb3duZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMpIHtcbiAgICAgIGRvd25ncmFkZWQgPSBkb3duZ3JhZGVUcmFuc2xhdGlvbihkb3duZ3JhZGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG93bmdyYWRlZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0lkZW50aXR5VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9TdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zIGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5pbXBvcnQge1xuICBEb3duZ3JhZGVFeHRlbnNpb25FbnZpcm9ubWVudENvbnRleHQsXG4gIERvd25ncmFkZUZsaXBib2FyZFpvbmVJRCxcbiAgRG93bmdyYWRlUGVyaW9kVHlwZSxcbiAgRG93bmdyYWRlV29ya3NoZWV0Rm9tYXR0aW5nMTc1LFxuICBEb3duZ3JhZGVXb3Jrc2hlZXRGb21hdHRpbmdOb3RpZmljYXRpb24xNzUsXG4gIERvd25ncmFkZVdvcmtzaGVldE5hbWVzLFxufSBmcm9tICcuL1ZlcnNpb25UcmFuc2xhdGlvbnMnO1xuXG4vKipcbiAqIEByZXR1cm5zIHRydWUgaWYgbGhzIDwgcmhzIChpZ25vcmluZyBmaXggbnVtYmVyKVxuICogQHBhcmFtIGxoc1xuICogQHBhcmFtIHJoc1xuICovXG5leHBvcnQgZnVuY3Rpb24gVmVyc2lvbkxlc3NUaGFuKGxoczogVmVyc2lvbk51bWJlciwgcmhzOiBWZXJzaW9uTnVtYmVyKTogYm9vbGVhbiB7XG4gIGlmIChsaHMubWFqb3IgPiByaHMubWFqb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGxocy5tYWpvciA8IHJocy5tYWpvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBsaHMubWlub3IgPCByaHMubWlub3I7XG59XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZiBsaHMgPT0gcmhzIChpZ25vcmluZyBmaXggbnVtYmVyKVxuICogQHBhcmFtIGxoc1xuICogQHBhcmFtIHJoc1xuICovXG5leHBvcnQgZnVuY3Rpb24gVmVyc2lvbkVxdWFsVG8obGhzOiBWZXJzaW9uTnVtYmVyLCByaHM6IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGxocy5tYWpvciA9PT0gcmhzLm1ham9yICYmIGxocy5taW5vciA9PT0gcmhzLm1pbm9yO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1ham9yTWlub3JUcmFuc2xhdG9yczxUPiB7XG4gIFttYWpvcjogbnVtYmVyXTogeyBbbWlub3I6IG51bWJlcl06IEFycmF5PFQ+IH07XG59XG5cbi8vIEEgbWFwcGluZyBmcm9tIGFuIG9sZGVyIGNsaWVudCB2ZXJzaW9uIG9mIGludGVybmFsLWNvbnRyYWN0IHRvIHRoZSBjdXJyZW50IHBsYXRmb3JtIHZlcnNpb24gb2YgdGhpcyBjb250cmFjdC5cbi8vIEVhY2ggdmVyc2lvbiBidW1wIGNhbiBoYXZlIGFuIGFycmF5IG9mIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGluIG9yZGVyLiBOb3RpY2UgdGhhdCB0aGlzIGlzXG4vLyBkaWZmZXJlbnQgdGhhbiB0aGUgbWFqb3IgdXBncmFkZXMvZG93bmdyYWRlcyBhYm92ZSBiZWNhdXNlIGl0IGhhbmRsZXMgYm90aCBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBjaGFuZ2VzLlxuLy8gQWxzbyBwbGVhc2Ugbm90ZTogZG93bmdyYWRlRXhlY3V0ZUNhbGwgaXMgaGFuZGxlZCBvbiB0aGUgY2xpZW50L2V4dGVybmFsIHNpZGUgcmF0aGVyIHRoYW4gcGxhdGZvcm0gc2lkZS5cbi8vIFdoZW4gdXBkYXRpbmcgdGhlIG1ham9yIG9yIG1pbm9yIHZlcnNpb24gb2Ygb3VyIGludGVybmFsLWNvbnRyYWN0LCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGVzZSBkYXRhIHN0cnVjdHVyZXMuXG4vLyAqIElmIHRoZXJlIGFyZSB0cmFuc2xhdGlvbnMgdG8gYWRkLCBhZGQgdGhlbSB0byB0aGUgdmVyc2lvbiB0byBcInVwZ3JhZGUgZnJvbVwiIG9yIFwiZG93bmdyYWRlIHRvXCIuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLCAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JEb3duZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+ID0ge1xuICAxOiB7XG4gICAgNTogW0Rvd25ncmFkZVdvcmtzaGVldE5hbWVzXSxcbiAgICA5OiBbXSxcbiAgICAxNzU6IFtEb3duZ3JhZGVXb3Jrc2hlZXRGb21hdHRpbmcxNzVdLFxuICAgIDE4MjogW0Rvd25ncmFkZUV4dGVuc2lvbkVudmlyb25tZW50Q29udGV4dF0sXG4gICAgMTg5OiBbRG93bmdyYWRlUGVyaW9kVHlwZV0sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgTm90aWZpY2F0aW9uTWlub3JEb3duZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLkRvd25ncmFkZU5vdGlmaWNhdGlvbj4gPSB7XG4gIDE6IHtcbiAgICA5OiBbXSxcbiAgICAxMDogW0Rvd25ncmFkZUZsaXBib2FyZFpvbmVJRF0sXG4gICAgMTc1OiBbRG93bmdyYWRlV29ya3NoZWV0Rm9tYXR0aW5nTm90aWZpY2F0aW9uMTc1XSxcbiAgfSxcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB3aGljaCBoYXMgdGhlIGFiaWxpdHkgdG8gdXBncmFkZSBhbmQgZG93bmdyYWRlIHRoZSBjb250cmFjdFxuICogYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zLCB3aGljaCBhcmUgc3BlY2lmaWVkLiBJZiBleHRlcm5hbE1ham9yVmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gKiBhbiBlcnJvciB3aWxsIGJlIHRocm93biBiZWNhdXNlIHdlIHdvbid0IGtub3cgaG93IHRvIGRvIHRob3NlIGNvbnZlcnNpb25zLlxuICogVGhpcyBjb252ZXJ0ZXIgY2FuIGhhbmRsZSBib3RoIG1ham9yIGFuZCBtaW5vciB1cGRhdGVzIHdoZW4gdGhlIHBsYXRmb3JtIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIGV4dGVybmFsIHZlcnNpb24uXG4gKlxuICogQHBhcmFtIGV4dGVybmFsVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIHBsYXRmb3JtIGlzIHVzaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVWZXJzaW9uQ29udmVydGVyKGV4dGVybmFsVmVyc2lvbjogVmVyc2lvbk51bWJlciwgcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyKTogSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICByZXR1cm4gQ3JlYXRlVmVyc2lvbkNvbnZlcnRlcldpdGhUcmFuc2xhdG9ycyhcbiAgICBleHRlcm5hbFZlcnNpb24sXG4gICAgcGxhdGZvcm1WZXJzaW9uLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVzLFxuICAgIEV4ZWN1dGVNaW5vckRvd25ncmFkZXMsXG4gICAgTm90aWZpY2F0aW9uTWlub3JEb3duZ3JhZGVzLFxuICApO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIENyZWF0ZVZlcnNpb25Db252ZXJ0ZXIuIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHVwZ3JhZGUsIGRvd25ncmFkZSwgYW5kXG4gKiBub3RpZmljYXRpb24gYXJyYXlzIHNvIHRoYXQgYWxsIHRoZSBsb2dpYyBjYW4gYmUgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICogQHBhcmFtIHVwZ3JhZGVzIE1ham9yTWlub3JUcmFuc2xhdG9ycyBmb3IgdXBncmFkZXNcbiAqIEBwYXJhbSBkb3duZ3JhZGVzIE1ham9yTWlub3JUcmFuc2xhdG9ycyBmb3IgZG93bmdyYWRlc1xuICogQHBhcmFtIG5vdGlmaWNhdGlvbkRvd25ncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciBub3RpZmljYXRpb24gZG93bmdyYWRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVmVyc2lvbkNvbnZlcnRlcldpdGhUcmFuc2xhdG9ycyhcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHVwZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4sXG4gIGRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4sXG4gIG5vdGlmaWNhdGlvbkRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPixcbik6IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgY29uc3QgZXh0ZXJuYWxNYWpvclZlcnNpb246IG51bWJlciA9IGV4dGVybmFsVmVyc2lvbi5tYWpvcjtcbiAgY29uc3QgZXh0ZXJuYWxNaW5vclZlcnNpb246IG51bWJlciA9IGV4dGVybmFsVmVyc2lvbi5taW5vcjtcbiAgY29uc3QgcGxhdGZvcm1NYWpvclZlcnNpb246IG51bWJlciA9IHBsYXRmb3JtVmVyc2lvbi5tYWpvcjtcblxuICBpZiAoZXh0ZXJuYWxNYWpvclZlcnNpb24gPiBwbGF0Zm9ybU1ham9yVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXh0ZXJuYWwgdmVyc2lvbiBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBwbGF0Zm9ybSB2ZXJzaW9uLlxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uPSR7ZXh0ZXJuYWxNYWpvclZlcnNpb259IHBsYXRmb3JtTWFqb3JWZXJzaW9uPSR7cGxhdGZvcm1NYWpvclZlcnNpb259YCk7XG4gIH1cblxuICAvLyBJZiB3ZSBhcmUgdXNpbmcgdGhlIGV4YWN0IHNhbWUgdmVyc2lvbnMgKG1ham9yLm1pbm9yKSwganVzdCB1c2UgdGhlIGlkZW50aXR5IGNvbnZlcnRlclxuICBpZiAoVmVyc2lvbkVxdWFsVG8oZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIoKTtcbiAgfVxuXG4gIC8vIFdhbGsgdGhlIHNwYW4gYmV0d2VlbiB0aGUgdmVyc2lvbnMgd2UgaGF2ZSBoZXJlIGFuZCBjb2xsZWN0IHRoZSB1cGdyYWRlIGFuZCBkb3duZ3JhZGVzIG5lY2Vzc2FyeVxuICBjb25zdCBuZWVkZWRFeGVjdXRlVXBncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+ID0gR2V0TmVlZGVkVHJhbnNsYXRpb25zKFxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uLFxuICAgIHBsYXRmb3JtTWFqb3JWZXJzaW9uLFxuICAgIGV4dGVybmFsTWlub3JWZXJzaW9uLFxuICAgIHVwZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVEb3duZ3JhZGVzOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4gPSBHZXROZWVkZWRUcmFuc2xhdGlvbnMoXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgZXh0ZXJuYWxNaW5vclZlcnNpb24sXG4gICAgZG93bmdyYWRlcyxcbiAgKTtcblxuICBjb25zdCBuZWVkZWROb3RpZmljYXRpb25Eb3duZ3JhZGVzOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPiA9IEdldE5lZWRlZFRyYW5zbGF0aW9ucyhcbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBleHRlcm5hbE1pbm9yVmVyc2lvbixcbiAgICBub3RpZmljYXRpb25Eb3duZ3JhZGVzLFxuICApO1xuXG4gIC8vIFdlIHdhbnQgdG8gYXBwbHkgdGhlIGRvd25ncmFkZXMgaW4gcmV2ZXJzZSBvcmRlciBpbiBjYXNlIG9mIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZW1cbiAgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXMucmV2ZXJzZSgpO1xuICBuZWVkZWROb3RpZmljYXRpb25Eb3duZ3JhZGVzLnJldmVyc2UoKTtcblxuICByZXR1cm4gU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyLmZyb21EYXRhKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgbmVlZGVkRXhlY3V0ZVVwZ3JhZGVzLFxuICAgIG5lZWRlZEV4ZWN1dGVEb3duZ3JhZGVzLFxuICAgIG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXMsXG4gICk7XG59XG5cbmZ1bmN0aW9uIEdldE5lZWRlZFRyYW5zbGF0aW9uczxUPihcbiAgZXh0ZXJuYWxNYWpvclZlcnNpb246IG51bWJlcixcbiAgcGxhdGZvcm1NYWpvclZlcnNpb246IG51bWJlcixcbiAgZXh0ZXJuYWxNaW5vclZlcnNpb246IG51bWJlcixcbiAgbWFqb3JNaW5vclRyYW5zbGF0b3JzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VD4sXG4pOiBBcnJheTxUPiB7XG4gIGNvbnN0IG5lZWRlZFRyYW5zbGF0aW9uczogQXJyYXk8VD4gPSBbXTtcblxuICBmb3IgKGxldCBtYWpvciA9IGV4dGVybmFsTWFqb3JWZXJzaW9uOyBtYWpvciA8PSBwbGF0Zm9ybU1ham9yVmVyc2lvbjsgbWFqb3IrKykge1xuICAgIGlmIChtYWpvciBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnMpIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gbWFqb3IgPT09IGV4dGVybmFsTWFqb3JWZXJzaW9uID8gZXh0ZXJuYWxNaW5vclZlcnNpb24gOiAwO1xuICAgICAgY29uc3QgbWF4aW11bU1pbm9yVmVyc2lvbiA9IEdldE1heGltdW1NaW5vckluZGV4KE9iamVjdC5rZXlzKG1ham9yTWlub3JUcmFuc2xhdG9yc1ttYWpvcl0pKTtcbiAgICAgIGZvciAobGV0IG1pbm9yID0gc3RhcnQ7IG1pbm9yIDw9IG1heGltdW1NaW5vclZlcnNpb247IG1pbm9yKyspIHtcbiAgICAgICAgaWYgKG1pbm9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9yc1ttYWpvcl0pIHtcbiAgICAgICAgICBuZWVkZWRUcmFuc2xhdGlvbnMucHVzaCguLi5tYWpvck1pbm9yVHJhbnNsYXRvcnNbbWFqb3JdW21pbm9yXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmVlZGVkVHJhbnNsYXRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gR2V0TWF4aW11bU1pbm9ySW5kZXgobWlub3JWZXJzaW9uczogQXJyYXk8c3RyaW5nPik6IG51bWJlciB7XG4gIHJldHVybiBtaW5vclZlcnNpb25zLm1hcCgoYSkgPT4gTnVtYmVyKGEpKS5yZWR1Y2UoKGEsIGIpID0+IChhID4gYiA/IGEgOiBiKSk7XG59XG4iLCJpbXBvcnQge1xuICBDbGFzc05hbWVLZXksXG4gIERhdGVTdGVwUGVyaW9kLFxuICBEb21haW5SZXN0cmljdGlvblR5cGUsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeGVjdXRlUmVzcG9uc2UsXG4gIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8sXG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIE5vdGlmaWNhdGlvbixcbiAgUGFyYW1ldGVySW5mbyxcbiAgVmVyYklkLFxuICBWaXN1YWxJZCxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nLFxufSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uSWQgfSBmcm9tICcuLi9jb250cmFjdC9Ob3RpZmljYXRpb25zJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgb2xkIHZlcnMgYW5kIHBhcmFtZXRlcnMgZnJvbSB0aGUgZXh0ZXJuYWwgYmVmb3JlIHdlIHNlbmQgaXQgdG8gcGxhdGZvcm0gKi9cbmV4cG9ydCB0eXBlIFVwZ3JhZGVFeGVjdXRlQ2FsbCA9ICh2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKSA9PiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfTtcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZWQgYSByZXNwb25zZSBiYWNrIGZyb20gcGxhdGZvcm0gYW5kIHdlIG5lZWQgdG8gZG93bmdyYWRlIGl0IHRvIGV4dGVybmFsJ3MgdmVyc2lvbiAqL1xuZXhwb3J0IHR5cGUgRG93bmdyYWRlRXhlY3V0ZVJldHVybiA9IChleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSkgPT4gRXhlY3V0ZVJlc3BvbnNlO1xuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGZyb20gcGxhdGZvcm0gYW5kIHdlIG5lZWQgdG8gZG93bmdyYWRlIGl0IHRvIGV4dGVybmFsJ3MgdmVyc2lvbiAqL1xuZXhwb3J0IHR5cGUgRG93bmdyYWRlTm90aWZpY2F0aW9uID0gKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKSA9PiBOb3RpZmljYXRpb247XG5cbi8vIFRoaXMgaXMgd2hlcmUgd2Ugd2lsbCBzdGFydCB0byBkZWZpbmUgc29tZSBvZiB0aGVzZSB0cmFuc2xhdGlvbnMuXG4vLyBXaGVuIG1vZGlmeWluZyBleGlzdGluZyBtb2RlbHMsIGFkZCB0aGUgcmVxdWlzaXRlIGNvbnZlcnNpb24gZnVuY3Rpb25zIGhlcmUsIHRoZW4gdXNlIHRoZW1cbi8vIGluIHRoZSBWZXJzaW9uQ29udmVydGVyRmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4gSW1wb3J0IG9sZCB2ZXJzaW9ucyBhcyB5b3Ugd291bGQgYW55IG90aGVyIG1vZHVsZVxuXG4vLyAwIDwtPiBUcmFuc2xhdGlvbnNcbi8vIFVuY29tbWVudCB0aGlzIGxpbmUgdG8gaW1wb3J0IGZyb20gdGhlIFYwIGRlZmluaXRpb24gb2YgdGhlIEFQSVxuLy8gaW1wb3J0ICogYXMgVjAgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzLXYwJztcblxuLy8gMSA8LT4gMiBUcmFuc2xhdGlvbnNcbi8vIFVuY29tbWVudCB0aGlzIGxpbmUgdG8gaW1wb3J0IGZyb20gdGhlIFYxIGRlZmluaXRpb24gb2YgdGhlIEFQSVxuLy8gaW1wb3J0ICogYXMgVjEgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzLXYxJztcblxuZXhwb3J0IGZ1bmN0aW9uIERvd25ncmFkZVdvcmtzaGVldE5hbWVzKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgLy8gRml4IHRoZSBkYXNoYm9hcmQgZnJpZW5kbHkgbmFtZSBpc3N1ZS4gVGhlIHN0cnVjdHVyZXMgYXJlIGNvbXBhdGlibGUsXG4gIC8vIHNvIHdlIHN0aWxsIHJldHVybiB0aGUgb3JpZ2luYWwgcmVwbHksIGJ1dCB3ZSBjb3B5IHRoZSBTaGVldEluZm8ubmFtZVxuICAvLyBpbnRvIHRoZSBEYXNoYm9hcmRab25lLm5hbWUsIHdoZXJlIHYxIHdhbnRzIHRvIGZpbmQgaXQuXG5cbiAgY29uc3QgYm9vdHN0cmFwSW5mbyA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbztcbiAgaWYgKGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYm9vdHN0cmFwSW5mby5leHRlbnNpb25EYXNoYm9hcmRJbmZvLnpvbmVzLmZvckVhY2goKHpvbmUpID0+IHtcbiAgICAgIGlmICh6b25lLnNoZWV0SW5mbykge1xuICAgICAgICB6b25lLm5hbWUgPSB6b25lLnNoZWV0SW5mby5uYW1lO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIERvd25ncmFkZUZsaXBib2FyZFpvbmVJRChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gIC8vIEZpeCB0aGUgRmxpcGJvYXJkWm9uZUlkIGlzc3VlLiBPbGRlciBleHRlcm5hbCB2ZXJzaW9ucyBzdGlsbCBjaGVjayBmb3IgZmxpcGJvYXJkWm9uZUlEcy5cbiAgLy8gV2hlbiBydW5uaW5nIGFnYWluc3QgYSBuZXdlciBzZXJ2ZXIsIGlmIGZsaXBib2FyZFpvbmVJZCBpcyBhYnNlbnQsIHNldCBpdCB0byBkZWZhdWx0KDApLlxuXG4gIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQgPT09IE5vdGlmaWNhdGlvbklkLlNlbGVjdGVkTWFya3NDaGFuZ2VkKSB7XG4gICAgY29uc3QgdmlzdWFsTW9kZWwgPSBub3RpZmljYXRpb24uZGF0YSBhcyBWaXN1YWxJZDtcbiAgICBpZiAodmlzdWFsTW9kZWwuZmxpcGJvYXJkWm9uZUlEID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZpc3VhbE1vZGVsLmZsaXBib2FyZFpvbmVJRCA9IDA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vdGlmaWNhdGlvbjtcbn1cblxuLy8gRmlsdGVyIG91dCBmb3JtYXR0aW5nIHNoZWV0cyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIGNsYXNzTmFtZXMgbGlzdFxuZnVuY3Rpb24gRG93bmdyYWRlV29ya3NoZWV0Rm9ybWF0dGluZyhleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgY2xhc3NOYW1lczogQ2xhc3NOYW1lS2V5W10pOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBjb25zdCBib290c3RyYXBJbmZvID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25Cb290c3RyYXBJbmZvO1xuXG4gIGlmIChib290c3RyYXBJbmZvPy5leHRlbnNpb25Xb3Jrc2hlZXRJbmZvPy5mb3JtYXR0aW5nKVxuICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uV29ya3NoZWV0SW5mby5mb3JtYXR0aW5nLmZvcm1hdHRpbmdTaGVldHMgPVxuICAgICAgYm9vdHN0cmFwSW5mby5leHRlbnNpb25Xb3Jrc2hlZXRJbmZvLmZvcm1hdHRpbmcuZm9ybWF0dGluZ1NoZWV0cy5maWx0ZXIoKHgpID0+ICFjbGFzc05hbWVzLmluY2x1ZGVzKHguY2xhc3NOYW1lS2V5KSk7XG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbi8vIEZpbHRlciBvdXQgZm9ybWF0dGluZyBzaGVldHMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBjbGFzc05hbWVzIGxpc3Rcbi8vIEZpbHRlciBvdXQgZm9ybWF0dGluZyBzaGVldHMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBjbGFzc05hbWVzIGxpc3RcbmZ1bmN0aW9uIERvd25ncmFkZVdvcmtzaGVldEZvcm1hdHRpbmdOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24sIGNsYXNzTmFtZXM6IENsYXNzTmFtZUtleVtdKTogTm90aWZpY2F0aW9uIHtcbiAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25JZCA9PT0gTm90aWZpY2F0aW9uSWQuV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWQpIHtcbiAgICBjb25zdCBmb3JtYXR0aW5nID0gbm90aWZpY2F0aW9uLmRhdGEgYXMgV29ya2Jvb2tGb3JtYXR0aW5nO1xuICAgIG5vdGlmaWNhdGlvbi5kYXRhID0gZm9ybWF0dGluZy5mb3JtYXR0aW5nU2hlZXRzLmZpbHRlcigoeCkgPT4gIWNsYXNzTmFtZXMuaW5jbHVkZXMoeC5jbGFzc05hbWVLZXkpKTtcbiAgfVxuXG4gIHJldHVybiBub3RpZmljYXRpb247XG59XG5cbi8vIFdlIGFkZGVkIG5ldyBlbnVtIHZhbHVlcyBmb3IgQ2xhc3NOYW1lS2V5cyBlbnVtIGluIDE3Ni4gTmVlZCB0byBmaWx0ZXIgdGhlbSBvdXQgaWYgdGhlIGNsaWVudCB2ZXJzaW9uIGlzIDwxNzZcbmNvbnN0IENsYXNzTmFtZUtleXNUb0ZpbHRlcjE3NSA9IFtDbGFzc05hbWVLZXkuUm93RGl2aWRlcnMsIENsYXNzTmFtZUtleS5Db2x1bW5EaXZpZGVycywgQ2xhc3NOYW1lS2V5LlBhbmVdO1xuXG5leHBvcnQgY29uc3QgRG93bmdyYWRlV29ya3NoZWV0Rm9tYXR0aW5nMTc1ID0gKHJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+XG4gIERvd25ncmFkZVdvcmtzaGVldEZvcm1hdHRpbmcocmVzcG9uc2UsIENsYXNzTmFtZUtleXNUb0ZpbHRlcjE3NSk7XG5leHBvcnQgY29uc3QgRG93bmdyYWRlV29ya3NoZWV0Rm9tYXR0aW5nTm90aWZpY2F0aW9uMTc1ID0gKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKSA9PlxuICBEb3duZ3JhZGVXb3Jrc2hlZXRGb3JtYXR0aW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgQ2xhc3NOYW1lS2V5c1RvRmlsdGVyMTc1KTtcblxuZXhwb3J0IGZ1bmN0aW9uIERvd25ncmFkZUV4dGVuc2lvbkVudmlyb25tZW50Q29udGV4dChleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIC8vIEZpeCB0aGUgZXh0ZW5zaW9uIGVudmlyb25tZW50IGNvbnRleHQgaXNzdWUuIFJlcGxhY2VzIG5ldyBlbnVtIHZhbHVlcyB0aGF0IGdvIHVucmVjb2duaXplZFxuICAvLyBieSBvbGRlciBleHRlbnNpb25zIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSBvbGRlciBlbnVtIHZhbHVlcy5cbiAgY29uc3QgYm9vdHN0cmFwSW5mbyA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbztcblxuICBpZiAoYm9vdHN0cmFwSW5mby5leHRlbnNpb25FbnZpcm9ubWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY29udGV4dCA9IGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ29udGV4dDtcbiAgICBpZiAoY29udGV4dCA9PT0gRXh0ZW5zaW9uQ29udGV4dC5QdWJsaWNXZWIgfHwgY29udGV4dCA9PT0gRXh0ZW5zaW9uQ29udGV4dC5DbG91ZCkge1xuICAgICAgYm9vdHN0cmFwSW5mby5leHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25Db250ZXh0ID0gRXh0ZW5zaW9uQ29udGV4dC5TZXJ2ZXI7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBFeHRlbnNpb25Db250ZXh0LlB1YmxpY0Rlc2t0b3ApIHtcbiAgICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ29udGV4dCA9IEV4dGVuc2lvbkNvbnRleHQuRGVza3RvcDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBIYW5kbGVEb3duZ3JhZGVQZXJpb2RUeXBlRm9yUGFyYW1ldGVyKHBhcmFtZXRlcjogUGFyYW1ldGVySW5mbykge1xuICBpZiAocGFyYW1ldGVyLmFsbG93YWJsZVZhbHVlc1R5cGUgPT09IERvbWFpblJlc3RyaWN0aW9uVHlwZS5SYW5nZSkge1xuICAgIGlmIChwYXJhbWV0ZXIuZGF0ZVN0ZXBQZXJpb2QgPT09IERhdGVTdGVwUGVyaW9kLklzb1llYXJzKSB7XG4gICAgICBwYXJhbWV0ZXIuZGF0ZVN0ZXBQZXJpb2QgPSBEYXRlU3RlcFBlcmlvZC5ZZWFycztcbiAgICB9IGVsc2UgaWYgKHBhcmFtZXRlci5kYXRlU3RlcFBlcmlvZCA9PT0gRGF0ZVN0ZXBQZXJpb2QuSXNvUXVhcnRlcnMpIHtcbiAgICAgIHBhcmFtZXRlci5kYXRlU3RlcFBlcmlvZCA9IERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzO1xuICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyLmRhdGVTdGVwUGVyaW9kID09PSBEYXRlU3RlcFBlcmlvZC5Jc29XZWVrcykge1xuICAgICAgcGFyYW1ldGVyLmRhdGVTdGVwUGVyaW9kID0gRGF0ZVN0ZXBQZXJpb2QuV2Vla3M7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVQZXJpb2RUeXBlKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCkpIHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxQYXJhbWV0ZXJJbmZvPjtcbiAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICBIYW5kbGVEb3duZ3JhZGVQZXJpb2RUeXBlRm9yUGFyYW1ldGVyKHBhcmFtZXRlcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHBhcmFtZXRlciA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgUGFyYW1ldGVySW5mbztcbiAgICBIYW5kbGVEb3duZ3JhZGVQZXJpb2RUeXBlRm9yUGFyYW1ldGVyKHBhcmFtZXRlcik7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4ZWN1dGVSZXNwb25zZSwgTm90aWZpY2F0aW9uLCBWZXJiSWQgfSBmcm9tICcuLi8uLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKlxuICogVGhpcyB2ZXJzaW9uIGNvbnZlcnRlciBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nIGJ1dCBpcyB1c2VmdWwgZm9yIHRlc3Rpbmcgb3Igd2hlbiB3ZSBoYXZlXG4gKiBhIG1hdGNoaW5nIHBsYXRmb3JtIGFuZCBleHRlcm5hbCB2ZXJzaW9uIG51bWJlclxuICovXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9IHtcbiAgICByZXR1cm4ge1xuICAgICAgdmVyYjogdmVyYiBhcyBWZXJiSWQsXG4gICAgICBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIGFzIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UsIHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBFeGVjdXRlUmVzcG9uc2Uge1xuICAgIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG4gIH1cblxuICBwdWJsaWMgdXBncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4ZWN1dGVSZXNwb25zZSwgTm90aWZpY2F0aW9uLCBWZXJiSWQsIFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi8uLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9ucyBmcm9tICcuL0V4dGVybmFsVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuLyoqXG4gKiBUaGUgdmVyc2lvbiBjb252ZXJ0ZXIgaXMgZGVzaWduZWQgdG8gYWxsb3cgdGhlIHBsYXRmb3JtIGFuZCBleHRlcm5hbCBtb2R1bGVzXG4gKiB0byBzZWVtbGVzc2x5IGNvbW11bmljYXRlIG92ZXIgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgaW50ZXJuYWwgQVBJLiBUaGlzIGNvbnZlcnRlclxuICogc3VwcG9ydHMgZXh0ZXJuYWwncyB2ZXJzaW9uKG1pbm9yKSA+PSBwbGF0Zm9ybSdzIHZlcnNpb24obWlub3IpLiBXaGVuIGV4ZWN1dGluZ1xuICogY29tbWFuZHMsIGl0IGlzIHVzZWQgdG8gZG93bmdyYWRlIHRoZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiB0byB3aGF0IHBsYXRmb3JtIGtub3dzIG9uIHRoZSB3YXkgaW5cbiAqIGFuZCB1cGdyYWRlIHRoZSByZXByZXNlbnRhdGlvbnMgb24gdGhlIHdheSBvdXQuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciBpbXBsZW1lbnRzIEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlclxuICAgKlxuICAgKiBAcGFyYW0gX2V4dGVybmFsVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgYXBpLWV4dGVybmFsLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfcGxhdGZvcm1WZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB0aGUgYXBpLXBsYXRmb3JtLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlRXhlY3V0ZUNhbGxUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHRoZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSB3aGVuIGRvd25ncmFkaW5nIGNtZCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBfdXBncmFkZUV4ZWN1dGVSZXR1cm5UcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHVwZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gYWZ0ZXIgYSBjbWQgaXMgZXhlY3V0ZWRcbiAgICogQHBhcmFtIF91cGdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB1cGdyYWRlIG5vdGZpY2F0aW9ucyB0byBwZXJmb3JtIG9uIGV2ZW50c1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2V4dGVybmFsVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICBwcml2YXRlIF9wbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgcHJpdmF0ZSBfZG93bmdyYWRlRXhlY3V0ZUNhbGxUcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5Eb3duZ3JhZGVFeGVjdXRlQ2FsbD4sXG4gICAgcHJpdmF0ZSBfdXBncmFkZUV4ZWN1dGVSZXR1cm5UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZVJldHVybj4sXG4gICAgcHJpdmF0ZSBfdXBncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVOb3RpZmljYXRpb24+LFxuICApIHtcbiAgICBpZiAodGhpcy5fZXh0ZXJuYWxWZXJzaW9uLm1ham9yID4gdGhpcy5fcGxhdGZvcm1WZXJzaW9uLm1ham9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb252ZXJ0IGJldHdlZW4gZXh0ZXJuYWwgdmVyc2lvbiAke3RoaXMuX2V4dGVybmFsVmVyc2lvbi5tYWpvcn1cbiAgICAgIGFuZCAke3RoaXMuX3BsYXRmb3JtVmVyc2lvbi5tYWpvcn1gKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfSB7XG4gICAgLy8gUGVyZm9ybSB0aGUgZG93bmdyYWRlIG9mIHRoZSB2ZXJiIGFuZCBwYXJhbWV0ZXJzIHRvIHRoZSBsZXZlbCB0aGF0IHBsYXRmb3JtIGlzIHVzaW5nXG4gICAgbGV0IGRvd25ncmFkZWQgPSB7IHZlcmI6IHZlcmIsIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgfTtcbiAgICBmb3IgKGNvbnN0IGRvd25ncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX2Rvd25ncmFkZUV4ZWN1dGVDYWxsVHJhbnNsYXRpb25zKSB7XG4gICAgICBkb3duZ3JhZGVkID0gZG93bmdyYWRlVHJhbnNsYXRpb24oZG93bmdyYWRlZC52ZXJiLCBkb3duZ3JhZGVkLnBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiBkb3duZ3JhZGVkO1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCB2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICAvLyBQZXJmb3JtIHRoZSB1cGdyYWRlIG9mIHRoZSByZXNwb25zZSB0byB3aGF0IHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgZXhwZWN0aW5nXG4gICAgbGV0IHVwZ3JhZGVkID0gZXhlY3V0ZVJlc3BvbnNlO1xuICAgIGZvciAoY29uc3QgdXBncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX3VwZ3JhZGVFeGVjdXRlUmV0dXJuVHJhbnNsYXRpb25zKSB7XG4gICAgICB1cGdyYWRlZCA9IHVwZ3JhZGVUcmFuc2xhdGlvbih1cGdyYWRlZCwgdmVyYiwgcGFyYW1ldGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZ3JhZGVkO1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIC8vIFBlcmZvcm0gdGhlIHVwZ3JhZGUgb2Ygbm90aWZpY2F0aW9uIHRvIHdoYXQgdGhlIGV4dGVybmFsIG1vZHVsZSBpcyBleHBlY3RpbmdcbiAgICBsZXQgdXBncmFkZWQgPSBub3RpZmljYXRpb247XG4gICAgZm9yIChjb25zdCB1cGdyYWRlTm90aWZpY2F0aW9uIG9mIHRoaXMuX3VwZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMpIHtcbiAgICAgIHVwZ3JhZGVkID0gdXBncmFkZU5vdGlmaWNhdGlvbih1cGdyYWRlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZ3JhZGVkO1xuICB9XG59XG4iLCJpbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEdldE1heGltdW1NaW5vckluZGV4LCBNYWpvck1pbm9yVHJhbnNsYXRvcnMsIFZlcnNpb25FcXVhbFRvIH0gZnJvbSAnLi4vVmVyc2lvbkNvbnZlcnRlckZhY3RvcnknO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCB7IEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBFeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zRXh0ZXJuYWwgZnJvbSAnLi9FeHRlcm5hbFZlcnNpb25UcmFuc2xhdGlvbnMnO1xuXG4vLyBBIG1hcHBpbmcgZnJvbSB0aGUgY3VycmVudCBjbGllbnQgdmVyc2lvbiBvZiBpbnRlcm5hbC1jb250cmFjdCB0byBhbiBvbGRlciBwbGF0Zm9ybSB2ZXJzaW9uIG9mIHRoZSBjb250cmFjdC5cbi8vIEVhY2ggdmVyc2lvbiBidW1wIGNhbiBoYXZlIGFuIGFycmF5IG9mIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGluIG9yZGVyLlxuLy8gVGhlc2UgdHJhbnNsYXRpb25zIGhhbmRsZSBkb3duZ3JhZGVFeGVjdXRlQ2FsbCBhbmQgdXBncmFkZUV4ZWN1dGVSZXR1cm4gYW5kIGFyZSBtZWFudCB0byBiZSBjYWxsZWQgb24gdGhlXG4vLyBjbGllbnQvZXh0ZXJuYWwgc2lkZS5cbi8vIFdoZW4gdXBkYXRpbmcgdGhlIG1ham9yIG9yIG1pbm9yIHZlcnNpb24gb2Ygb3VyIGludGVybmFsLWNvbnRyYWN0LCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGVzZSBkYXRhIHN0cnVjdHVyZXMuXG4vLyAqIElmIHRoZXJlIGFyZSB0cmFuc2xhdGlvbnMgdG8gYWRkLCBhZGQgdGhlbSB0byB0aGUgdmVyc2lvbiB0byAndXBncmFkZSBmcm9tJyBvciAnZG93bmdyYWRlIHRvJy5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JEb3duZ3JhZGVDYWxsRXh0ZXJuYWw6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5Eb3duZ3JhZGVFeGVjdXRlQ2FsbD4gPSB7XG4gIDE6IHtcbiAgICA5OiBbXSwgLy8gTm90ZSB0aGF0IHdlIHB1dCBkb3duZ3JhZGVzIGZyb20gMS4xMCB0byAxLjkgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JVcGdyYWRlUmV0dXJuRXh0ZXJuYWw6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlRXhlY3V0ZVJldHVybj4gPSB7XG4gIDE6IHtcbiAgICA5OiBbXSwgLy8gTm90ZSB0aGF0IHdlIHB1dCB1cGdyYWRlcyBmcm9tIDEuOSB0byAxLjEwIGluIHRoZSBbMV1bOV0gYnVja2V0XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZU5vdGlmaWNhdGlvbjogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVOb3RpZmljYXRpb24+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICB9LFxufTtcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHdoaWNoIGhhcyB0aGUgYWJpbGl0eSB0byB1cGdyYWRlIGFuZCBkb3duZ3JhZGVcbiAqIHRoZSBjb250cmFjdCBiZXR3ZWVuIHRoZSB0d28gdmVyc2lvbnMgd2hpY2ggYXJlIHNwZWNpZmllZC4gSWYgZXh0ZXJuYWxNYWpvclZlcnNpb24gaXMgbGVzcyB0aGFuXG4gKiBwbGF0Zm9ybU1ham9yVmVyc2lvbiwgYW4gRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgd2lsbCBiZSByZXR1cm5lZC5cbiAqIEhhbmRsZXMgdXBncmFkZS9kb3duZ3JhZGUgZm9yIGJvdGggbWFqb3IgYW5kIG1pbm9yIHVwZGF0ZXMuXG4gKlxuICogQHBhcmFtIGV4dGVybmFsVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIHBsYXRmb3JtIGlzIHVzaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbik6IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgcmV0dXJuIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBFeGVjdXRlTWlub3JEb3duZ3JhZGVDYWxsRXh0ZXJuYWwsXG4gICAgRXhlY3V0ZU1pbm9yVXBncmFkZVJldHVybkV4dGVybmFsLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVOb3RpZmljYXRpb24sXG4gICk7XG59XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcldpdGhUcmFuc2xhdG9ycy5cbiAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHVwZ3JhZGUsIGRvd25ncmFkZSBhcnJheXMgc28gdGhhdCBhbGwgdGhlIGxvZ2ljIGNhbiBiZSB0ZXN0ZWQuXG4gKlxuICogQHBhcmFtIGV4dGVybmFsVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3aGljaCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIHVzaW5nXG4gKiBAcGFyYW0gcGxhdGZvcm1WZXJzaW9uIFZlcnNpb25OdW1iZXIgb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICogQHBhcmFtIHVwZ3JhZGVzIE1ham9yTWlub3JUcmFuc2xhdG9ycyBmb3IgcmVzcG9uc2UgdXBncmFkZXNcbiAqIEBwYXJhbSBkb3duZ3JhZGVzIE1ham9yTWlub3JUcmFuc2xhdG9ycyBmb3IgZXhlY3V0ZSBjYWxsIGRvd25ncmFkZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMoXG4gIGV4dGVybmFsVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBkb3duZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuRG93bmdyYWRlRXhlY3V0ZUNhbGw+LFxuICB1cGdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVFeGVjdXRlUmV0dXJuPixcbiAgdXBncmFkZU5vdGlmaWNhdGlvbnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlTm90aWZpY2F0aW9uPixcbik6IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgY29uc3QgZXh0ZXJuYWxNYWpvclZlcnNpb246IG51bWJlciA9IGV4dGVybmFsVmVyc2lvbi5tYWpvcjtcbiAgY29uc3QgcGxhdGZvcm1NYWpvclZlcnNpb246IG51bWJlciA9IHBsYXRmb3JtVmVyc2lvbi5tYWpvcjtcbiAgY29uc3QgcGxhdGZvcm1NaW5vclZlcnNpb246IG51bWJlciA9IHBsYXRmb3JtVmVyc2lvbi5taW5vcjtcblxuICAvLyBUaGlzIGNoZWNrIGlzIHByZXNlbnQgaW4gVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkuIFdlIHRocm93IHRoZSBzYW1lIGVycm9yIGhlcmUgYXMgd2VsbC5cbiAgLy8gSGVuY2Ugd2Ugb25seSBuZWVkIHRvIGNoZWNrIHRoZSBtaW5vciB2ZXJzaW9ucyBmb3IgdHJhbnNsYXRpb25zLlxuICBpZiAoZXh0ZXJuYWxNYWpvclZlcnNpb24gPiBwbGF0Zm9ybU1ham9yVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXh0ZXJuYWwgdmVyc2lvbiBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBwbGF0Zm9ybSB2ZXJzaW9uLlxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uPSR7ZXh0ZXJuYWxNYWpvclZlcnNpb259IHBsYXRmb3JtTWFqb3JWZXJzaW9uPSR7cGxhdGZvcm1NYWpvclZlcnNpb259YCk7XG4gIH1cblxuICBpZiAoZXh0ZXJuYWxNYWpvclZlcnNpb24gPCBwbGF0Zm9ybU1ham9yVmVyc2lvbiB8fCBWZXJzaW9uRXF1YWxUbyhleHRlcm5hbFZlcnNpb24sIHBsYXRmb3JtVmVyc2lvbikpIHtcbiAgICByZXR1cm4gbmV3IEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyKCk7XG4gIH1cblxuICAvLyBXYWxrIHRoZSBzcGFuIGJldHdlZW4gdGhlIHZlcnNpb25zIHdlIGhhdmUgaGVyZSBhbmQgY29sbGVjdCB0aGUgdXBncmFkZSBhbmQgZG93bmdyYWRlcyBuZWNlc3NhcnlcbiAgY29uc3QgbmVlZGVkRXhlY3V0ZUNhbGxEb3duZ3JhZGU6IEFycmF5PFRyYW5zbGF0aW9uc0V4dGVybmFsLkRvd25ncmFkZUV4ZWN1dGVDYWxsPiA9IEdldE5lZWRlZEV4dGVybmFsVHJhbnNsYXRpb25zKFxuICAgIHBsYXRmb3JtTWFqb3JWZXJzaW9uLFxuICAgIHBsYXRmb3JtTWlub3JWZXJzaW9uLFxuICAgIGRvd25ncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkRXhlY3V0ZVJldHVyblVwZ3JhZGVzOiBBcnJheTxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlRXhlY3V0ZVJldHVybj4gPSBHZXROZWVkZWRFeHRlcm5hbFRyYW5zbGF0aW9ucyhcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1pbm9yVmVyc2lvbixcbiAgICB1cGdyYWRlcyxcbiAgKTtcblxuICBjb25zdCBuZWVkZWROb3RpZmljYXRpb25VcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZU5vdGlmaWNhdGlvbj4gPSBHZXROZWVkZWRFeHRlcm5hbFRyYW5zbGF0aW9ucyhcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1pbm9yVmVyc2lvbixcbiAgICB1cGdyYWRlTm90aWZpY2F0aW9ucyxcbiAgKTtcblxuICAvLyBSZXZlcnNlIHRoZSBkb3duZ3JhZGUgY2FsbHMsIHNvIHRoYXQgd2Ugc3RhcnQgdGhlIGRvd25ncmFkZSBmcm9tIHRoZSBleHRlcm5hbCB2ZXJzaW9uIHRvIHRoZSBwbGF0Zm9ybSB2ZXJzaW9uXG4gIG5lZWRlZEV4ZWN1dGVDYWxsRG93bmdyYWRlLnJldmVyc2UoKTtcbiAgcmV0dXJuIG5ldyBFeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlcihcbiAgICBleHRlcm5hbFZlcnNpb24sXG4gICAgcGxhdGZvcm1WZXJzaW9uLFxuICAgIG5lZWRlZEV4ZWN1dGVDYWxsRG93bmdyYWRlLFxuICAgIG5lZWRlZEV4ZWN1dGVSZXR1cm5VcGdyYWRlcyxcbiAgICBuZWVkZWROb3RpZmljYXRpb25VcGdyYWRlcyxcbiAgKTtcbn1cblxuZnVuY3Rpb24gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnM8VD4oXG4gIHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIsXG4gIHBsYXRmb3JtTWlub3JWZXJzaW9uOiBudW1iZXIsXG4gIG1ham9yTWlub3JUcmFuc2xhdG9yczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFQ+LFxuKTogQXJyYXk8VD4ge1xuICBjb25zdCBuZWVkZWRUcmFuc2xhdGlvbnM6IEFycmF5PFQ+ID0gW107XG5cbiAgaWYgKHBsYXRmb3JtTWFqb3JWZXJzaW9uIGluIG1ham9yTWlub3JUcmFuc2xhdG9ycykge1xuICAgIGNvbnN0IHN0YXJ0ID0gcGxhdGZvcm1NaW5vclZlcnNpb247XG4gICAgY29uc3QgbWF4aW11bU1pbm9yVmVyc2lvbiA9IEdldE1heGltdW1NaW5vckluZGV4KE9iamVjdC5rZXlzKG1ham9yTWlub3JUcmFuc2xhdG9yc1twbGF0Zm9ybU1ham9yVmVyc2lvbl0pKTtcbiAgICBmb3IgKGxldCBtaW5vciA9IHN0YXJ0OyBtaW5vciA8PSBtYXhpbXVtTWlub3JWZXJzaW9uOyBtaW5vcisrKSB7XG4gICAgICBpZiAobWlub3IgaW4gbWFqb3JNaW5vclRyYW5zbGF0b3JzW3BsYXRmb3JtTWFqb3JWZXJzaW9uXSkge1xuICAgICAgICBuZWVkZWRUcmFuc2xhdGlvbnMucHVzaCguLi5tYWpvck1pbm9yVHJhbnNsYXRvcnNbcGxhdGZvcm1NYWpvclZlcnNpb25dW21pbm9yXSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5lZWRlZFRyYW5zbGF0aW9ucztcbn1cbiIsIi8vIEV4cG9ydCBldmVyeXRoaW5nIHdoaWNoIGhhZCBiZWVuIHByZXZpb3VzbHkgaW4gdGhlIGFwaS1zaGFyZWQgbW9kdWxlXG5cbmV4cG9ydCB7IEFwaVZlcnNpb24gfSBmcm9tICcuL0FwaVNoYXJlZC9BcGlWZXJzaW9uJztcbmV4cG9ydCAqIGZyb20gJy4vQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZUJvb3RzdHJhcCc7XG5leHBvcnQgeyBDcm9zc0ZyYW1lRGlzcGF0Y2hlciB9IGZyb20gJy4vQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZURpc3BhdGNoZXInO1xuZXhwb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJy4vQXBpU2hhcmVkL0RhdGFTb3VyY2UnO1xuZXhwb3J0IHsgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5leHBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuL0FwaVNoYXJlZC9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmV4cG9ydCB7IEV2ZW50TGlzdGVuZXJNYW5hZ2VyIH0gZnJvbSAnLi9BcGlTaGFyZWQvRXZlbnRMaXN0ZW5lck1hbmFnZXInO1xuZXhwb3J0IHsgRmllbGQgfSBmcm9tICcuL0FwaVNoYXJlZC9GaWVsZCc7XG5leHBvcnQgeyBDdXN0b21WaWV3SW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvQ3VzdG9tVmlld0ltcGwnO1xuZXhwb3J0IHsgRGFzaGJvYXJkSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkSW1wbCc7XG5leHBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsJztcbmV4cG9ydCB7IERhdGFTb3VyY2VJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9EYXRhU291cmNlSW1wbCc7XG5leHBvcnQgeyBQYXJhbWV0ZXJJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9QYXJhbWV0ZXJJbXBsJztcbmV4cG9ydCB7IFNoZWV0SW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvU2hlZXRJbXBsJztcbmV4cG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NoZWV0SW5mb0ltcGwnO1xuZXhwb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCc7XG5leHBvcnQgeyBTdG9yeUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1N0b3J5SW1wbCc7XG5leHBvcnQgeyBTdG9yeVBvaW50SW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvU3RvcnlQb2ludEltcGwnO1xuZXhwb3J0IHsgU3RvcnlQb2ludEluZm9JbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TdG9yeVBvaW50SW5mb0ltcGwnO1xuZXhwb3J0IHsgV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9Xb3JrYm9va0ltcGwnO1xuZXhwb3J0IHsgV29ya3NoZWV0SW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvV29ya3NoZWV0SW1wbCc7XG5leHBvcnQgeyBQb2ludCB9IGZyb20gJy4vQXBpU2hhcmVkL1BvaW50JztcbmV4cG9ydCB7IEFubm90YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvQW5ub3RhdGlvblNlcnZpY2UnO1xuZXhwb3J0IHsgRGF0YVNvdXJjZVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9EYXRhU291cmNlU2VydmljZSc7XG5leHBvcnQgeyBFeHBvcnRTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvRXhwb3J0U2VydmljZSc7XG5leHBvcnQgeyBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvRmlsdGVyU2VydmljZSc7XG5leHBvcnQgeyBHZXREYXRhU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlJztcbmV4cG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UsIFVucmVnaXN0ZXJGbiB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL05vdGlmaWNhdGlvblNlcnZpY2UnO1xuZXhwb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9QYXJhbWV0ZXJzU2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9SZWdpc3RlckFsbFNoYXJlZFNlcnZpY2VzJztcbmV4cG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TZWxlY3Rpb25TZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5leHBvcnQgeyBTaXplU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL1NpemVTZXJ2aWNlJztcbmV4cG9ydCB7IFN0b3J5QWN0aXZhdGlvblNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TdG9yeUFjdGl2YXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IFZpelNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9WaXpTZXJ2aWNlJztcbmV4cG9ydCB7IENsaWVudEluZm9TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQ2xpZW50SW5mb1NlcnZpY2VJbXBsJztcbmV4cG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UsIFJlZ2lzdHJhdGlvbiB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlJztcbmV4cG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU2VydmljZUltcGxCYXNlJztcbmV4cG9ydCB7IFNpemVTZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU2l6ZVNlcnZpY2VJbXBsJztcbmV4cG9ydCB7IFN0b3J5QWN0aXZhdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9TdG9yeUFjdGl2YXRpb25TZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBTaW5nbGVFdmVudE1hbmFnZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9TaW5nbGVFdmVudE1hbmFnZXInO1xuZXhwb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi9BcGlTaGFyZWQvVGFibGVhdUVycm9yJztcbmV4cG9ydCB7IERlZmVycmVkIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvRGVmZXJyZWQnO1xuZXhwb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvRXJyb3JIZWxwZXJzJztcbmV4cG9ydCB7IEV4cG9ydEhlbHBlcnMgfSBmcm9tICcuL0FwaVNoYXJlZC9VdGlscy9FeHBvcnRIZWxwZXJzJztcbmV4cG9ydCB7IFNoZWV0VXRpbHMgfSBmcm9tICcuL0FwaVNoYXJlZC9VdGlscy9TaGVldFV0aWxzJztcbmV4cG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9WZXJzaW9uTnVtYmVyJztcbmV4cG9ydCB7IFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlciB9IGZyb20gJy4vVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyJztcbiIsImltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuL1ZlcnNpb25OdW1iZXInO1xuaW1wb3J0IHsgVmVyc2lvbk51bWJlckNvbnRyYWN0IH0gZnJvbSAnLi9WZXJzaW9uTnVtYmVyQ29udHJhY3QnO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHNpbmdsZXRvbiB3cmFwcGVyIG9mIFZlcnNpb25OdW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEFwaVZlcnNpb24ge1xuICAvLyBVc2luZyBzb21lIHdlYnBhY2sgdHJpY2tzLCB3ZSBjYW4gaW5qZWN0IHRoaXMgdmVyc2lvbiBpbnRvIG91ciBjb2RlIChraW5kYSBsaWtlIGMrKyBwcmVwcm9jZXNzb3Igc3R1ZmYpXG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogVmVyc2lvbk51bWJlckNvbnRyYWN0O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhlIHZlcnNpb24gbnVtYmVyLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKTogVmVyc2lvbk51bWJlckNvbnRyYWN0IHtcbiAgICByZXR1cm4gQXBpVmVyc2lvbi5faW5zdGFuY2U7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIFNldFZlcnNpb25OdW1iZXIobnVtU3RyaW5nOiBzdHJpbmcsIGlzQWxwaGE6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBBcGlWZXJzaW9uLl9pbnN0YW5jZSA9IG5ldyBWZXJzaW9uTnVtYmVyKG51bVN0cmluZywgaXNBbHBoYSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIGNvbm5lY3Rpb24gc3VtbWFyeS5cbiAqIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXMganVzdCBhIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbm5lY3Rpb25TdW1tYXJ5IGltcGxlbWVudHMgQ29udHJhY3QuQ29ubmVjdGlvblN1bW1hcnkge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfY29ubmVjdGlvbkluZm86IENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnkpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBzZXJ2ZXJVUkkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbkluZm8uc2VydmVyVVJJO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLnR5cGU7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBDcm9zc0ZyYW1lTWVzc2VuZ2VyLFxuICBJbml0aWFsaXphdGlvbk9wdGlvbnMsXG4gIE1FU1NBR0lOR19WRVJTSU9OIGFzIEFwaU1lc3NhZ2luZ1ZlcnNpb24sXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDcm9zc0ZyYW1lRGlzcGF0Y2hlciB9IGZyb20gJy4vQ3Jvc3NGcmFtZURpc3BhdGNoZXInO1xuXG4vLyBDaGVja3MgdG8gc2VlIGlmIHdlIGFyZSBydW5uaW5nIGluIGFuIGlmcmFtZSBjdXJyZW50bHk6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zMjYwNzYvODgyMTE1M1xuZnVuY3Rpb24gaW5JZnJhbWUodGhpc1dpbmRvdzogV2luZG93KTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHRoaXNXaW5kb3cuc2VsZiAhPT0gdGhpc1dpbmRvdy5wYXJlbnQ7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufVxuXG4vKipcbiAqIEF0dGVtcHRzIHRvIGJvb3RzdHJhcCB0aGUgZXh0ZW5zaW9uIHdpdGggYSBjcm9zcy1mcmFtZSBwYXJlbnQgd2hlcmUgVGFibGVhdSBpcyBydW5uaW5nXG4gKlxuICogQHBhcmFtIHRoaXNXaW5kb3cgVGhlIHdpbmRvdyB3aGljaCB3ZSBhcmUgcnVubmluZyBpbiAoaW5qZWN0ZWQgZm9yIHVuaXQgdGVzdGluZyBwdXJwb3NlcylcbiAqIEBwYXJhbSBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbiBUaGUgdmVyc2lvbiBudW1iZXIgb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHdlIGFyZSB1c2luZ1xuICogQHJldHVybnMgQSBwcm9taXNlIHdoaWNoIGlzIGRvaW5nIHRoZSBhY3R1YWwgYm9vdHN0cmFwcGluZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gZG9Dcm9zc0ZyYW1lQm9vdHN0cmFwKFxuICB0aGlzV2luZG93OiBXaW5kb3csXG4gIGludGVybmFsQ29udHJhY3RWZXJzaW9uOiBDb250cmFjdC5WZXJzaW9uTnVtYmVyLFxuICBvcHRpb25zOiBJbml0aWFsaXphdGlvbk9wdGlvbnMsXG4pOiBQcm9taXNlPENvbnRyYWN0LkludGVybmFsQXBpRGlzcGF0Y2hlckZhY3Rvcnk+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPENvbnRyYWN0LkludGVybmFsQXBpRGlzcGF0Y2hlckZhY3Rvcnk+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBsZXQgcGFyZW50OiBXaW5kb3c7XG5cbiAgICAvLyBOb3JtYWxseSwgd2UgYXJlIHJ1bm5pbmcgaW5zaWRlIGFuIGlmcmFtZS4gIFRoZSBleGNlcHRpb24gdG8gdGhpcyBpc1xuICAgIC8vIHdoZW4gd2UgYXJlIHJ1bm5pbmcgYXMgYW4gZXh0ZW5zaW9uIGluc2lkZSBhIGRpYWxvZyBhcyBwYXJ0IG9mIHRoZSBVSU5hbWVzcGFjZVxuICAgIC8vIGZ1bmN0aW9uYWxpdHkuICBJbiB0aGF0IGNhc2UsIHdlIHdhbnQgdGhlIG9wZW5lciBvZiB0aGlzIHdpbmRvdyByYXRoZXIgdGhhbiB0aGUgcGFyZW50LlxuICAgIGlmICghaW5JZnJhbWUodGhpc1dpbmRvdykpIHtcbiAgICAgIHBhcmVudCA9IHRoaXNXaW5kb3cub3BlbmVyO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnQgPSB0aGlzV2luZG93LnBhcmVudDtcbiAgICB9XG5cbiAgICBpZiAoIXBhcmVudCkge1xuICAgICAgcmVqZWN0KCdUaGlzIGV4dGVuc2lvbiBpcyBub3QgcnVubmluZyBpbnNpZGUgYW4gaWZyYW1lLCBkZXNrdG9wLCBvciBwb3B1cCB3aW5kb3cuIEluaXRpYWxpemF0aW9uIGZhaWxlZC4nKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgdGhlIG1lc3NlbmdlciB3aGljaCB3aWxsIGRvIGhlIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGlzIHdpbmRvdyBhbmQgb3VyIHBhcmVudFxuICAgIC8vIFNpbmNlIHdlIGRvbid0IGtub3cgd2hlcmUgd2UgYXJlIHJ1bm5pbmcgeWV0LCB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBpbml0aWFsIG9yaWdpbiAnKicuIE9uY2VcbiAgICAvLyB3ZSBoYXZlIHN1Y2Nlc3NmdWxseSBpbml0aWFsaXplZCBvdXIgZXh0ZW5zaW9uLCB3ZSB3aWxsIGxpbWl0IHdoZXJlIHdlIHNlbmQgbWVzc2FnZXNcbiAgICBjb25zdCBtZXNzZW5nZXIgPSBuZXcgQ3Jvc3NGcmFtZU1lc3Nlbmdlcih0aGlzV2luZG93LCBwYXJlbnQsICcqJyk7XG5cbiAgICAvLyBQcmVwYXJlIHRvIHNlbmQgYW4gaW5pdGlhbGl6YXRpb24gbWVzc2FnZSB0byB0aGUgcGFyZW50IGZyYW1lXG4gICAgY29uc3QgaW5pdGlhbGl6YXRpb25NZXNzYWdlID0gbWVzc2VuZ2VyLnByZXBhcmVJbml0aWFsaXphdGlvbk1lc3NhZ2UoaW50ZXJuYWxDb250cmFjdFZlcnNpb24sIEFwaU1lc3NhZ2luZ1ZlcnNpb24sIG9wdGlvbnMpO1xuXG4gICAgLy8gV2hlbiB3ZSByZWNlaXZlIGEgcmVzcG9uc2UgYmFjayBmcm9tIHRoZSBwYXJlbnQsIHdlIGNoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgZ3VpZHMgbWF0Y2ggYW5kIHRoZW4gd2Uga25vd1xuICAgIC8vIHRoYXQgdGhlIHBhcmVudCBpcyBhd2FyZSBvZiB1cyBhbmQgd2UgY2FuIHN0YXJ0IGNvbW11bmljYXRpbmdcbiAgICBtZXNzZW5nZXIuc2V0Q29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIoZnVuY3Rpb24gKG1zZzogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSk6IHZvaWQge1xuICAgICAgLy8gVmVyaWZ5IHdlIGFyZSBnZXR0aW5nIGEgcmVzcG9uc2UgZnJvbSBvdXIgaW5pdGlhbGl6ZSBtZXNzYWdlXG4gICAgICBpZiAobXNnLmNvbW1hbmRHdWlkID09PSBpbml0aWFsaXphdGlvbk1lc3NhZ2UubWVzc2FnZUd1aWQpIHtcbiAgICAgICAgLy8gVGhlIHZlcnNpb25pbmcgb2YgdGhlIGRpc3BhdGNoZXIgaGFwcGVucyBvbiB0aGUgb3RoZXIgc2lkZSBvZiBvdXIgZnJhbWUsIGFuZFxuICAgICAgICAvLyBpbiBhIHdyYXBwZXIgb24gdGhpcyBzaWRlLiBUaGlzIG9uZSBkb2Vzbid0IGhhdmUgYW55IHZlcnNpb24ga25vd2xlZGdlLlxuICAgICAgICBjb25zdCBkaXNwYXRjaGVyRmFjdG9yeSA9ICgpID0+IG5ldyBDcm9zc0ZyYW1lRGlzcGF0Y2hlcihtZXNzZW5nZXIpO1xuICAgICAgICByZXNvbHZlKGRpc3BhdGNoZXJGYWN0b3J5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIE5vdyB0aGF0IG91ciBoYW5kbGVycyBhcmUgcmVhZHksIHN0YXJ0IGxpc3RlbmluZyBhbmQgc2VuZCBvdXIgaW5pdGlhbGl6YXRpb24gbWVzc2FnZVxuICAgIG1lc3Nlbmdlci5zdGFydExpc3RlbmluZygpO1xuICAgIGluaXRpYWxpemF0aW9uTWVzc2FnZS5zZW5kKCk7XG4gIH0pO1xufVxuIiwiaW1wb3J0IHsgRW1iZWRkaW5nRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhlY3V0ZVJlc3BvbnNlLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXIsXG4gIE1lc3NlbmdlcixcbiAgTW9kZWwsXG4gIE5vdGlmaWNhdGlvbkhhbmRsZXIsXG4gIE5vdGlmaWNhdGlvbk1lc3NhZ2UsXG4gIFZlcmJJZCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIGludGVyZmFjZSB3aGljaCBmdW5jdGlvbnMgYnkgcGFzc2luZyBtZXNzYWdlc1xuICogYWNyb3NzIGEgZnJhbWUgYm91bmRhcnkuIFRoaXMgaXMgdXN1YWxseSBiZXR3ZWVuIHRoZSBjb2RlIHdoZXJlIG91ciBqYXZzY3JpcHQgbGlicmFyeSBoYXMgYmVlbiBpbmNsdWRlZFxuICogYnkgYSAzcmQgcGFydHkgZGV2IGFuZCBhbm90aGVyIGZyYW1lIHdoZXJlIFRhYmxlYXUgc2VydmVyIGhhcyBjb250ZW50LlxuICovXG5leHBvcnQgY2xhc3MgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgaW1wbGVtZW50cyBJbnRlcm5hbEFwaURpc3BhdGNoZXIge1xuICAvLyBDb2xsZWN0aW9uIG9mIHBlbmRpbmcgcHJvbWlzZXMgd2hpY2ggYXJlIHdhaXRpbmcgdG8gYmUgcmVzb2x2ZWQuIFdoZW4gd2UgcmVjZWl2ZSBhIHJlc3BvbnNlIGJhY2sgZnJvbSB0aGUgb3RoZXIgZnJhbWUsXG4gIC8vIHRoZXNlIHByb21pc2VzIGNhbiBiZSBlaXRoZXIgcmVzb2x2ZWQgb3IgcmVqZWN0ZWRcbiAgcHJpdmF0ZSBfcGVuZGluZ1Byb21pc2VzOiB7IFttZXNzYWdlR3VpZDogc3RyaW5nXTogeyByZXNvbHZlOiAocmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSkgPT4gdm9pZDsgcmVqZWN0OiAoZXJyb3I6IE1vZGVsKSA9PiB2b2lkIH0gfSA9XG4gICAge307XG5cbiAgLy8gVGhlIGNvbGxlY3Rpb24gb2Ygbm90aWZpY2F0aW9uIGhhbmRsZXJzIHdoaWNoIGhhdmUgYmVlbiByZWdpc3RlcmVkIHdpdGggdGhpcyBkaXNwYXRjaGVyXG4gIHByaXZhdGUgX25vdGlmaWNhdGlvbkhhbmRsZXJzOiBBcnJheTxOb3RpZmljYXRpb25IYW5kbGVyPiA9IFtdO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENyb3NzRnJhbWVEaXNwYXRjaGVyIHdoaWNoIHdpbGwgdXNlIHRoZSBnaXZlbiBtZXNzZW5nZXIgdG8gY29tbXVuaWNhdGVcbiAgICogQHBhcmFtIF9tZXNzZW5nZXIgYW4gaW5zdGFudGlhdGVkIGFuZCBsaXN0ZW5pbmcgbWVzc2VuZ2VyIG9iamVjdFxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX21lc3NlbmdlcjogTWVzc2VuZ2VyKSB7XG4gICAgaWYgKCF0aGlzLl9tZXNzZW5nZXIpIHtcbiAgICAgIHRocm93ICdNaXNzaW5nIG1lc3NlbmdlciBvYmplY3QnO1xuICAgIH1cblxuICAgIC8vIFNldCB1cCBvdXIgbWVzc2FnZSBoYW5kbGVycy4gV2Ugb25seSBjYXJlIGFib3V0IGluY29taW5nIG5vdGlmaWNhdGlvbnMgYW5kIGNvbW1hbmQgcmVzcG9uc2VzXG4gICAgdGhpcy5fbWVzc2VuZ2VyLnNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKHRoaXMub25Db21tYW5kUmVzcG9uc2UuYmluZCh0aGlzKSk7XG4gICAgdGhpcy5fbWVzc2VuZ2VyLnNldE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKHRoaXMub25Ob3RpZmljYXRpb24uYmluZCh0aGlzKSk7XG4gIH1cblxuICAvLy8vLy8gU3RhcnQgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uXG5cbiAgcHVibGljIGV4ZWN1dGUodmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPiB7XG4gICAgLy8gVG8gZXhlY3V0ZSBhIHZlcmIsIHdlIGZpcnN0IHByZXBhcmUgYSBjb21tYW5kIG1lc3NhZ2UgYW5kIHRoZW4gZGVmaW5lIGEgcHJvbWlzZS5cbiAgICBjb25zdCBwcmVwYXJlZE1lc3NhZ2UgPSB0aGlzLl9tZXNzZW5nZXIucHJlcGFyZUNvbW1hbmRNZXNzYWdlKHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZTxFeGVjdXRlUmVzcG9uc2U+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIC8vIFNhdmUgb2ZmIHRoZSBwZW5kaW5nIHByb21pc2UgYnkgdGhlIG1lc3NhZ2VHdWlkIHdlIGFyZSBhYm91dCB0byBzZW5kLiBXaGVuIGEgcmVzcG9uc2UgaXNcbiAgICAgIC8vIHJlY2VpdmVkLCB3ZSdsbCBiZSBhYmxlIHRvIHJlc29sdmUgdGhpcyBwcm9taXNlIHdpdGggdGhlIHJlc3VsdFxuICAgICAgdGhpcy5fcGVuZGluZ1Byb21pc2VzW3ByZXBhcmVkTWVzc2FnZS5tZXNzYWdlR3VpZF0gPSB7IHJlc29sdmU6IHJlc29sdmUsIHJlamVjdDogcmVqZWN0IH07XG4gICAgfSk7XG5cbiAgICAvLyBBY3R1YWxseSBzZW5kIHRoZSBtZXNzYWdlIGFuZCByZXR1cm4gdGhlIHByb21pc2VcbiAgICBwcmVwYXJlZE1lc3NhZ2Uuc2VuZCgpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcihoYW5kbGVyOiBOb3RpZmljYXRpb25IYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgfVxuXG4gIHB1YmxpYyB1bnJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcihoYW5kbGVyOiBOb3RpZmljYXRpb25IYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMgPSB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5maWx0ZXIoKGgpID0+IGggIT09IGhhbmRsZXIpO1xuICB9XG5cbiAgLy8vLy8vIEVuZCBJbnRlcm5hbEFwaURpc3BhdGNoZXIgaW1wbGVtZW50YXRpb25cblxuICBwcml2YXRlIG9uQ29tbWFuZFJlc3BvbnNlKHJlc3BvbnNlOiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlKTogdm9pZCB7XG4gICAgLy8gV2UgZ290IGEgY29tbWFuZCByZXNwb25zZSwgbG9vayB0aHJvdWdoIHRoZSBwZW5kaW5nIHByb21pc2VzIGFuZCByZXNvbHZlXG4gICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuX3BlbmRpbmdQcm9taXNlcykuaW5kZXhPZihyZXNwb25zZS5jb21tYW5kR3VpZCkgPCAwKSB7XG4gICAgICByZXR1cm47IC8vIFdlIGRvbid0IGhhdmUgYW55IHJlZmVyZW5jZSB0byB0aGlzIGNvbW1hbmQsIGp1c3QgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcGVuZGluZ1Byb21pc2UgPSB0aGlzLl9wZW5kaW5nUHJvbWlzZXNbcmVzcG9uc2UuY29tbWFuZEd1aWRdO1xuXG4gICAgLy8gSWYgd2UgaGF2ZSBhbiBlcnJvciBkZWZpbmVkLCByZWplY3QgdGhlIHByb21pc2VcbiAgICBpZiAocmVzcG9uc2UuZXJyb3IpIHtcbiAgICAgIHBlbmRpbmdQcm9taXNlLnJlamVjdChyZXNwb25zZS5lcnJvcik7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBkYXRhIGRlZmluZWQsIHJlc29sdmUgdGhlIHByb21pc2VcbiAgICBpZiAocmVzcG9uc2UuZGF0YSkge1xuICAgICAgcGVuZGluZ1Byb21pc2UucmVzb2x2ZSh7IHJlc3VsdDogcmVzcG9uc2UuZGF0YSB9KTtcbiAgICB9XG5cbiAgICAvLyBDbGVhbiB1cCBvdXIgcGVuZGluZyBwcm9taXNlcyBvYmplY3RcbiAgICBkZWxldGUgdGhpcy5fcGVuZGluZ1Byb21pc2VzW3Jlc3BvbnNlLmNvbW1hbmRHdWlkXTtcbiAgfVxuXG4gIHByaXZhdGUgb25Ob3RpZmljYXRpb24obm90aWZpY2F0aW9uTWVzc2FnZTogTm90aWZpY2F0aW9uTWVzc2FnZSk6IHZvaWQge1xuICAgIC8vIEdvIHRocm91Z2ggZWFjaCBub3RpZmljYXRpb24gaGFuZGxlciB3ZSBoYXZlIHJlZ2lzdGVyZWQgYW5kIGxldCB0aGVtIGtub3cgYSBub3RpZmljYXRpb24gY2FtZSBpblxuICAgIGZvciAoY29uc3QgaGFuZGxlciBvZiB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaGFuZGxlcih7IG5vdGlmaWNhdGlvbklkOiBub3RpZmljYXRpb25NZXNzYWdlLm5vdGlmaWNhdGlvbklkLCBkYXRhOiBub3RpZmljYXRpb25NZXNzYWdlLmRhdGEgfSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIC8vIEluY2FzZSBvZiBhIEluY29tcGF0aWJsZVZlcnNpb25FcnJvciwgcmUtdGhyb3cgdGhlIGVycm9yLlxuICAgICAgICBpZiAoKGUgYXMgVGFibGVhdUVycm9yKS5lcnJvckNvZGUgPT09IEVtYmVkZGluZ0Vycm9yQ29kZXMuSW5jb21wYXRpYmxlVmVyc2lvbkVycm9yKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBFbHNlIElnbm9yZSAgc28gaWYgb25lIGhhbmRsZXIgZXJyb3JzLCB0aGUgb3RoZXIgc3RpbGwgZ2V0IHRoZSBtZXNzYWdlLlxuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFTb3VyY2VJbXBsIH0gZnJvbSAnLi9JbXBsL0RhdGFTb3VyY2VJbXBsJztcblxuZXhwb3J0IGNsYXNzIERhdGFTb3VyY2UgaW1wbGVtZW50cyBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2RhdGFTb3VyY2VJbXBsOiBEYXRhU291cmNlSW1wbCkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxDb250cmFjdC5GaWVsZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5maWVsZHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGV4dHJhY3RVcGRhdGVUaW1lKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmV4dHJhY3RVcGRhdGVUaW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0V4dHJhY3QoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmlzRXh0cmFjdDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNQdWJsaXNoZWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmlzUHVibGlzaGVkO1xuICB9XG5cbiAgcHVibGljIHB1Ymxpc2hlZFVybCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5wdWJsaXNoZWRVcmwoKTtcbiAgfVxuXG4gIHB1YmxpYyByZWZyZXNoQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLnJlZnJlc2hBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldEFjdGl2ZVRhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuVGFibGVTdW1tYXJ5Pj4ge1xuICAgIGNvbnNvbGUud2FybignRGF0YVNvdXJjZS5nZXRBY3RpdmVUYWJsZXNBc3luYyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIERhdGFTb3VyY2UuZ2V0TG9naWNhbFRhYmxlc0FzeW5jLicpO1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRBY3RpdmVUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkNvbm5lY3Rpb25TdW1tYXJ5Pj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnRGF0YVNvdXJjZS5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSB1c2UgJyArXG4gICAgICAgICdEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYyBhbmQgRGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMuJyxcbiAgICApO1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0TG9naWNhbFRhYmxlc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ/OiBudW1iZXIsXG4gICAgb3B0aW9ucz86IENvbnRyYWN0LkRhdGFTb3VyY2VVbmRlcmx5aW5nRGF0YU9wdGlvbnMsXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luYyhsb2dpY2FsVGFibGVJZCwgcGFnZVJvd0NvdW50LCBvcHRpb25zKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgRGF0ZVJhbmdlVHlwZSBhcyBFeHRlcm5hbERhdGVSYW5nZVR5cGUsXG4gIERpYWxvZ1N0eWxlIGFzIEV4dGVybmFsRGlhbG9nU3R5bGUsXG4gIEZpbHRlckRvbWFpblR5cGUgYXMgRXh0ZXJuYWxEb21haW5UeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbiBhcyBFeHRlcm5hbE51bGxPcHRpb24sXG4gIFNoZWV0VHlwZSBhcyBFeHRlcm5hbFNoZWV0VHlwZSxcbiAgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gIFBlcmlvZFR5cGUsXG4gIFJlcGxheVNwZWVkVHlwZSxcbiAgWm9uZVZpc2liaWxpdHlUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2hvd0RhdGFUYWJsZUZvcm1hdCxcbiAgRGF0ZVN0ZXBQZXJpb2QsXG4gIERhdGVSYW5nZVR5cGUgYXMgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEaWFsb2dTdHlsZSBhcyBJbnRlcm5hbERpYWxvZ1N0eWxlLFxuICBGaWx0ZXJEb21haW5UeXBlIGFzIEludGVybmFsRG9tYWluVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSBhcyBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24gYXMgSW50ZXJuYWxOdWxsT3B0aW9uLFxuICBTaGVldFR5cGUgYXMgSW50ZXJuYWxTaGVldFR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vVXRpbHMvRW51bUNvbnZlcnRlcic7XG5cbi8qIHRzbGludDpkaXNhYmxlOnR5cGVkZWYgLSBEaXNhYmxlIHRoaXMgdG8gbWFrZSBkZWNsYXJpbmcgdGhlc2UgY2xhc3NlcyBhIGJpdCBlYXNpZXIgKi9cbi8qKlxuICogTWFwcyBlbnVtcyB1c2VkIGJ5IHRoZSBleHRlcm5hbC1hcGktY29udHJhY3QgdG8gdGhlIGVudW1zIHVzZWRcbiAqIGluIHRoZSBpbnRlcm5hbC1hcGktY29udHJhY3QsIHdoaWNoIGRldmVsb3BlcnMgY29kZSBhZ2FpbnN0LlxuICovXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzIHtcbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJEb21haW5UeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxEb21haW5UeXBlLCBJbnRlcm5hbERvbWFpblR5cGU+KHtcbiAgICBbRXh0ZXJuYWxEb21haW5UeXBlLlJlbGV2YW50XTogSW50ZXJuYWxEb21haW5UeXBlLlJlbGV2YW50LFxuICAgIFtFeHRlcm5hbERvbWFpblR5cGUuRGF0YWJhc2VdOiBJbnRlcm5hbERvbWFpblR5cGUuRGF0YWJhc2UsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgbnVsbE9wdGlvbnMgPSBuZXcgRW51bUNvbnZlcnRlcjxFeHRlcm5hbE51bGxPcHRpb24sIEludGVybmFsTnVsbE9wdGlvbj4oe1xuICAgIFtFeHRlcm5hbE51bGxPcHRpb24uQWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLkFsbFZhbHVlcyxcbiAgICBbRXh0ZXJuYWxOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXNdOiBJbnRlcm5hbE51bGxPcHRpb24uTm9uTnVsbFZhbHVlcyxcbiAgICBbRXh0ZXJuYWxOdWxsT3B0aW9uLk51bGxWYWx1ZXNdOiBJbnRlcm5hbE51bGxPcHRpb24uTnVsbFZhbHVlcyxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWx0ZXJVcGRhdGVUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLCBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGU+KHtcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFkZF06IEludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGQsXG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BbGxdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsLFxuICAgIFtFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVtb3ZlXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZSxcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2VdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVwbGFjZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBzZXRWaXNpYmlsaXR5VHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFpvbmVWaXNpYmlsaXR5VHlwZSwgYm9vbGVhbj4oe1xuICAgIFtab25lVmlzaWJpbGl0eVR5cGUuU2hvd106IHRydWUsXG4gICAgW1pvbmVWaXNpYmlsaXR5VHlwZS5IaWRlXTogZmFsc2UsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2V0UmVwbGF5U3BlZWRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8UmVwbGF5U3BlZWRUeXBlLCBudW1iZXI+KHtcbiAgICAvLyB0aGVzZSBudW1iZXJzIGFyZSBkdXJhdGlvbiBtdWx0aXBsaWVyc1xuICAgIC8vIDIuMCwgZm9yIGV4YW1wbGUsIGRvdWJsZXMgdGhlIGR1cmF0aW9uIG9mIHRoZSByZXBsYXksIHNsb3dpbmcgaXQgZG93biB0byAwLjV4IHNwZWVkXG4gICAgW1JlcGxheVNwZWVkVHlwZS5TbG93XTogMi4wLFxuICAgIFtSZXBsYXlTcGVlZFR5cGUuTm9ybWFsXTogMS4wLFxuICAgIFtSZXBsYXlTcGVlZFR5cGUuRmFzdF06IDAuNSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBzaGVldFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxFeHRlcm5hbFNoZWV0VHlwZSwgSW50ZXJuYWxTaGVldFR5cGU+KHtcbiAgICBbRXh0ZXJuYWxTaGVldFR5cGUuRGFzaGJvYXJkXTogSW50ZXJuYWxTaGVldFR5cGUuRGFzaGJvYXJkLFxuICAgIFtFeHRlcm5hbFNoZWV0VHlwZS5Xb3Jrc2hlZXRdOiBJbnRlcm5hbFNoZWV0VHlwZS5Xb3Jrc2hlZXQsXG4gICAgW0V4dGVybmFsU2hlZXRUeXBlLlN0b3J5XTogSW50ZXJuYWxTaGVldFR5cGUuU3RvcnksXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiwgQXBpU2hvd0RhdGFUYWJsZUZvcm1hdD4oe1xuICAgIFtJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0Lk5hdGl2ZUFuZEZvcm1hdHRlZFZhbHVlcyxcbiAgICBbSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uT25seU5hdGl2ZVZhbHVlc106IEFwaVNob3dEYXRhVGFibGVGb3JtYXQuTmF0aXZlVmFsdWVzT25seSxcbiAgICBbSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uT25seUZvcm1hdHRlZFZhbHVlc106IEFwaVNob3dEYXRhVGFibGVGb3JtYXQuRm9ybWF0dGVkVmFsdWVzT25seSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBwZXJpb2RUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8UGVyaW9kVHlwZSwgRGF0ZVN0ZXBQZXJpb2Q+KHtcbiAgICBbUGVyaW9kVHlwZS5ZZWFyc106IERhdGVTdGVwUGVyaW9kLlllYXJzLFxuICAgIFtQZXJpb2RUeXBlLlF1YXJ0ZXJzXTogRGF0ZVN0ZXBQZXJpb2QuUXVhcnRlcnMsXG4gICAgW1BlcmlvZFR5cGUuTW9udGhzXTogRGF0ZVN0ZXBQZXJpb2QuTW9udGhzLFxuICAgIFtQZXJpb2RUeXBlLldlZWtzXTogRGF0ZVN0ZXBQZXJpb2QuV2Vla3MsXG4gICAgW1BlcmlvZFR5cGUuRGF5c106IERhdGVTdGVwUGVyaW9kLkRheXMsXG4gICAgW1BlcmlvZFR5cGUuSG91cnNdOiBEYXRlU3RlcFBlcmlvZC5Ib3VycyxcbiAgICBbUGVyaW9kVHlwZS5NaW51dGVzXTogRGF0ZVN0ZXBQZXJpb2QuTWludXRlcyxcbiAgICBbUGVyaW9kVHlwZS5TZWNvbmRzXTogRGF0ZVN0ZXBQZXJpb2QuU2Vjb25kcyxcbiAgICBbUGVyaW9kVHlwZS5Jc29ZZWFyc106IERhdGVTdGVwUGVyaW9kLklzb1llYXJzLFxuICAgIFtQZXJpb2RUeXBlLklzb1F1YXJ0ZXJzXTogRGF0ZVN0ZXBQZXJpb2QuSXNvUXVhcnRlcnMsXG4gICAgW1BlcmlvZFR5cGUuSXNvV2Vla3NdOiBEYXRlU3RlcFBlcmlvZC5Jc29XZWVrcyxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRlUmFuZ2VUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLCBJbnRlcm5hbERhdGVSYW5nZVR5cGU+KHtcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3RdOiBJbnRlcm5hbERhdGVSYW5nZVR5cGUuTGFzdCxcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3ROXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3ROLFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dF06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5OZXh0LFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dE5dOiBJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dE4sXG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50XTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkN1cnJlbnQsXG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5Ub0RhdGVdOiBJbnRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRpYWxvZ1N0eWxlcyA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRGlhbG9nU3R5bGUsIEludGVybmFsRGlhbG9nU3R5bGU+KHtcbiAgICBbRXh0ZXJuYWxEaWFsb2dTdHlsZS5XaW5kb3ddOiBJbnRlcm5hbERpYWxvZ1N0eWxlLldpbmRvdyxcbiAgICBbRXh0ZXJuYWxEaWFsb2dTdHlsZS5Nb2RhbF06IEludGVybmFsRGlhbG9nU3R5bGUuTW9kYWwsXG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuTW9kZWxlc3NdOiBJbnRlcm5hbERpYWxvZ1N0eWxlLk1vZGVsZXNzLFxuICB9KTtcbn1cbi8qIHRzbGludDplbmFibGU6dHlwZWRlZiAqL1xuIiwiaW1wb3J0IHtcbiAgQW5ub3RhdGlvblR5cGUgYXMgRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZSxcbiAgQ2xhc3NOYW1lS2V5IGFzIEV4dGVybmFsQ2xhc3NOYW1lS2V5LFxuICBDb2x1bW5UeXBlIGFzIEV4dGVybmFsQ29sdW1uVHlwZSxcbiAgRGFzaGJvYXJkT2JqZWN0VHlwZSBhcyBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhdGFUeXBlIGFzIEV4dGVybmFsRGF0YVR5cGUsXG4gIFBlcmlvZFR5cGUgYXMgRXh0ZXJuYWxEYXRlUGVyaW9kLFxuICBEYXRlUmFuZ2VUeXBlIGFzIEV4dGVybmFsRGF0ZVJhbmdlVHlwZSxcbiAgRXJyb3JDb2RlcyBhcyBFeHRlcm5hbEVycm9yQ29kZXMsXG4gIEV4dGVuc2lvbkNvbnRleHQgYXMgRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dCxcbiAgRXh0ZW5zaW9uTW9kZSBhcyBFeHRlcm5hbEV4dGVuc2lvbnNNb2RlLFxuICBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSBhcyBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLFxuICBGaWVsZFJvbGVUeXBlIGFzIEV4dGVybmFsRmllbGRSb2xlVHlwZSxcbiAgRmlsdGVyVHlwZSBhcyBFeHRlcm5hbEZpbHRlclR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLFxuICBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIGFzIEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSxcbiAgTWFya1R5cGUgYXMgRXh0ZXJuYWxNYXJrVHlwZSxcbiAgUGFyYW1ldGVyVmFsdWVUeXBlIGFzIEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlLFxuICBTaGVldFR5cGUgYXMgRXh0ZXJuYWxTaGVldFR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBbm5vdGF0ZUVudW0gYXMgSW50ZXJuYWxBbm5vdGF0aW9uVHlwZSxcbiAgQ2xhc3NOYW1lS2V5IGFzIEludGVybmFsQ2xhc3NOYW1lS2V5LFxuICBDb2x1bW5UeXBlIGFzIEludGVybmFsQ29sdW1uVHlwZSxcbiAgRGFzaGJvYXJkT2JqZWN0VHlwZSBhcyBJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhdGFUeXBlIGFzIEludGVybmFsRGF0YVR5cGUsXG4gIERhdGVSYW5nZVR5cGUgYXMgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEYXRlU3RlcFBlcmlvZCBhcyBJbnRlcm5hbERhdGVTdGVwUGVyaW9kLFxuICBEb21haW5SZXN0cmljdGlvblR5cGUgYXMgSW50ZXJuYWxEb21haW5SZXN0cmljdGlvblR5cGUsXG4gIEVycm9yQ29kZXMgYXMgSW50ZXJuYWxFcnJvckNvZGVzLFxuICBFeHRlbnNpb25Db250ZXh0IGFzIEludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUgYXMgSW50ZXJuYWxFeHRlbnNpb25zTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUgYXMgSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSBhcyBJbnRlcm5hbEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlclR5cGUgYXMgSW50ZXJuYWxGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEludGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSBhcyBJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIE1hcmtUeXBlIGFzIEludGVybmFsTWFya1R5cGUsXG4gIFNoZWV0VHlwZSBhcyBJbnRlcm5hbFNoZWV0VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi9VdGlscy9FbnVtQ29udmVydGVyJztcblxuLyogdHNsaW50OmRpc2FibGU6dHlwZWRlZiAtIERpc2FibGUgdGhpcyB0byBtYWtlIGRlY2xhcmluZyB0aGVzZSBjbGFzc2VzIGEgYml0IGVhc2llciAqL1xuLyoqXG4gKiBNYXBzIGVudW1zIHVzZWQgYnkgdGhlIGludGVybmFsLWFwaS1jb250cmFjdCB0byB0aGUgZW51bXMgdXNlZFxuICogaW4gdGhlIGV4dGVybmFsLWFwaS1jb250cmFjdCwgd2hpY2ggZGV2ZWxvcGVycyBjb2RlIGFnYWluc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3Mge1xuICBwdWJsaWMgc3RhdGljIGV4dGVuc2lvbkNvbnRleHQgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LCBFeHRlcm5hbEV4dGVuc2lvbnNDb250ZXh0Pih7XG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuRGVza3RvcF06IEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuRGVza3RvcCxcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5TZXJ2ZXJdOiBFeHRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LlNlcnZlcixcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5QdWJsaWNXZWJdOiBFeHRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LlB1YmxpY1dlYixcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5QdWJsaWNEZXNrdG9wXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5QdWJsaWNEZXNrdG9wLFxuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkNsb3VkXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5DbG91ZCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Nb2RlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zTW9kZSwgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZT4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNNb2RlLkF1dGhvcmluZ106IEV4dGVybmFsRXh0ZW5zaW9uc01vZGUuQXV0aG9yaW5nLFxuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNNb2RlLlZpZXdpbmddOiBFeHRlcm5hbEV4dGVuc2lvbnNNb2RlLlZpZXdpbmcsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgY29sdW1uVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsQ29sdW1uVHlwZSwgRXh0ZXJuYWxDb2x1bW5UeXBlPih7XG4gICAgW0ludGVybmFsQ29sdW1uVHlwZS5Db250aW51b3VzXTogRXh0ZXJuYWxDb2x1bW5UeXBlLkNvbnRpbnVvdXMsXG4gICAgW0ludGVybmFsQ29sdW1uVHlwZS5EaXNjcmV0ZV06IEV4dGVybmFsQ29sdW1uVHlwZS5EaXNjcmV0ZSxcbiAgICBbSW50ZXJuYWxDb2x1bW5UeXBlLlVua25vd25dOiBFeHRlcm5hbENvbHVtblR5cGUuVW5rbm93bixcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWVsZEFnZ3JlZ2F0aW9uVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUsIEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdHRyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdHRyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkF2Z106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXZnLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvbGxlY3RdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvbGxlY3QsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQ291bnRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50ZF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQ291bnRkLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkRheV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuRGF5LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkVuZF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuRW5kLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkhvdXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkhvdXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuSW5PdXRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkluT3V0LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkt1cnRvc2lzXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5LdXJ0b3NpcyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NYXhdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1heCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZHldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1keSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZWRpYW5dOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1lZGlhbixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW5dOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1pbixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW51dGVdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1pbnV0ZSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Nb250aFllYXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1vbnRoWWVhcixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ob25lXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ob25lLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXRyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXVhcnQxLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0M106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXVhcnQzLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNlY29uZF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2Vjb25kLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNrZXduZXNzXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ta2V3bmVzcyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdGRldl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXYsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZwXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdGRldnAsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3VtXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdW0sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNEYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jRGF5LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jSG91cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNIb3VyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jTWludXRlXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY01pbnV0ZSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY01vbnRoXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY01vbnRoLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jUXRyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1F0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1NlY29uZF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNTZWNvbmQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNXZWVrXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1dlZWssXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNZZWFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1llYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVXNlcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVXNlcixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5WYXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlZhcixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5WYXJwXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5WYXJwLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWssXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuV2Vla2RheV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuV2Vla2RheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5ZZWFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5ZZWFyLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGZpZWxkUm9sZVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpZWxkUm9sZVR5cGUsIEV4dGVybmFsRmllbGRSb2xlVHlwZT4oe1xuICAgIFtJbnRlcm5hbEZpZWxkUm9sZVR5cGUuRGltZW5zaW9uXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLkRpbWVuc2lvbixcbiAgICBbSW50ZXJuYWxGaWVsZFJvbGVUeXBlLk1lYXN1cmVdOiBFeHRlcm5hbEZpZWxkUm9sZVR5cGUuTWVhc3VyZSxcbiAgICBbSW50ZXJuYWxGaWVsZFJvbGVUeXBlLlVua25vd25dOiBFeHRlcm5hbEZpZWxkUm9sZVR5cGUuVW5rbm93bixcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBzaGVldFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbFNoZWV0VHlwZSwgRXh0ZXJuYWxTaGVldFR5cGU+KHtcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuRGFzaGJvYXJkXTogRXh0ZXJuYWxTaGVldFR5cGUuRGFzaGJvYXJkLFxuICAgIFtJbnRlcm5hbFNoZWV0VHlwZS5TdG9yeV06IEV4dGVybmFsU2hlZXRUeXBlLlN0b3J5LFxuICAgIFtJbnRlcm5hbFNoZWV0VHlwZS5Xb3Jrc2hlZXRdOiBFeHRlcm5hbFNoZWV0VHlwZS5Xb3Jrc2hlZXQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGFzaGJvYXJkT2JqZWN0VHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZSwgRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlPih7XG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5FeHRlbnNpb25dOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuRXh0ZW5zaW9uLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuQmxhbmtdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuQmxhbmssXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5JbWFnZV06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5JbWFnZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkxlZ2VuZF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5MZWdlbmQsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYWdlRmlsdGVyXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlBhZ2VGaWx0ZXIsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYXJhbWV0ZXJDb250cm9sXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlBhcmFtZXRlckNvbnRyb2wsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5RdWlja0ZpbHRlcl06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5RdWlja0ZpbHRlcixcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRleHRdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuVGV4dCxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRpdGxlXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRpdGxlLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV2ViUGFnZV06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5XZWJQYWdlLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV29ya3NoZWV0XTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRhVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0YVR5cGUsIEV4dGVybmFsRGF0YVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5Cb29sXTogRXh0ZXJuYWxEYXRhVHlwZS5Cb29sLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkRhdGVdOiBFeHRlcm5hbERhdGFUeXBlLkRhdGUsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuRGF0ZVRpbWVdOiBFeHRlcm5hbERhdGFUeXBlLkRhdGVUaW1lLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkZsb2F0XTogRXh0ZXJuYWxEYXRhVHlwZS5GbG9hdCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5JbnRdOiBFeHRlcm5hbERhdGFUeXBlLkludCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5TcGF0aWFsXTogRXh0ZXJuYWxEYXRhVHlwZS5TcGF0aWFsLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLlN0cmluZ106IEV4dGVybmFsRGF0YVR5cGUuU3RyaW5nLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGZpbHRlclVwZGF0ZVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZT4oe1xuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkXTogRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFkZCxcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbF06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BbGwsXG4gICAgW0ludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmVdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVtb3ZlLFxuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVwbGFjZV06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGFsbG93YWJsZVZhbHVlcyA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLCBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZT4oe1xuICAgIFtJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZS5BbGxdOiBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZS5BbGwsXG4gICAgW0ludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLkxpc3RdOiBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZS5MaXN0LFxuICAgIFtJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZS5SYW5nZV06IEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlLlJhbmdlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhdGVTdGVwUGVyaW9kID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxEYXRlU3RlcFBlcmlvZCwgRXh0ZXJuYWxEYXRlUGVyaW9kPih7XG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuWWVhcnNdOiBFeHRlcm5hbERhdGVQZXJpb2QuWWVhcnMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuUXVhcnRlcnNdOiBFeHRlcm5hbERhdGVQZXJpb2QuUXVhcnRlcnMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuTW9udGhzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLk1vbnRocyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5XZWVrc106IEV4dGVybmFsRGF0ZVBlcmlvZC5XZWVrcyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5EYXlzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLkRheXMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuSG91cnNdOiBFeHRlcm5hbERhdGVQZXJpb2QuSG91cnMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuTWludXRlc106IEV4dGVybmFsRGF0ZVBlcmlvZC5NaW51dGVzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlNlY29uZHNdOiBFeHRlcm5hbERhdGVQZXJpb2QuU2Vjb25kcyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5Jc29ZZWFyc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Jc29ZZWFycyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5Jc29RdWFydGVyc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Jc29RdWFydGVycyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5Jc29XZWVrc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Jc29XZWVrcyxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRlUmFuZ2VUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxEYXRlUmFuZ2VUeXBlLCBFeHRlcm5hbERhdGVSYW5nZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkN1cnJlbnRdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3RdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTGFzdCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3ROXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3ROLFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dF06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5OZXh0LFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dE5dOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dE4sXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5Ub0RhdGVdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGVycm9yQ29kZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRXJyb3JDb2RlcywgRXh0ZXJuYWxFcnJvckNvZGVzPihcbiAgICB7XG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLklOSVRJQUxJWkFUSU9OX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLklOVEVSTkFMX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLk1JU1NJTkdfRU5VTV9NQVBQSU5HXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLk1JU1NJTkdfUEFSQU1FVEVSXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlBFUk1JU1NJT05fREVOSUVEXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlBSRVNfTU9ERUxfUEFSU0lOR19FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5VTktOT1dOX1ZFUkJfSURdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuVkVSU0lPTl9OT1RfQ09ORklHVVJFRF06IEV4dGVybmFsRXJyb3JDb2Rlcy5BUElOb3RJbml0aWFsaXplZCxcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuVklTSUJJTElUWV9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5WaXNpYmlsaXR5RXJyb3IsXG4gICAgfSxcbiAgICBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgKTtcblxuICBwdWJsaWMgc3RhdGljIGZpbHRlclR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpbHRlclR5cGUsIEV4dGVybmFsRmlsdGVyVHlwZT4oe1xuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuQ2F0ZWdvcmljYWxdOiBFeHRlcm5hbEZpbHRlclR5cGUuQ2F0ZWdvcmljYWwsXG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5SYW5nZV06IEV4dGVybmFsRmlsdGVyVHlwZS5SYW5nZSxcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZV06IEV4dGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGUsXG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5IaWVyYXJjaGljYWxdOiBFeHRlcm5hbEZpbHRlclR5cGUuSGllcmFyY2hpY2FsLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGNsYXNzTmFtZUtleSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsQ2xhc3NOYW1lS2V5LCBFeHRlcm5hbENsYXNzTmFtZUtleT4oe1xuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZV06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LkRhc2hib2FyZFRpdGxlLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5TdG9yeVRpdGxlXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuU3RvcnlUaXRsZSxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuVG9vbHRpcF06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXAsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldF06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldCxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0VGl0bGVdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRUaXRsZSxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuUGFuZV06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlBhbmUsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuUm93RGl2aWRlcnMsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LkNvbHVtbkRpdmlkZXJzXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuQ29sdW1uRGl2aWRlcnMsXG4gICAgLy8gVGVtcG9yYXJ5IHVudGlsIHdlIGZpeCAxMzE3MjY2IC0gUGxhdGZvcm0gaGFzbid0IGJlZW4gdXBkYXRlZCBjdXJyZW50bHkgYmVjYXVzZSBuZWFyIGJyYW5jaCBpcyBjbG9zZWRcbiAgICBbJ2Rhc2hib2FyZC10aXRsZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZSxcbiAgICBbJ3N0b3J5LXRpdGxlJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlN0b3J5VGl0bGUsXG4gICAgWyd0b29sdGlwJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXAsXG4gICAgWyd3b3Jrc2hlZXQnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0LFxuICAgIFsnd29ya3NoZWV0LXRpdGxlJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldFRpdGxlLFxuICAgIFsncGFuZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5QYW5lLFxuICAgIFsncm93LWRpdmlkZXJzJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzLFxuICAgIFsnY29sdW1uLWRpdmlkZXJzJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LkNvbHVtbkRpdmlkZXJzLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgPSBuZXcgRW51bUNvbnZlcnRlcjxcbiAgICBJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gICAgRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlXG4gID4oe1xuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuQWxsU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuQWxsU2VsZWN0ZWQsXG4gICAgW0ludGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Ob25lU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuTm9uZVNlbGVjdGVkLFxuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuU29tZVNlbGVjdGVkXTogRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlNvbWVTZWxlY3RlZCxcbiAgICBbSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlVua25vd25TZWxlY3RlZF06IEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Vbmtub3duU2VsZWN0ZWQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgYW5ub3RhdGlvblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEFubm90YXRpb25UeXBlLCBFeHRlcm5hbEFubm90YXRpb25UeXBlPih7XG4gICAgW0ludGVybmFsQW5ub3RhdGlvblR5cGUuQXJlYV06IEV4dGVybmFsQW5ub3RhdGlvblR5cGUuQXJlYSxcbiAgICBbSW50ZXJuYWxBbm5vdGF0aW9uVHlwZS5NYXJrXTogRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZS5NYXJrLFxuICAgIFtJbnRlcm5hbEFubm90YXRpb25UeXBlLlBvaW50XTogRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZS5Qb2ludCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBtYXJrVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsTWFya1R5cGUsIEV4dGVybmFsTWFya1R5cGU+KHtcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5BcmVhXTogRXh0ZXJuYWxNYXJrVHlwZS5BcmVhLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkJhcl06IEV4dGVybmFsTWFya1R5cGUuQmFyLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkNpcmNsZV06IEV4dGVybmFsTWFya1R5cGUuQ2lyY2xlLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkdhbnR0QmFyXTogRXh0ZXJuYWxNYXJrVHlwZS5HYW50dEJhcixcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5IZWF0bWFwXTogRXh0ZXJuYWxNYXJrVHlwZS5IZWF0bWFwLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkxpbmVdOiBFeHRlcm5hbE1hcmtUeXBlLkxpbmUsXG4gICAgW0ludGVybmFsTWFya1R5cGUuTWFwXTogRXh0ZXJuYWxNYXJrVHlwZS5NYXAsXG4gICAgW0ludGVybmFsTWFya1R5cGUuUGllXTogRXh0ZXJuYWxNYXJrVHlwZS5QaWUsXG4gICAgW0ludGVybmFsTWFya1R5cGUuUG9seWdvbl06IEV4dGVybmFsTWFya1R5cGUuUG9seWdvbixcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5TaGFwZV06IEV4dGVybmFsTWFya1R5cGUuU2hhcGUsXG4gICAgW0ludGVybmFsTWFya1R5cGUuU3F1YXJlXTogRXh0ZXJuYWxNYXJrVHlwZS5TcXVhcmUsXG4gICAgW0ludGVybmFsTWFya1R5cGUuVGV4dF06IEV4dGVybmFsTWFya1R5cGUuVGV4dCxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5WaXpFeHRlbnNpb25dOiBFeHRlcm5hbE1hcmtUeXBlLlZpekV4dGVuc2lvbixcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlciB9IGZyb20gJy4vU2luZ2xlRXZlbnRNYW5hZ2VyJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vVGFibGVhdUVycm9yJztcblxuLyoqXG4gKiBDbGFzcyBkZXNpZ25lZCB0byByZWdpc3RlciBhbmQgdW5yZWdpc3RlciBoYW5kbGVycyBmcm9tIGEgdXNlci4gT25seSB0aG9zZSBldmVudHNcbiAqIHdoaWNoIGFyZSBhZGRlZCB2aWEgQWRkTmV3RXZlbnRUeXBlIHdpbGwgYmUgc3VwcG9ydGVkIGJ5IHRoaXMgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgQ29udHJhY3QuRXZlbnRMaXN0ZW5lck1hbmFnZXIge1xuICBwcml2YXRlIF9ldmVudExpc3RlbmVyTWFuYWdlcnM6IHsgW3RhYmxlYXVFdmVudFR5cGU6IHN0cmluZ106IFNpbmdsZUV2ZW50TWFuYWdlciB9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnMgPSB7fTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZSwgaGFuZGxlcjogQ29udHJhY3QuVGFibGVhdUV2ZW50SGFuZGxlckZuKTogQ29udHJhY3QuVGFibGVhdUV2ZW50VW5yZWdpc3RlckZuIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudFR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuVW5zdXBwb3J0ZWRFdmVudE5hbWUsIGBDYW5ub3QgYWRkIGV2ZW50LCB1bnN1cHBvcnRlZCBldmVudCB0eXBlOiAke2V2ZW50VHlwZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzW2V2ZW50VHlwZV0uYWRkRXZlbnRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZSwgaGFuZGxlcjogQ29udHJhY3QuVGFibGVhdUV2ZW50SGFuZGxlckZuKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnMuaGFzT3duUHJvcGVydHkoZXZlbnRUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLlVuc3VwcG9ydGVkRXZlbnROYW1lLCBgQ2Fubm90IHJlbW92ZSBldmVudCwgdW5zdXBwb3J0ZWQgZXZlbnQgdHlwZTogJHtldmVudFR5cGV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vyc1tldmVudFR5cGVdLnJlbW92ZUV2ZW50TGlzdGVuZXIoaGFuZGxlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkTmV3RXZlbnRUeXBlKGV2ZW50TWFuYWdlcjogU2luZ2xlRXZlbnRNYW5hZ2VyKTogdm9pZCB7XG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzW2V2ZW50TWFuYWdlci5ldmVudFR5cGVdID0gZXZlbnRNYW5hZ2VyO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29sdW1uVHlwZSwgRGF0YVR5cGUsIEZpZWxkQWdncmVnYXRpb25UeXBlLCBGaWVsZFJvbGVUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEZpZWxkSW1wbCB9IGZyb20gJy4vSW1wbC9GaWVsZEltcGwnO1xuXG5leHBvcnQgY2xhc3MgRmllbGQgaW1wbGVtZW50cyBDb250cmFjdC5GaWVsZCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9maWVsZEltcGw6IEZpZWxkSW1wbCkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBEYXRhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5kYXRhVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWdncmVnYXRpb24oKTogRmllbGRBZ2dyZWdhdGlvblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuYWdncmVnYXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5kYXRhU291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldCByb2xlKCk6IEZpZWxkUm9sZVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwucm9sZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1uVHlwZSgpOiBDb2x1bW5UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmNvbHVtblR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ2FsY3VsYXRlZEZpZWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNDYWxjdWxhdGVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ29tYmluZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzQ29tYmluZWRGaWVsZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW5lcmF0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0dlbmVyYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW9zcGF0aWFsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNHZW9zcGF0aWFsO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzSGlkZGVuO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2U7XG4gIH1cbn1cbiIsImltcG9ydCB7IEN1c3RvbVZpZXdNb2RlbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcywgVml6U2VydmljZSB9IGZyb20gJy4uLy4uL0FwaVNoYXJlZCc7XG5leHBvcnQgY2xhc3MgQ3VzdG9tVmlld0ltcGwge1xuICBwcml2YXRlIF9sdWlkOiBzdHJpbmc7XG4gIHByaXZhdGUgX25hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfc2hhcmVkOiBib29sZWFuO1xuICBwcml2YXRlIF9pc0RlZmF1bHQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX293bmVyTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIF91cmw6IHN0cmluZztcbiAgcHVibGljIGNvbnN0cnVjdG9yKGN1c3RvbVZpZXdNb2RlbDogQ3VzdG9tVmlld01vZGVsLCBwcml2YXRlIF9yZWdpc3RyeUlkOiBudW1iZXIpIHtcbiAgICB0aGlzLl9sdWlkID0gY3VzdG9tVmlld01vZGVsLmx1aWQ7XG4gICAgdGhpcy5fbmFtZSA9IGN1c3RvbVZpZXdNb2RlbC5uYW1lO1xuICAgIHRoaXMuX3NoYXJlZCA9IGN1c3RvbVZpZXdNb2RlbC5zaGFyZWQ7XG4gICAgdGhpcy5faXNEZWZhdWx0ID0gY3VzdG9tVmlld01vZGVsLmlzRGVmYXVsdDtcbiAgICB0aGlzLl9vd25lck5hbWUgPSBjdXN0b21WaWV3TW9kZWwub3duZXIudXNlckZyaWVuZGx5TmFtZTtcbiAgICB0aGlzLl91cmwgPSBjdXN0b21WaWV3TW9kZWwudXJsO1xuICB9XG5cbiAgcHVibGljIGdldCBsdWlkKCkge1xuICAgIHJldHVybiB0aGlzLl9sdWlkO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIHNldCBuYW1lKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSBuYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGFyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoYXJlZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2hhcmVkKHNoYXJlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX3NoYXJlZCA9IHNoYXJlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNEZWZhdWx0KCkge1xuICAgIHJldHVybiB0aGlzLl9pc0RlZmF1bHQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGlzRGVmYXVsdChpc0RlZmF1bHQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0RlZmF1bHQgPSBpc0RlZmF1bHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG93bmVyTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fb3duZXJOYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCB1cmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQXN5bmMoKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Vml6U2VydmljZT4oU2VydmljZU5hbWVzLlZpeik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2F2ZUFzeW5jKHRoaXMpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzLFxuICBFcnJvckNvZGVzLFxuICBTaGFyZWRFcnJvckNvZGVzLFxuICBTaGVldFR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RUeXBlLCBEYXNoYm9hcmRab25lLCBTaGVldFBhdGgsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi9Qb2ludCc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvQW5pbWF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRmlsdGVyU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBab25lU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1pvbmVTZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4vRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL1NoZWV0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcbmltcG9ydCB7IFN0b3J5UG9pbnRJbXBsIH0gZnJvbSAnLi9TdG9yeVBvaW50SW1wbCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRJbXBsIH0gZnJvbSAnLi9Xb3Jrc2hlZXRJbXBsJztcblxuZXhwb3J0IGNsYXNzIERhc2hib2FyZEltcGwgZXh0ZW5kcyBTaGVldEltcGwge1xuICBwcml2YXRlIF93b3Jrc2hlZXRzSW1wbDogQXJyYXk8V29ya3NoZWV0SW1wbD47XG4gIHByaXZhdGUgX29iamVjdHM6IEFycmF5PERhc2hib2FyZE9iamVjdEltcGw+O1xuICBwcml2YXRlIHpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBfc2hlZXRJbmZvOiBTaGVldEluZm9JbXBsLFxuICAgIHByaXZhdGUgX3pvbmVzOiBBcnJheTxEYXNoYm9hcmRab25lPixcbiAgICBwcml2YXRlIF9zaGVldFBhdGg6IFNoZWV0UGF0aCxcbiAgICBfcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX3BhcmVudFN0b3J5UG9pbnRJbXBsOiBTdG9yeVBvaW50SW1wbCB8IG51bGwsXG4gICAgcHJpdmF0ZSBfYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQ6IG51bWJlciA9IDAsXG4gICkge1xuICAgIHN1cGVyKF9zaGVldEluZm8sIF9yZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0c0ltcGwoKTogQXJyYXk8V29ya3NoZWV0SW1wbD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRzSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb2JqZWN0cygpOiBBcnJheTxEYXNoYm9hcmRPYmplY3RJbXBsPiB7XG4gICAgcmV0dXJuIHRoaXMuX29iamVjdHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudFN0b3J5UG9pbnQoKTogU3RvcnlQb2ludEltcGwgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50U3RvcnlQb2ludEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZURhc2hib2FyZE9iamVjdElkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZURhc2hib2FyZE9iamVjdElkO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVEYXNoYm9hcmROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0UGF0aC5zaGVldE5hbWU7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKCk6IHZvaWQge1xuICAgIHRoaXMuX3dvcmtzaGVldHNJbXBsID0gbmV3IEFycmF5PFdvcmtzaGVldEltcGw+KCk7XG4gICAgdGhpcy5fb2JqZWN0cyA9IG5ldyBBcnJheTxEYXNoYm9hcmRPYmplY3RJbXBsPigpO1xuICAgIHRoaXMuem9uZU1hcCA9IG5ldyBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPigpO1xuXG4gICAgLy8gUHJvY2VzcyBhbGwgdGhlIHpvbmVzIHdoaWNoIGFyZSBjb250YWluZWQgaW4gdGhpcyBkYXNoYm9hcmRcbiAgICBmb3IgKGNvbnN0IHpvbmUgb2YgdGhpcy5fem9uZXMpIHtcbiAgICAgIGxldCB3b3Jrc2hlZXRJbXBsOiBXb3Jrc2hlZXRJbXBsIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCB6b25lU2l6ZTogQ29udHJhY3QuU2l6ZSA9IHsgd2lkdGg6IHpvbmUud2lkdGgsIGhlaWdodDogem9uZS5oZWlnaHQgfTtcbiAgICAgIC8vIEFzIHRoZSBkYXNoYm9hcmQgaXMgYWN0aXZlLCBhbGwgb3RoZXIgem9uZXMgaW4gdGhlIGRhc2hib2FyZCBhcmUgaW5hY3RpdmUuXG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICBpZiAoem9uZS56b25lVHlwZSA9PT0gRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQgfHwgem9uZS56b25lVHlwZSA9PT0gRGFzaGJvYXJkT2JqZWN0VHlwZS5RdWlja0ZpbHRlcikge1xuICAgICAgICBsZXQgd29ya3NoZWV0TmFtZSA9ICcnO1xuICAgICAgICBsZXQgd29ya3NoZWV0VXJsID0gJyc7XG4gICAgICAgIGxldCBpc0hpZGRlbiA9IGZhbHNlO1xuICAgICAgICBpZiAoem9uZS5zaGVldEluZm8pIHtcbiAgICAgICAgICAvLyB6b25lLnNoZWV0SW5mbyB3YXMgbm90IGluaXRpYWxpemVkIHByaW9yIHRvIGludGVybmFsLWNvbnRyYWN0IDEuNi4wXG4gICAgICAgICAgd29ya3NoZWV0TmFtZSA9IHpvbmUuc2hlZXRJbmZvLm5hbWU7XG5cbiAgICAgICAgICAvLyB3b3Jrc2hlZXRVcmwgJiBpc0hpZGRlbiBpcyBmb3IgRW1iZWRkaW5nIG9ubHlcbiAgICAgICAgICB3b3Jrc2hlZXRVcmwgPSB6b25lLnNoZWV0SW5mby51cmwgfHwgJyc7XG4gICAgICAgICAgLy8gSWYgdGhlcmUncyBhIHVybCwgdGhlbiBpdCdzIG5vdCBoaWRkZW5cbiAgICAgICAgICBpc0hpZGRlbiA9IHdvcmtzaGVldFVybCA9PT0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd29ya3NoZWV0TmFtZSA9IHpvbmUubmFtZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbmRleGVzLCBpc0FjdGl2ZSBhbmQgc29tZSBtb3JlIHByb3BlcnRpZXMgaW4gc2hlZXRJbmZvSW1wbCBhcmUgZW1iZWRkaW5nIHNwZWNpZmljLlxuICAgICAgICAvLyBCdXQgd2UgaW5pdCB0aGVtIGZvciBib3RoIGV4dGVuc2lvbnMgYW5kIGVtYmVkZGluZyBhcyB0aGUgTW9kZWxzIHdpbGwgb25seSB1c2Ugd2hhdCBpcyByZWxldmFudC5cbiAgICAgICAgY29uc3Qgc2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKFxuICAgICAgICAgIHdvcmtzaGVldE5hbWUsXG4gICAgICAgICAgU2hlZXRUeXBlLldvcmtzaGVldCxcbiAgICAgICAgICB6b25lU2l6ZSxcbiAgICAgICAgICB0aGlzLl93b3Jrc2hlZXRzSW1wbC5sZW5ndGgsXG4gICAgICAgICAgaXNBY3RpdmUsXG4gICAgICAgICAgaXNIaWRkZW4sXG4gICAgICAgICAgd29ya3NoZWV0VXJsLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHZpeklkOiBWaXN1YWxJZCA9IHtcbiAgICAgICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgICAgICAgZGFzaGJvYXJkOiB0aGlzLl9zaGVldEluZm9JbXBsLm5hbWUsXG4gICAgICAgICAgc3Rvcnlib2FyZDogdGhpcy5fc2hlZXRQYXRoLnN0b3J5Ym9hcmQsXG4gICAgICAgICAgZmxpcGJvYXJkWm9uZUlEOiB0aGlzLl9zaGVldFBhdGguZmxpcGJvYXJkWm9uZUlELFxuICAgICAgICAgIHN0b3J5UG9pbnRJRDogdGhpcy5fc2hlZXRQYXRoLnN0b3J5UG9pbnRJRCxcbiAgICAgICAgfTtcblxuICAgICAgICB3b3Jrc2hlZXRJbXBsID0gbmV3IFdvcmtzaGVldEltcGwoc2hlZXRJbmZvSW1wbCwgdGhpcy5fcmVnaXN0cnlJZCwgdml6SWQsIHRoaXMsIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsKTtcbiAgICAgICAgaWYgKHpvbmUuem9uZVR5cGUgPT09IERhc2hib2FyZE9iamVjdFR5cGUuV29ya3NoZWV0KSB7XG4gICAgICAgICAgdGhpcy5fd29ya3NoZWV0c0ltcGwucHVzaCh3b3Jrc2hlZXRJbXBsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB6b25lUG9pbnQgPSBuZXcgUG9pbnQoem9uZS54LCB6b25lLnkpO1xuXG4gICAgICBjb25zdCBkYXNoYm9hcmRPYmplY3RJbXBsID0gbmV3IERhc2hib2FyZE9iamVjdEltcGwoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXNoYm9hcmRPYmplY3RUeXBlLmNvbnZlcnQoem9uZS56b25lVHlwZSksXG4gICAgICAgIHpvbmVQb2ludCxcbiAgICAgICAgem9uZVNpemUsXG4gICAgICAgIHdvcmtzaGVldEltcGwsXG4gICAgICAgIHpvbmUubmFtZSxcbiAgICAgICAgem9uZS5pc0Zsb2F0aW5nICE9PSB1bmRlZmluZWQgPyB6b25lLmlzRmxvYXRpbmcgOiBmYWxzZSwgLy8gYmVmb3JlIDEuNi4wIHdlIGRpZG4ndCBoYXZlIGlzRmxvYXRpbmcsIHNvIHdlIGFzc3VtZSBmYWxzZVxuICAgICAgICB6b25lLmlzVmlzaWJsZSAhPT0gdW5kZWZpbmVkID8gem9uZS5pc1Zpc2libGUgOiB0cnVlLCAvLyBiZWZvcmUgMS42LjAgd2UgZGlkbid0IGhhdmUgaXNWaXNpYmxlLCBzbyB3ZSBhc3N1bWUgdHJ1ZVxuICAgICAgICB6b25lLnpvbmVJZCxcbiAgICAgICAgem9uZS5maWVsZElkLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5fb2JqZWN0cy5wdXNoKGRhc2hib2FyZE9iamVjdEltcGwpO1xuICAgICAgdGhpcy56b25lTWFwLnNldCh6b25lLnpvbmVJZCwgZGFzaGJvYXJkT2JqZWN0SW1wbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlBc3luYyhkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwIHwgb2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgem9uZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Wm9uZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5ab25lKTtcblxuICAgIHJldHVybiB6b25lU2VydmljZS5zZXRWaXNpYmlsaXR5QXN5bmMoLypEYXNoYm9hcmQgTmFtZSovIHRoaXMubmFtZSwgdGhpcy56b25lTWFwLCBkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXNoYm9hcmRPYmplY3RCeUlkKGRhc2hib2FyZE9iamVjdElkOiBudW1iZXIpOiBEYXNoYm9hcmRPYmplY3RJbXBsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy56b25lTWFwLmdldChkYXNoYm9hcmRPYmplY3RJZCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlWm9uZXMobmV3Wm9uZXM6IEFycmF5PERhc2hib2FyZFpvbmU+LCBuZXdBY3RpdmVab25lSWQgPSAwLCBuZXdBY3RpdmVEYXNoYm9hcmROYW1lID0gJycpOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzIHtcbiAgICAvLyBnZXR0aW5nIHByZXZpb3VzIGRhc2hib2FyZCBvYmplY3RzLCBhY3RpdmUgem9uZSBJRCBhbmQgYWN0aXZlIGRhc2hib2FyZCBuYW1lXG4gICAgY29uc3Qgb2xkRGFzaGJvYXJkT2JqZWN0cyA9IHRoaXMuX29iamVjdHM7XG4gICAgY29uc3Qgb2xkWm9uZU1hcCA9IHRoaXMuem9uZU1hcDtcbiAgICBjb25zdCBvbGRBY3RpdmVab25lSWQgPSB0aGlzLl9hY3RpdmVEYXNoYm9hcmRPYmplY3RJZDtcbiAgICBjb25zdCBvbGRBY3RpdmVEYXNoYm9hcmROYW1lID0gdGhpcy5fc2hlZXRQYXRoLnNoZWV0TmFtZTtcbiAgICAvLyB1cGRhdGluZyB6b25lcyBhbmQgcmVpbml0aWFsaXppbmcgaW5zdGFuY2UgdmFyaWFibGVzXG4gICAgdGhpcy5fem9uZXMgPSBuZXdab25lcztcbiAgICB0aGlzLl9hY3RpdmVEYXNoYm9hcmRPYmplY3RJZCA9IG5ld0FjdGl2ZVpvbmVJZDtcbiAgICBpZiAobmV3QWN0aXZlRGFzaGJvYXJkTmFtZSkge1xuICAgICAgdGhpcy5fc2hlZXRQYXRoLnNoZWV0TmFtZSA9IG5ld0FjdGl2ZURhc2hib2FyZE5hbWU7XG4gICAgICB0aGlzLl9zaGVldEluZm9JbXBsLm5hbWUgPSBuZXdBY3RpdmVEYXNoYm9hcmROYW1lO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcygpO1xuICAgIC8vIGdldHRpbmcgbmV3IGRhc2hib2FyZCBvYmplY3RzXG4gICAgY29uc3QgbmV3RGFzaGJvYXJkT2JqZWN0cyA9IHRoaXMuX29iamVjdHM7XG4gICAgY29uc3QgbmV3Wm9uZU1hcCA9IHRoaXMuem9uZU1hcDtcbiAgICAvLyBpbml0aWFsaXppbmcgbWFwIGZvciBjaGFuZ2VzXG4gICAgY29uc3Qgem9uZUNoYW5nZXM6IERhc2hib2FyZExheW91dENoYW5nZURldGFpbHMgPSBuZXcgTWFwKCk7XG5cbiAgICAvLyBjb21wYXJpbmcgb2xkIGRhc2hib2FyZCBvYmplY3RzIHdpdGggbmV3IG9uZXNcbiAgICBvbGREYXNoYm9hcmRPYmplY3RzLmZvckVhY2goKG9sZE9iamVjdCkgPT4ge1xuICAgICAgY29uc3Qgb2xkSWQ6IG51bWJlciA9IG9sZE9iamVjdC5pZDtcblxuICAgICAgLy8gY2hlY2tpbmcgaWYgem9uZSB3YXMgcmVtb3ZlZFxuICAgICAgaWYgKCFuZXdab25lTWFwLmhhcyhvbGRJZCkpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuUmVtb3ZlZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3T2JqZWN0ID0gbmV3Wm9uZU1hcC5nZXQob2xkSWQpO1xuICAgICAgaWYgKG9sZE9iamVjdC5pc0Zsb2F0aW5nICE9PSBuZXdPYmplY3QhLmlzRmxvYXRpbmcpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuSXNGbG9hdGluZ0NoYW5nZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkT2JqZWN0LmlzVmlzaWJsZSAhPT0gbmV3T2JqZWN0IS5pc1Zpc2libGUpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuSXNWaXNpYmxlQ2hhbmdlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRPYmplY3QubmFtZSAhPT0gbmV3T2JqZWN0IS5uYW1lKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLk5hbWVDaGFuZ2VkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZE9iamVjdC5wb3NpdGlvbi54ICE9PSBuZXdPYmplY3QhLnBvc2l0aW9uLnggfHwgb2xkT2JqZWN0LnBvc2l0aW9uLnkgIT09IG5ld09iamVjdCEucG9zaXRpb24ueSkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5Qb3NpdGlvbkNoYW5nZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkT2JqZWN0LnNpemUud2lkdGggIT09IG5ld09iamVjdCEuc2l6ZS53aWR0aCB8fCBvbGRPYmplY3Quc2l6ZS5oZWlnaHQgIT09IG5ld09iamVjdCEuc2l6ZS5oZWlnaHQpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuU2l6ZUNoYW5nZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2tpbmcgZm9yIGFueSBhZGRlZCB6b25lc1xuICAgIG5ld0Rhc2hib2FyZE9iamVjdHMuZm9yRWFjaCgobmV3T2JqZWN0KSA9PiB7XG4gICAgICBpZiAoIW9sZFpvbmVNYXAuaGFzKG5ld09iamVjdC5pZCkpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2UobmV3T2JqZWN0LmlkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLkFkZGVkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNraW5nIGlmIHpvbmUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkXG4gICAgaWYgKG9sZEFjdGl2ZVpvbmVJZCAhPT0gbmV3QWN0aXZlWm9uZUlkKSB7XG4gICAgICBpZiAobmV3QWN0aXZlWm9uZUlkICE9PSAwKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG5ld0FjdGl2ZVpvbmVJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5TZWxlY3RlZCk7XG4gICAgICB9XG4gICAgICBpZiAob2xkQWN0aXZlWm9uZUlkICE9PSAwKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZEFjdGl2ZVpvbmVJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5EZXNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVja2luZyBpZiBzd2l0Y2hlZCB0byBhbm90aGVyIGRhc2hib2FyZFxuICAgIGlmIChuZXdBY3RpdmVEYXNoYm9hcmROYW1lICYmIG9sZEFjdGl2ZURhc2hib2FyZE5hbWUgIT09IG5ld0FjdGl2ZURhc2hib2FyZE5hbWUpIHtcbiAgICAgIHRoaXMuYWRkQ2hhbmdlKDAsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuRGFzaGJvYXJkQ2hhbmdlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHpvbmVDaGFuZ2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDaGFuZ2Uoem9uZUlkOiBudW1iZXIsIHpvbmVDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzLCBjaGFuZ2U6IERhc2hib2FyZExheW91dENoYW5nZSk6IHZvaWQge1xuICAgIGlmICghem9uZUNoYW5nZXMuaGFzKHpvbmVJZCkpIHtcbiAgICAgIHpvbmVDaGFuZ2VzLnNldCh6b25lSWQsIFtdKTtcbiAgICB9XG5cbiAgICB6b25lQ2hhbmdlcy5nZXQoem9uZUlkKSEucHVzaChjaGFuZ2UpO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVEYXNoYm9hcmRPYmplY3RzQXN5bmMoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB6b25lU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxab25lU2VydmljZT4oU2VydmljZU5hbWVzLlpvbmUpO1xuXG4gICAgcmV0dXJuIHpvbmVTZXJ2aWNlLm1vdmVBbmRSZXNpemVBc3luYygvKkRhc2hib2FyZCBOYW1lKi8gdGhpcy5uYW1lLCB0aGlzLnpvbmVNYXAsIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5KTtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBbmltYXRpb25Bc3luYyhyZXBsYXlTcGVlZDogQ29udHJhY3QuUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYW5pbWF0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxBbmltYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQW5pbWF0aW9uKTtcblxuICAgIHJldHVybiBhbmltYXRpb25TZXJ2aWNlLnJlcGxheUFzeW5jKHJlcGxheVNwZWVkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldE9yRW1iZWRkZWRJbkFjdGl2ZVN0b3J5UG9pbnQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RGFzaGJvYXJkRmlsdGVyc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZT4odXBkYXRlVHlwZSwgQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSwgJ0ZpbHRlclVwZGF0ZVR5cGUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ3ZhbHVlcyBwYXJhbWV0ZXIgZm9yIGFwcGx5RGFzaGJvYXJkRmlsdGVyQXN5bmMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0T3JFbWJlZGRlZEluQWN0aXZlU3RvcnlQb2ludCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBseURhc2hib2FyZEZpbHRlckFzeW5jKGZpZWxkTmFtZSwgdmFsdWVzLCB1cGRhdGVUeXBlLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIEBXLTEyOTg2NDM5OiByZW1vdmUgb25jZSBpbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMgaXMgbW92ZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGlzIGNsYXNzXG4gIC8vIFRoaXMgbWV0aG9kIG9ubHkgZXhpc3RzIHNpbmNlIHdvcmtzaGVldHNJbXBsIGNhbiBiZSB1bmRlZmluZWQsIGJ1dCB3ZSBuZWVkIHRoZSB3b3Jrc2hlZXQgbmFtZXMgaW4gdGhlIEV4cG9ydCBBUElzXG4gIHB1YmxpYyBnZXRXb3Jrc2hlZXROYW1lc0Zyb21ab25lcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBjb25zdCB3b3Jrc2hlZXROYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHpvbmUgb2YgdGhpcy5fem9uZXMpIHtcbiAgICAgIGlmICh6b25lLnpvbmVUeXBlICE9PSBEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIHpvbmUuc2hlZXRJbmZvIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gaW50ZXJuYWwtY29udHJhY3QgMS42LjBcbiAgICAgIGNvbnN0IHdvcmtzaGVldE5hbWUgPSB6b25lLnNoZWV0SW5mbyA/IHpvbmUuc2hlZXRJbmZvLm5hbWUgOiB6b25lLm5hbWU7XG4gICAgICB3b3Jrc2hlZXROYW1lcy5wdXNoKHdvcmtzaGVldE5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiB3b3Jrc2hlZXROYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgdmVyaWZ5QWN0aXZlU2hlZXRPckVtYmVkZGVkSW5BY3RpdmVTdG9yeVBvaW50KCkge1xuICAgIGNvbnN0IGlzUm9vdEFuZEFjdGl2ZURhc2hib2FyZCA9IHRoaXMuYWN0aXZlO1xuICAgIGNvbnN0IGlzV2l0aGluQWN0aXZlU3RvcnlQb2ludCA9IHRoaXMucGFyZW50U3RvcnlQb2ludCAhPSBudWxsICYmIHRoaXMucGFyZW50U3RvcnlQb2ludC5hY3RpdmU7XG4gICAgaWYgKCFpc1Jvb3RBbmRBY3RpdmVEYXNoYm9hcmQgJiYgIWlzV2l0aGluQWN0aXZlU3RvcnlQb2ludCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLk5vdEFjdGl2ZVNoZWV0LCAnT3BlcmF0aW9uIG5vdCBhbGxvd2VkIG9uIG5vbi1hY3RpdmUgc2hlZXQnKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0Rhc2hib2FyZEltcGwnO1xuaW1wb3J0IHsgV29ya3NoZWV0SW1wbCB9IGZyb20gJy4vV29ya3NoZWV0SW1wbCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRhc2hib2FyZCBvYmplY3RzIC0gdGhlIHpvbmVzIGluIGEgZGFzaGJvYXJkLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkT2JqZWN0SW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9kYXNoYm9hcmRJbXBsOiBEYXNoYm9hcmRJbXBsLFxuICAgIHByaXZhdGUgX3R5cGU6IERhc2hib2FyZE9iamVjdFR5cGUsXG4gICAgcHJpdmF0ZSBfcG9zaXRpb246IENvbnRyYWN0LlBvaW50LFxuICAgIHByaXZhdGUgX3NpemU6IENvbnRyYWN0LlNpemUsXG4gICAgcHJpdmF0ZSBfd29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIF9uYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfaXNGbG9hdGluZzogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pc1Zpc2libGU6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9maWVsZElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZEltcGwoKTogRGFzaGJvYXJkSW1wbCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogRGFzaGJvYXJkT2JqZWN0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvc2l0aW9uKCk6IENvbnRyYWN0LlBvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fcG9zaXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldEltcGwoKTogV29ya3NoZWV0SW1wbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNGbG9hdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNGbG9hdGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1Zpc2libGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDb25uZWN0aW9uU3VtbWFyeSB9IGZyb20gJy4uL0Nvbm5lY3Rpb25TdW1tYXJ5JztcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi4vRmllbGQnO1xuaW1wb3J0IHsgTG9naWNhbFRhYmxlIH0gZnJvbSAnLi4vTG9naWNhbFRhYmxlJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBUYWJsZVN1bW1hcnkgfSBmcm9tICcuLi9UYWJsZVN1bW1hcnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IEZpZWxkSW1wbCB9IGZyb20gJy4vRmllbGRJbXBsJztcblxuZXhwb3J0IGNsYXNzIERhdGFTb3VyY2VJbXBsIHtcbiAgcHJpdmF0ZSBfZmllbGRzOiBBcnJheTxGaWVsZD47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2RhdGFTb3VyY2VJbmZvOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFTb3VyY2UsIHByaXZhdGUgX3JlZ2lzdHJ5SWQ6IG51bWJlcikge1xuICAgIHRoaXMuX2ZpZWxkcyA9IF9kYXRhU291cmNlSW5mby5maWVsZHMubWFwKChmaWVsZE1vZGVsKSA9PiB7XG4gICAgICBjb25zdCBmaWVsZEltcGwgPSBuZXcgRmllbGRJbXBsKGZpZWxkTW9kZWwsIHRoaXMpO1xuICAgICAgcmV0dXJuIG5ldyBGaWVsZChmaWVsZEltcGwpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbmZvLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbmZvLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBleHRyYWN0VXBkYXRlVGltZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5leHRyYWN0VXBkYXRlVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRzKCk6IEFycmF5PENvbnRyYWN0LkZpZWxkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeHRyYWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5pc0V4dHJhY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUHVibGlzaGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5pc1B1Ymxpc2hlZDtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoZWRVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8ucHVibGlzaGVkVXJsO1xuICB9XG5cbiAgcHVibGljIGdldE1heFBhZ2VSb3dMaW1pdCgpOiBudW1iZXIge1xuICAgIHJldHVybiAxMDAwMDtcbiAgfVxuXG4gIHB1YmxpYyByZWZyZXNoQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZGF0YVNvdXJjZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gZGF0YVNvdXJjZVNlcnZpY2UucmVmcmVzaEFzeW5jKHRoaXMuX2RhdGFTb3VyY2VJbmZvLmlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeVtdPiB7XG4gICAgY29uc3QgZGF0YVNvdXJjZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gZGF0YVNvdXJjZVNlcnZpY2UuZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKHRoaXMuX2RhdGFTb3VyY2VJbmZvLmlkKS50aGVuPENvbnRyYWN0LkNvbm5lY3Rpb25TdW1tYXJ5W10+KChzdW1tYXJpZXMpID0+IHtcbiAgICAgIHJldHVybiBzdW1tYXJpZXMubWFwKChzdW1tYXJ5KSA9PiBuZXcgQ29ubmVjdGlvblN1bW1hcnkoc3VtbWFyeSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEFjdGl2ZVRhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuVGFibGVTdW1tYXJ5Pj4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLmdldEFjdGl2ZVRhYmxlc0FzeW5jKHRoaXMuX2RhdGFTb3VyY2VJbmZvLmlkKS50aGVuPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+KCh0YWJsZUluZm9zKSA9PiB7XG4gICAgICByZXR1cm4gdGFibGVJbmZvcy5tYXAoKHRhYmxlSW5mbykgPT4gbmV3IFRhYmxlU3VtbWFyeSh0YWJsZUluZm8pKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBnZXREYXRhU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIGdldERhdGFTZXJ2aWNlLmdldERhdGFTb3VyY2VEYXRhQXN5bmMoXG4gICAgICB0aGlzLmlkLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCwgLy8gMCBhbmQgW10gYXJlIGRlZmF1bHRzXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGUgfHwgW10sXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkIHx8IFtdLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMobG9naWNhbFRhYmxlSWQ6IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkRhdGFTb3VyY2VVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnN0IGdldERhdGFTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gZ2V0RGF0YVNlcnZpY2UuZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgIGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICBvcHRpb25zLm1heFJvd3MgfHwgMCwgLy8gMCBhbmQgW10gYXJlIGRlZmF1bHRzXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGUgfHwgW10sXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkIHx8IFtdLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ/OiBudW1iZXIsXG4gICAgb3B0aW9ucz86IENvbnRyYWN0LkRhdGFTb3VyY2VVbmRlcmx5aW5nRGF0YU9wdGlvbnMsXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgY29uc3QgZ2V0RGF0YVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBnZXREYXRhU2VydmljZS5nZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgICB0aGlzLmlkLFxuICAgICAgbG9naWNhbFRhYmxlSWQsXG4gICAgICBwYWdlUm93Q291bnQgfHwgdGhpcy5nZXRNYXhQYWdlUm93TGltaXQoKSxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKGRhdGFTb3VyY2U6IENvbnRyYWN0LkRhdGFTb3VyY2UpOiB2b2lkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5SW50ZXJuYWxWYWx1ZShkYXRhU291cmNlLCAnZGF0YVNvdXJjZScpO1xuXG4gICAgdGhpcy5fZmllbGRzID0gdGhpcy5fZGF0YVNvdXJjZUluZm8uZmllbGRzLm1hcCgoZmllbGRNb2RlbCkgPT4ge1xuICAgICAgY29uc3QgZmllbGRJbXBsID0gbmV3IEZpZWxkSW1wbChmaWVsZE1vZGVsLCBkYXRhU291cmNlKTtcbiAgICAgIHJldHVybiBuZXcgRmllbGQoZmllbGRJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgY29uc3QgZGF0YVNvdXJjZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gZGF0YVNvdXJjZVNlcnZpY2UuZ2V0TG9naWNhbFRhYmxlc0FzeW5jKHRoaXMuaWQpLnRoZW48QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4oKGxvZ2ljYWxUYWJsZUluZm9zKSA9PiB7XG4gICAgICByZXR1cm4gbG9naWNhbFRhYmxlSW5mb3MubWFwKChsb2dpY2FsVGFibGVJbmZvKSA9PiBuZXcgTG9naWNhbFRhYmxlKGxvZ2ljYWxUYWJsZUluZm8pKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuXG5leHBvcnQgY2xhc3MgRmllbGRJbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2ZpZWxkSW5mbzogSW50ZXJuYWxDb250cmFjdC5GaWVsZCwgcHJpdmF0ZSBfcGFyZW50RGF0YVNvdXJjZT86IENvbnRyYWN0LkRhdGFTb3VyY2UpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRlc2NyaXB0aW9uKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5kZXNjcmlwdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogQ29udHJhY3QuRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uZGF0YVR5cGUgPz8gQ29udHJhY3QuRGF0YVR5cGUuVW5rbm93bjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWdncmVnYXRpb24oKTogQ29udHJhY3QuRmllbGRBZ2dyZWdhdGlvblR5cGUge1xuICAgIHJldHVybiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZmllbGRBZ2dyZWdhdGlvblR5cGUuY29udmVydCh0aGlzLl9maWVsZEluZm8uYWdncmVnYXRpb24pO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhU291cmNlKCk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIGlmICghdGhpcy5fcGFyZW50RGF0YVNvdXJjZSlcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERhdGEgc291cmNlIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgZmllbGQuIFBsZWFzZSB1c2UgZ2V0RmllbGRBc3luYyBtZXRob2QgdG8gZ2V0IGZpZWxkJ3MgZGF0YSBzb3VyY2UgaW5mb3JtYXRpb25gLFxuICAgICAgKTtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGF0YVNvdXJjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcm9sZSgpOiBDb250cmFjdC5GaWVsZFJvbGVUeXBlIHtcbiAgICByZXR1cm4gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmZpZWxkUm9sZVR5cGUuY29udmVydCh0aGlzLl9maWVsZEluZm8ucm9sZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNvbHVtblR5cGUoKTogQ29udHJhY3QuQ29sdW1uVHlwZSB7XG4gICAgbGV0IGRlZmluZWRWYWx1ZTogSW50ZXJuYWxDb250cmFjdC5Db2x1bW5UeXBlID0gdGhpcy5fZmllbGRJbmZvLmNvbHVtblR5cGUgfHwgSW50ZXJuYWxDb250cmFjdC5Db2x1bW5UeXBlLlVua25vd247XG4gICAgcmV0dXJuIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5jb2x1bW5UeXBlLmNvbnZlcnQoZGVmaW5lZFZhbHVlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNDYWxjdWxhdGVkRmllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0NhbGN1bGF0ZWRGaWVsZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNDb21iaW5lZEZpZWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNDb21iaW5lZEZpZWxkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0dlbmVyYXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlzR2VuZXJhdGVkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0dlb3NwYXRpYWwoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0dlb3NwYXRpYWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzSGlkZGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNIaWRkZW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUHJlc2VudE9uUHVibGlzaGVkRGF0YXNvdXJjZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlzUHJlc2VudE9uUHVibGlzaGVkRGF0YXNvdXJjZTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhdGFUeXBlLCBQYXJhbWV0ZXJWYWx1ZVR5cGUsIFBlcmlvZFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IERhdGFWYWx1ZSB9IGZyb20gJy4uL01vZGVscy9HZXREYXRhTW9kZWxzJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRGF0YVZhbHVlRmFjdG9yeSB9IGZyb20gJy4uL1V0aWxzL0RhdGFWYWx1ZUZhY3RvcnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vVXRpbHMvUGFyYW0nO1xuXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVySW1wbCB7XG4gIHByaXZhdGUgX2FsbG93YWJsZVZhbHVlczogQ29udHJhY3QuUGFyYW1ldGVyRG9tYWluUmVzdHJpY3Rpb247XG4gIHByaXZhdGUgX2dsb2JhbEZpZWxkTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIF9wYXJhbWV0ZXJJbmZvOiBQYXJhbWV0ZXJJbmZvO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbWV0ZXJJbmZvOiBQYXJhbWV0ZXJJbmZvLCBwcml2YXRlIF9yZWdpc3RyeUlkOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldFBhcmFtZXRlckluZm8ocGFyYW1ldGVySW5mbyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyYW1ldGVySW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBjdXJyZW50VmFsdWUoKTogRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlUGFyYW1ldGVyRGF0YVZhbHVlKHRoaXMuX3BhcmFtZXRlckluZm8uY3VycmVudFZhbHVlLCB0aGlzLl9wYXJhbWV0ZXJJbmZvLmRhdGFUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogRGF0YVR5cGUge1xuICAgIHJldHVybiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZGF0YVR5cGUuY29udmVydCh0aGlzLl9wYXJhbWV0ZXJJbmZvLmRhdGFUeXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZ2xvYmFsRmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBhbGxvd2FibGVWYWx1ZXMoKTogQ29udHJhY3QuUGFyYW1ldGVyRG9tYWluUmVzdHJpY3Rpb24ge1xuICAgIHJldHVybiB0aGlzLl9hbGxvd2FibGVWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlVmFsdWVBc3luYyhuZXdWYWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IERhdGUpOiBQcm9taXNlPERhdGFWYWx1ZT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIobmV3VmFsdWUsICduZXdWYWx1ZScpO1xuXG4gICAgY29uc3QgY29lcmNlZFZhbHVlID0gUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUobmV3VmFsdWUpO1xuICAgIGNvbnN0IHBhcmFtZXRlcnNTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFBhcmFtZXRlcnNTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuUGFyYW1ldGVycyk7XG4gICAgcmV0dXJuIHBhcmFtZXRlcnNTZXJ2aWNlLmNoYW5nZVBhcmFtZXRlclZhbHVlQXN5bmModGhpcy5fZ2xvYmFsRmllbGROYW1lLCBjb2VyY2VkVmFsdWUpLnRoZW4oKHBhcmFtZXRlckluZm8pID0+IHtcbiAgICAgIHRoaXMuc2V0UGFyYW1ldGVySW5mbyhwYXJhbWV0ZXJJbmZvKTtcbiAgICAgIHJldHVybiB0aGlzLmN1cnJlbnRWYWx1ZTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0UGFyYW1ldGVySW5mbyhwYXJhbWV0ZXJJbmZvOiBQYXJhbWV0ZXJJbmZvKTogdm9pZCB7XG4gICAgdGhpcy5fcGFyYW1ldGVySW5mbyA9IHBhcmFtZXRlckluZm87XG4gICAgdGhpcy5fZ2xvYmFsRmllbGROYW1lID0gcGFyYW1ldGVySW5mby5maWVsZE5hbWU7XG5cbiAgICBjb25zdCB0eXBlID0gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmFsbG93YWJsZVZhbHVlcy5jb252ZXJ0KHBhcmFtZXRlckluZm8uYWxsb3dhYmxlVmFsdWVzVHlwZSk7XG4gICAgbGV0IGxpc3RWYWx1ZXM6IEFycmF5PERhdGFWYWx1ZT4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IG1pblZhbHVlOiBEYXRhVmFsdWUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IG1heFZhbHVlOiBEYXRhVmFsdWUgfCB1bmRlZmluZWQ7XG4gICAgbGV0IHN0ZXBTaXplOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgbGV0IGRhdGVTdGVwUGVyaW9kOiBQZXJpb2RUeXBlIHwgdW5kZWZpbmVkO1xuXG4gICAgaWYgKHR5cGUgPT09IFBhcmFtZXRlclZhbHVlVHlwZS5MaXN0KSB7XG4gICAgICBjb25zdCB2YWx1ZXMgPSBwYXJhbWV0ZXJJbmZvLmFsbG93YWJsZVZhbHVlcyB8fCBbXTtcbiAgICAgIGxpc3RWYWx1ZXMgPSB2YWx1ZXMubWFwKCh2YWwpID0+IERhdGFWYWx1ZUZhY3RvcnkuTWFrZVBhcmFtZXRlckRhdGFWYWx1ZSh2YWwsIHBhcmFtZXRlckluZm8uZGF0YVR5cGUpKTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09IFBhcmFtZXRlclZhbHVlVHlwZS5SYW5nZSkge1xuICAgICAgbWluVmFsdWUgPSBwYXJhbWV0ZXJJbmZvLm1pblZhbHVlICYmIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVBhcmFtZXRlckRhdGFWYWx1ZShwYXJhbWV0ZXJJbmZvLm1pblZhbHVlLCBwYXJhbWV0ZXJJbmZvLmRhdGFUeXBlKTtcbiAgICAgIG1heFZhbHVlID0gcGFyYW1ldGVySW5mby5tYXhWYWx1ZSAmJiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUocGFyYW1ldGVySW5mby5tYXhWYWx1ZSwgcGFyYW1ldGVySW5mby5kYXRhVHlwZSk7XG4gICAgICBzdGVwU2l6ZSA9IHBhcmFtZXRlckluZm8uc3RlcFNpemU7XG4gICAgICBkYXRlU3RlcFBlcmlvZCA9IHBhcmFtZXRlckluZm8uZGF0ZVN0ZXBQZXJpb2QgJiYgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmRhdGVTdGVwUGVyaW9kLmNvbnZlcnQocGFyYW1ldGVySW5mby5kYXRlU3RlcFBlcmlvZCk7XG4gICAgfVxuXG4gICAgdGhpcy5fYWxsb3dhYmxlVmFsdWVzID0ge1xuICAgICAgdHlwZTogdHlwZSxcbiAgICAgIGFsbG93YWJsZVZhbHVlczogbGlzdFZhbHVlcyxcbiAgICAgIG1pblZhbHVlOiBtaW5WYWx1ZSxcbiAgICAgIG1heFZhbHVlOiBtYXhWYWx1ZSxcbiAgICAgIHN0ZXBTaXplOiBzdGVwU2l6ZSxcbiAgICAgIGRhdGVTdGVwUGVyaW9kOiBkYXRlU3RlcFBlcmlvZCxcbiAgICB9O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2hlZXRQYXRoIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENsaWVudEluZm9TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvQ2xpZW50SW5mb1NlcnZpY2UnO1xuaW1wb3J0IHsgUGFyYW1ldGVyc1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9QYXJhbWV0ZXJzU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTaXplU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1NpemVTZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuLi9VdGlscy9QYXJhbSc7XG5pbXBvcnQgeyBTaGVldFV0aWxzIH0gZnJvbSAnLi4vVXRpbHMvU2hlZXRVdGlscyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJJbXBsIH0gZnJvbSAnLi9QYXJhbWV0ZXJJbXBsJztcbmltcG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL1NoZWV0SW5mb0ltcGwnO1xuXG5pbnRlcmZhY2UgUGFydGlhbFNoZWV0U2l6ZSB7XG4gIC8qKlxuICAgKiBDb250YWlucyBhbiBlbnVtZXJhdGlvbiB2YWx1ZSBvZiBvbmUgb2YgdGhlIGZvbGxvd2luZzogQVVUT01BVElDLCBFWEFDVExZLCBSQU5HRSwgQVRMRUFTVCwgYW5kIEFUTU9TVC5cbiAgICovXG4gIHJlYWRvbmx5IGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvcjtcblxuICAvKipcbiAgICogIFRoaXMgaXMgb25seSBkZWZpbmVkIHdoZW4gYmVoYXZpb3IgaXMgRVhBQ1RMWSwgUkFOR0UsIG9yIEFUTEVBU1QuXG4gICAqL1xuICByZWFkb25seSBtaW5TaXplPzogUGFydGlhbDxDb250cmFjdC5TaXplPjtcblxuICAvKipcbiAgICogIFRoaXMgaXMgb25seSBkZWZpbmVkIHdoZW4gYmVoYXZpb3IgaXMgRVhBQ1RMWSwgUkFOR0Ugb3IgQVRNT1NULlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4U2l6ZT86IFBhcnRpYWw8Q29udHJhY3QuU2l6ZT47XG59XG5cbmV4cG9ydCBjbGFzcyBTaGVldEltcGwge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIF9zaGVldEluZm9JbXBsOiBTaGVldEluZm9JbXBsLCBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ6IG51bWJlcikge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFR5cGUoKTogQ29udHJhY3QuU2hlZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0UGF0aCgpOiBTaGVldFBhdGgge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLnNoZWV0UGF0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHwgQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFNpemU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhpZGRlbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pc0hpZGRlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5pc0hpZGRlbjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBpc0hpZGRlbiBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9zaGVldEluZm9JbXBsLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLmlzQWN0aXZlO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYGFjdGl2ZSBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYWN0aXZlKGFjdGl2ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLl9zaGVldEluZm9JbXBsLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3NoZWV0SW5mb0ltcGwuYWN0aXZlID0gYWN0aXZlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5pbmRleDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBpbmRleCBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuX3NoZWV0SW5mb0ltcGwudXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLnVybDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGB1cmwgbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwcml2YXRlIGdldFNoZWV0U2l6ZSgpOiBDb250cmFjdC5TaGVldFNpemUge1xuICAgIGlmICghU2hlZXRVdGlscy5pc1ZhbGlkU2hlZXRTaXplKHRoaXMuc2l6ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnc2l6ZSBpcyBub3Qgb2YgdHlwZSBTaGVldFNpemUnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zaXplO1xuICB9XG5cbiAgcHVibGljIGZpbmRQYXJhbWV0ZXJBc3luYyhwYXJhbWV0ZXJOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFBhcmFtZXRlckltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUsICdwYXJhbWV0ZXJOYW1lJyk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFBhcmFtZXRlcnNTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuUGFyYW1ldGVycyk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZmluZFBhcmFtZXRlckJ5TmFtZUFzeW5jKHBhcmFtZXRlck5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmFtZXRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PFBhcmFtZXRlckltcGw+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jKHRoaXMuc2hlZXRQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VTaXplQXN5bmMobmV3U2l6ZTogQ29udHJhY3QuU2hlZXRTaXplKTogUHJvbWlzZTxDb250cmFjdC5TaGVldFNpemU+IHtcbiAgICBjb25zdCBpbnZhbGlkU2l6ZUVycm9yID0gbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnSW52YWxpZCBzaGVldCBzaXplIHBhcmFtZXRlcicpO1xuICAgIGlmICghbmV3U2l6ZSB8fCAhbmV3U2l6ZS5iZWhhdmlvcikge1xuICAgICAgdGhyb3cgaW52YWxpZFNpemVFcnJvcjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aWFsU2hlZXRTaXplID0gdGhpcy5ub3JtYWxpemVTaGVldFNpemUobmV3U2l6ZSk7XG5cbiAgICBjb25zdCBpc0F1dG9tYXRpYyA9IHBhcnRpYWxTaGVldFNpemUuYmVoYXZpb3IgPT09IENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkF1dG9tYXRpYztcbiAgICBpZiAoIWlzQXV0b21hdGljICYmICFwYXJ0aWFsU2hlZXRTaXplLm1pblNpemUgJiYgIXBhcnRpYWxTaGVldFNpemUubWF4U2l6ZSkge1xuICAgICAgdGhyb3cgaW52YWxpZFNpemVFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQXV0b21hdGljICYmIHRoaXMuc2hlZXRUeXBlID09PSBDb250cmFjdC5TaGVldFR5cGUuV29ya3NoZWV0KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplQmVoYXZpb3JPbldvcmtzaGVldCxcbiAgICAgICAgJ09ubHkgU2hlZXRTaXplQmVoYXZpb3IuQXV0b21hdGljIGlzIGFsbG93ZWQgb24gV29ya3NoZWV0cycsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpc0F1dG9tYXRpYyAmJiB0aGlzLmdldFNoZWV0U2l6ZSgpLmJlaGF2aW9yID09PSBwYXJ0aWFsU2hlZXRTaXplLmJlaGF2aW9yKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ld1NpemUpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2Nlc3NlZE5ld1NpemUgPSB0aGlzLnByb2Nlc3NOZXdTaXplKHBhcnRpYWxTaGVldFNpemUpO1xuXG4gICAgY29uc3Qgc2l6ZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2l6ZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TaXplKTtcbiAgICByZXR1cm4gc2l6ZVNlcnZpY2UuY2hhbmdlU2l6ZUFzeW5jKHRoaXMubmFtZSwgcHJvY2Vzc2VkTmV3U2l6ZSkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBjbGllbnRJbmZvU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxDbGllbnRJbmZvU2VydmljZT4oU2VydmljZU5hbWVzLkNsaWVudEluZm8pO1xuXG4gICAgICByZXR1cm4gY2xpZW50SW5mb1NlcnZpY2UuZ2V0Q2xpZW50SW5mb0FzeW5jKCkudGhlbigoYm9vdHN0cmFwSW5mbykgPT4ge1xuICAgICAgICBjb25zdCBzaGVldCA9IGJvb3RzdHJhcEluZm8ucHVibGlzaGVkU2hlZXRzLmZpbmQoKHMpID0+IHMubmFtZSA9PT0gdGhpcy5uYW1lKTtcbiAgICAgICAgaWYgKCFzaGVldCkge1xuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgQ2FuJ3QgZmluZCBzaGVldCB3aXRoIG5hbWUgJHt0aGlzLm5hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaGVldFNpemUgPSBTaGVldFV0aWxzLmdldFNoZWV0U2l6ZUZyb21TaXplQ29uc3RyYWludHMoc2hlZXQuc2l6ZUNvbnN0cmFpbnQpO1xuICAgICAgICB0aGlzLl9zaGVldEluZm9JbXBsLnNoZWV0U2l6ZSA9IHNoZWV0U2l6ZTtcblxuICAgICAgICByZXR1cm4gc2hlZXRTaXplO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVNoZWV0U2l6ZShuZXdTaXplOiBDb250cmFjdC5TaGVldFNpemUpOiBQYXJ0aWFsU2hlZXRTaXplIHtcbiAgICBjb25zdCB7IGJlaGF2aW9yIH0gPSBuZXdTaXplO1xuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxDb250cmFjdC5TaGVldFNpemVCZWhhdmlvcj4oYmVoYXZpb3IsIENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLCAnU2hlZXRTaXplQmVoYXZpb3InKTtcblxuICAgIGNvbnN0IG1pblNpemUgPSBTaGVldEltcGwucGFyc2VEaW1lbnNpb25zKG5ld1NpemUubWluU2l6ZSk7XG4gICAgY29uc3QgbWF4U2l6ZSA9IFNoZWV0SW1wbC5wYXJzZURpbWVuc2lvbnMobmV3U2l6ZS5tYXhTaXplKTtcblxuICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplIH07XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NOZXdTaXplKG5ld1NpemU6IFBhcnRpYWxTaGVldFNpemUpOiBDb250cmFjdC5TaGVldFNpemUge1xuICAgIGNvbnN0IHsgYmVoYXZpb3IsIG1pblNpemU6IG1pblNpemVNYXliZSwgbWF4U2l6ZTogbWF4U2l6ZU1heWJlIH0gPSBuZXdTaXplO1xuXG4gICAgY29uc3QgaGFzTWluV2lkdGggPSAhUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQobWluU2l6ZU1heWJlPy53aWR0aCk7XG4gICAgY29uc3QgaGFzTWluSGVpZ2h0ID0gIVBhcmFtLmlzTnVsbE9yVW5kZWZpbmVkKG1pblNpemVNYXliZT8uaGVpZ2h0KTtcbiAgICBjb25zdCBoYXNNYXhXaWR0aCA9ICFQYXJhbS5pc051bGxPclVuZGVmaW5lZChtYXhTaXplTWF5YmU/LndpZHRoKTtcbiAgICBjb25zdCBoYXNNYXhIZWlnaHQgPSAhUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQobWF4U2l6ZU1heWJlPy5oZWlnaHQpO1xuICAgIGNvbnN0IGhhc1ZhbGlkTWluU2l6ZSA9IGhhc01pbldpZHRoICYmIGhhc01pbkhlaWdodDtcbiAgICBjb25zdCBoYXNWYWxpZE1heFNpemUgPSBoYXNNYXhXaWR0aCAmJiBoYXNNYXhIZWlnaHQ7XG5cbiAgICBzd2l0Y2ggKGJlaGF2aW9yKSB7XG4gICAgICBjYXNlIENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkF1dG9tYXRpYzoge1xuICAgICAgICByZXR1cm4geyBiZWhhdmlvciB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlIENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkF0TW9zdDoge1xuICAgICAgICBpZiAoIW1heFNpemVNYXliZSB8fCAhaGFzVmFsaWRNYXhTaXplKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLk1pc3NpbmdNYXhTaXplLCAnTWlzc2luZyBtYXhTaXplIGZvciBTaGVldFNpemVCZWhhdmlvci5BdE1vc3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgIGlmIChtYXhTaXplLndpZHRoIDwgMCB8fCBtYXhTaXplLmhlaWdodCA8IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZFNpemUsICdTaXplIHZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgYmVoYXZpb3IsIG1heFNpemUgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdExlYXN0OiB7XG4gICAgICAgIGlmICghbWluU2l6ZU1heWJlIHx8ICFoYXNWYWxpZE1pblNpemUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuTWlzc2luZ01pblNpemUsICdNaXNzaW5nIG1pblNpemUgZm9yIFNoZWV0U2l6ZUJlaGF2aW9yLkF0TGVhc3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1pblNpemUgPSB7IHdpZHRoOiBtaW5TaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1pblNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgIGlmIChtaW5TaXplLndpZHRoIDwgMCB8fCBtaW5TaXplLmhlaWdodCA8IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZFNpemUsICdTaXplIHZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgYmVoYXZpb3IsIG1pblNpemUgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5SYW5nZToge1xuICAgICAgICBpZiAoIW1pblNpemVNYXliZSB8fCAhbWF4U2l6ZU1heWJlIHx8ICFoYXNWYWxpZE1pblNpemUgfHwgIWhhc1ZhbGlkTWF4U2l6ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5NaXNzaW5nTWluTWF4U2l6ZSwgJ01pc3NpbmcgbWluU2l6ZSBvciBtYXhTaXplIGZvciBTaGVldFNpemVCZWhhdmlvci5SYW5nZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWluU2l6ZSA9IHsgd2lkdGg6IG1pblNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWluU2l6ZU1heWJlLmhlaWdodCEgfTtcbiAgICAgICAgY29uc3QgbWF4U2l6ZSA9IHsgd2lkdGg6IG1heFNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWF4U2l6ZU1heWJlLmhlaWdodCEgfTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgbWluU2l6ZS53aWR0aCA8IDAgfHxcbiAgICAgICAgICBtaW5TaXplLmhlaWdodCA8IDAgfHxcbiAgICAgICAgICBtYXhTaXplLndpZHRoIDwgMCB8fFxuICAgICAgICAgIG1heFNpemUuaGVpZ2h0IDwgMCB8fFxuICAgICAgICAgIG1pblNpemUud2lkdGggPiBtYXhTaXplLndpZHRoIHx8XG4gICAgICAgICAgbWluU2l6ZS5oZWlnaHQgPiBtYXhTaXplLmhlaWdodFxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZFNpemUsICdNaXNzaW5nIG1pblNpemUgb3IgbWF4U2l6ZSBmb3IgU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuRXhhY3RseToge1xuICAgICAgICBpZiAobWluU2l6ZU1heWJlICYmIG1heFNpemVNYXliZSkge1xuICAgICAgICAgIGlmIChoYXNWYWxpZE1pblNpemUgJiYgaGFzVmFsaWRNYXhTaXplKSB7XG4gICAgICAgICAgICBjb25zdCBtaW5TaXplID0geyB3aWR0aDogbWluU2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtaW5TaXplTWF5YmUuaGVpZ2h0ISB9O1xuICAgICAgICAgICAgY29uc3QgbWF4U2l6ZSA9IHsgd2lkdGg6IG1heFNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWF4U2l6ZU1heWJlLmhlaWdodCEgfTtcblxuICAgICAgICAgICAgaWYgKG1pblNpemUud2lkdGggIT09IG1heFNpemUud2lkdGggfHwgbWluU2l6ZS5oZWlnaHQgIT09IG1heFNpemUuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZSwgJ0NvbmZsaWN0aW5nIHNpemUgdmFsdWVzIGZvciBTaGVldFNpemVCZWhhdmlvci5FeGFjdGx5Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc1ZhbGlkTWluU2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgbWluU2l6ZSA9IHsgd2lkdGg6IG1pblNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWluU2l6ZU1heWJlLmhlaWdodCEgfTtcbiAgICAgICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplOiBtaW5TaXplIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc1ZhbGlkTWF4U2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgbWF4U2l6ZSA9IHsgd2lkdGg6IG1heFNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWF4U2l6ZU1heWJlLmhlaWdodCEgfTtcbiAgICAgICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplOiBtYXhTaXplLCBtYXhTaXplIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnSW52YWxpZCBzaGVldCBzaXplIHBhcmFtZXRlcicpO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgVW5zdXBwb3J0ZWQgc2hlZXQgc2l6ZSBiZWhhdmlvcjogJHtiZWhhdmlvcn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZURpbWVuc2lvbnMgPSAoc2l6ZTogQ29udHJhY3QuU2l6ZSB8IHVuZGVmaW5lZCk6IFBhcnRpYWw8Q29udHJhY3QuU2l6ZT4gPT4ge1xuICAgIGNvbnN0IGVtcHR5ID0geyB3aWR0aDogdW5kZWZpbmVkLCBoZWlnaHQ6IHVuZGVmaW5lZCB9O1xuXG4gICAgaWYgKCFzaXplKSB7XG4gICAgICByZXR1cm4gZW1wdHk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBzdWNjZXNzOiB3aWR0aFBhcnNlZCwgcGFyc2VkOiBwYXJzZWRXaWR0aCB9ID0gUGFyYW0udHJ5UGFyc2VOdW1iZXIoc2l6ZS53aWR0aCk7XG4gICAgY29uc3QgeyBzdWNjZXNzOiBoZWlnaHRQYXJzZWQsIHBhcnNlZDogcGFyc2VkSGVpZ2h0IH0gPSBQYXJhbS50cnlQYXJzZU51bWJlcihzaXplLmhlaWdodCk7XG5cbiAgICBpZiAod2lkdGhQYXJzZWQgJiYgaGVpZ2h0UGFyc2VkKSB7XG4gICAgICByZXR1cm4geyB3aWR0aDogcGFyc2VkV2lkdGghLCBoZWlnaHQ6IHBhcnNlZEhlaWdodCEgfTtcbiAgICB9XG5cbiAgICBpZiAod2lkdGhQYXJzZWQpIHtcbiAgICAgIHJldHVybiB7IHdpZHRoOiBwYXJzZWRXaWR0aCEgfTtcbiAgICB9XG5cbiAgICBpZiAoaGVpZ2h0UGFyc2VkKSB7XG4gICAgICByZXR1cm4geyBoZWlnaHQ6IHBhcnNlZEhlaWdodCEgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW1wdHk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBTaGVldFNpemUgYXMgRW1iZWRkaW5nU2hlZXRTaXplLCBTaXplIGFzIEV4dGVuc2lvblNoZWV0U2l6ZSwgU2hlZXRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNoZWV0UGF0aCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBTaGVldEluZm9JbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX25hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9zaGVldFR5cGU6IFNoZWV0VHlwZSxcbiAgICBwcml2YXRlIF9zaGVldFNpemU6IEV4dGVuc2lvblNoZWV0U2l6ZSB8IEVtYmVkZGluZ1NoZWV0U2l6ZSxcbiAgICBwcml2YXRlIF9pbmRleD86IG51bWJlcixcbiAgICBwcml2YXRlIF9pc0FjdGl2ZT86IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNIaWRkZW4/OiBib29sZWFuLFxuICAgIHByaXZhdGUgX3VybD86IHN0cmluZyxcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIHNldCBuYW1lKHNoZWV0TmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbmFtZSA9IHNoZWV0TmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRTaXplKCk6IEV4dGVuc2lvblNoZWV0U2l6ZSB8IEVtYmVkZGluZ1NoZWV0U2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0U2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2hlZXRTaXplKHZhbHVlOiBFeHRlbnNpb25TaGVldFNpemUgfCBFbWJlZGRpbmdTaGVldFNpemUpIHtcbiAgICB0aGlzLl9zaGVldFNpemUgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRUeXBlKCk6IFNoZWV0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRQYXRoKCk6IFNoZWV0UGF0aCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNoZWV0TmFtZTogdGhpcy5uYW1lLFxuICAgICAgaXNEYXNoYm9hcmQ6IHRoaXMuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuRGFzaGJvYXJkLFxuICAgICAgLy8gVE9ETyAtIFN0b3JpZXNcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBY3RpdmUoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQWN0aXZlO1xuICB9XG5cbiAgcHVibGljIHNldCBhY3RpdmUoYWN0aXZlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNBY3RpdmUgPSBhY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzSGlkZGVuKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi4vU2luZ2xlRXZlbnRNYW5hZ2VyJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFNpbmdsZUV2ZW50TWFuYWdlciBpbnRlcmZhY2UgZm9yIGEgc2luZ2xlIHR5cGUgb2YgVGFibGVhdSBldmVudFxuICpcbiAqIEB0ZW1wbGF0ZSBURXZlbnRUeXBlIFRoZSBUYWJsZWF1IGV2ZW50IHR5cGUgdGhpcyBjbGFzcyBzcGVjaWFsaXplc1xuICovXG5leHBvcnQgY2xhc3MgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxURXZlbnRUeXBlIGV4dGVuZHMgQ29udHJhY3QuVGFibGVhdUV2ZW50PiBpbXBsZW1lbnRzIFNpbmdsZUV2ZW50TWFuYWdlciB7XG4gIHByaXZhdGUgX2V2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZTtcbiAgcHJpdmF0ZSBfaGFuZGxlcnM6IEFycmF5PChldmVudE9iajogVEV2ZW50VHlwZSkgPT4gdm9pZD47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGV2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZSkge1xuICAgIHRoaXMuX2V2ZW50VHlwZSA9IGV2ZW50VHlwZTtcbiAgICB0aGlzLl9oYW5kbGVycyA9IFtdO1xuICB9XG5cbiAgcHVibGljIGdldCBldmVudFR5cGUoKTogVGFibGVhdUV2ZW50VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFdmVudExpc3RlbmVyKGhhbmRsZXI6IChldmVudE9iajogVEV2ZW50VHlwZSkgPT4gdm9pZCk6IENvbnRyYWN0LlRhYmxlYXVFdmVudFVucmVnaXN0ZXJGbiB7XG4gICAgdGhpcy5faGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUV2ZW50TGlzdGVuZXIoaGFuZGxlcjogKGV2ZW50T2JqOiBURXZlbnRUeXBlKSA9PiB2b2lkKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYmVmb3JlQ291bnQgPSB0aGlzLl9oYW5kbGVycy5sZW5ndGg7XG4gICAgdGhpcy5faGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVycy5maWx0ZXIoKGgpID0+IGggIT09IGhhbmRsZXIpO1xuICAgIHJldHVybiBiZWZvcmVDb3VudCA+IHRoaXMuX2hhbmRsZXJzLmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyB0cmlnZ2VyRXZlbnQoZXZlbnRHZW5lcmF0b3I6ICgpID0+IFRFdmVudFR5cGUpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5faGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGV2ZW50TW9kZWwgPSBldmVudEdlbmVyYXRvcigpO1xuICAgICAgICBoYW5kbGVyKGV2ZW50TW9kZWwpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBTaW5jZSB0aGlzIGhhbmRsZXIgY291bGQgYmUgb3V0c2lkZSBvdXIgY29udHJvbCwganVzdCBjYXRjaCBhbnl0aGluZyBpdCB0aHJvd3MgYW5kIGNvbnRpbnVlIG9uXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNoZWV0SW5mbywgU3RvcnlNb2RlbCwgU3RvcnlQb2ludE1vZGVsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFN0b3J5QWN0aXZhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TdG9yeUFjdGl2YXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgU2hvcnRMaXZlZERlZmVycmVkIH0gZnJvbSAnLi4vVXRpbHMvU2hvcnRMaXZlZERlZmVycmVkJztcbmltcG9ydCB7IFNoZWV0SW1wbCB9IGZyb20gJy4vU2hlZXRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL1NoZWV0SW5mb0ltcGwnO1xuaW1wb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL1N0b3J5UG9pbnRJbXBsJztcbmltcG9ydCB7IFN0b3J5UG9pbnRJbmZvSW1wbCB9IGZyb20gJy4vU3RvcnlQb2ludEluZm9JbXBsJztcblxuZXhwb3J0IGNsYXNzIFN0b3J5SW1wbCBleHRlbmRzIFNoZWV0SW1wbCB7XG4gIHByaXZhdGUgX2FjdGl2ZVN0b3J5UG9pbnRJbXBsOiBTdG9yeVBvaW50SW1wbDtcbiAgcHJpdmF0ZSBfc3RvcnlQb2ludEluZm9JbXBsczogQXJyYXk8U3RvcnlQb2ludEluZm9JbXBsPiA9IFtdO1xuICBwcml2YXRlIF9kZWZlcnJlZDogU2hvcnRMaXZlZERlZmVycmVkPFN0b3J5UG9pbnRJbXBsPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIF9zaGVldEluZm9JbXBsOiBTaGVldEluZm9JbXBsLFxuICAgIHN0b3J5TW9kZWw6IFN0b3J5TW9kZWwsXG4gICAgcHJpdmF0ZSBfcHVibGlzaGVkU2hlZXRJbmZvczogQXJyYXk8U2hlZXRJbmZvPixcbiAgICBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgKSB7XG4gICAgc3VwZXIoX3NoZWV0SW5mb0ltcGwsIF9yZWdpc3RyeUlkKTtcbiAgICB0aGlzLl9kZWZlcnJlZCA9IG5ldyBTaG9ydExpdmVkRGVmZXJyZWQ8U3RvcnlQb2ludEltcGw+KCk7XG4gICAgdGhpcy5pbml0aWFsaXplU3Rvcnkoc3RvcnlNb2RlbCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTdG9yeShzdG9yeU1vZGVsOiBTdG9yeU1vZGVsKSB7XG4gICAgc3RvcnlNb2RlbC5zdG9yeVBvaW50cy5mb3JFYWNoKChzdG9yeVBvaW50TW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gc3RvcnlQb2ludE1vZGVsLmluZGV4ID09PSBzdG9yeU1vZGVsLmFjdGl2ZVN0b3J5UG9pbnRJbmRleDtcbiAgICAgIGNvbnN0IHN0b3J5UG9pbnRJbmZvSW1wbCA9IG5ldyBTdG9yeVBvaW50SW5mb0ltcGwoXG4gICAgICAgIHN0b3J5UG9pbnRNb2RlbC5jYXB0aW9uLFxuICAgICAgICBzdG9yeVBvaW50TW9kZWwuaW5kZXgsXG4gICAgICAgIHN0b3J5UG9pbnRNb2RlbC5zdG9yeVBvaW50SWQsXG4gICAgICAgIGlzQWN0aXZlLFxuICAgICAgICBzdG9yeVBvaW50TW9kZWwudXBkYXRlZCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgICB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzLnB1c2goc3RvcnlQb2ludEluZm9JbXBsKTtcblxuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsID0gbmV3IFN0b3J5UG9pbnRJbXBsKFxuICAgICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbCxcbiAgICAgICAgICB0aGlzLl9wdWJsaXNoZWRTaGVldEluZm9zLFxuICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICAgICAgc3RvcnlQb2ludE1vZGVsLmNvbnRhaW5lZFNoZWV0SW5mbyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RvcnlJbmZvKGluZGV4OiBudW1iZXIsIHN0b3J5UG9pbnRNb2RlbDogU3RvcnlQb2ludE1vZGVsKSB7XG4gICAgaWYgKCF0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHN0b3J5SW5mb0ltcGwgPSB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzW2luZGV4XTtcbiAgICBpZiAoc3RvcnlJbmZvSW1wbC5zdG9yeVBvaW50SWQgIT09IHN0b3J5UG9pbnRNb2RlbC5zdG9yeVBvaW50SWQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuU3RvcnlQb2ludElkTWlzbWF0Y2gsXG4gICAgICAgIGBXZSBzaG91bGQgbm90IGJlIHVwZGF0aW5nIGEgc3RvcnkgcG9pbnQgd2hlbiB0aGUgSURzIGRvbid0IG1hdGNoLiBFeGlzdGluZyBzdG9yeVBvaW50SUQ9JHtzdG9yeUluZm9JbXBsLnN0b3J5UG9pbnRJZH0sIG5ld1N0b3J5UG9pbnRJRD0ke3N0b3J5UG9pbnRNb2RlbC5zdG9yeVBvaW50SWR9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHN0b3J5SW5mb0ltcGwuY2FwdGlvbiA9IHN0b3J5UG9pbnRNb2RlbC5jYXB0aW9uO1xuICAgIHN0b3J5SW5mb0ltcGwudXBkYXRlZCA9IHN0b3J5UG9pbnRNb2RlbC51cGRhdGVkO1xuXG4gICAgaWYgKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLnN0b3J5UG9pbnRJZCA9PT0gc3RvcnlQb2ludE1vZGVsLnN0b3J5UG9pbnRJZCkge1xuICAgICAgdGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwudXBkYXRlZCA9IHN0b3J5SW5mb0ltcGwudXBkYXRlZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlU3Rvcnkoc3RvcnlQb2ludE1vZGVsOiBTdG9yeVBvaW50TW9kZWwpIHtcbiAgICBpZiAoIXRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzLmZvckVhY2goKHN0b3J5UG9pbnRJbmZvSW1wbCkgPT4ge1xuICAgICAgY29uc3QgaXNBY3RpdmUgPSBzdG9yeVBvaW50SW5mb0ltcGwuc3RvcnlQb2ludElkID09PSBzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkO1xuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgc3RhdGVcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLmNhcHRpb24gPSBzdG9yeVBvaW50TW9kZWwuY2FwdGlvbjtcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLmluZGV4ID0gc3RvcnlQb2ludE1vZGVsLmluZGV4O1xuICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLnVwZGF0ZWQgPSBzdG9yeVBvaW50TW9kZWwudXBkYXRlZDtcblxuICAgICAgICAvLyByZS1pbml0aWFsaXplIGFjdGl2ZVN0b3J5UG9pbnRJbXBsXG4gICAgICAgIHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsID0gbmV3IFN0b3J5UG9pbnRJbXBsKFxuICAgICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbCxcbiAgICAgICAgICB0aGlzLl9wdWJsaXNoZWRTaGVldEluZm9zLFxuICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICAgICAgc3RvcnlQb2ludE1vZGVsLmNvbnRhaW5lZFNoZWV0SW5mbyxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNldCBvbGQgb25lcyB0byBmYWxzZVxuICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwuYWN0aXZlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5hY3RpdmVTdG9yeVBvaW50KSB7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZXNvbHZlKHRoaXMuYWN0aXZlU3RvcnlQb2ludCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVTdG9yeVBvaW50KCk6IFN0b3J5UG9pbnRJbXBsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0b3J5UG9pbnRzSW5mbygpOiBBcnJheTxTdG9yeVBvaW50SW5mb0ltcGw+IHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuYWN0aXZlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLl9zaGVldEluZm9JbXBsLmlzSGlkZGVuO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlTmV4dFN0b3J5UG9pbnRBc3luYygpOiBQcm9taXNlPFN0b3J5UG9pbnRJbXBsPiB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLmluZGV4ID09PSB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwpO1xuICAgIH1cblxuICAgIGxldCBwcm9taXNlID0gdGhpcy5fZGVmZXJyZWQuZ2V0TmV3UHJvbWlzZU9yVGhyb3dJZkJ1c3koKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U3RvcnlBY3RpdmF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlN0b3J5QWN0aXZhdGlvbik7XG4gICAgc2VydmljZS5hY3RpdmF0ZU5leHRTdG9yeVBvaW50QXN5bmMoKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludEFzeW5jKCk6IFByb21pc2U8U3RvcnlQb2ludEltcGw+IHtcbiAgICBpZiAodGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwuaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwpO1xuICAgIH1cblxuICAgIGxldCBwcm9taXNlID0gdGhpcy5fZGVmZXJyZWQuZ2V0TmV3UHJvbWlzZU9yVGhyb3dJZkJ1c3koKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U3RvcnlBY3RpdmF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlN0b3J5QWN0aXZhdGlvbik7XG4gICAgc2VydmljZS5hY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludEFzeW5jKCk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgYWN0aXZhdGVTdG9yeVBvaW50QXN5bmMoaW5kZXg6IG51bWJlcik6IFByb21pc2U8U3RvcnlQb2ludEltcGw+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGluZGV4LCAnaW5kZXgnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShpbmRleCwgJ251bWJlcicsICdpbmRleCcpO1xuXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkluZGV4T3V0T2ZSYW5nZSwgJ1RoZSBpbmRleCBwYXNzZWQgdG8gdGhpcyBjb21tYW5kIGlzIG91dCBvZiByYW5nZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPT09IHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLmluZGV4KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvbWlzZSA9IHRoaXMuX2RlZmVycmVkLmdldE5ld1Byb21pc2VPclRocm93SWZCdXN5KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFN0b3J5QWN0aXZhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TdG9yeUFjdGl2YXRpb24pO1xuICAgIHNlcnZpY2UuYWN0aXZhdGVTdG9yeVBvaW50QXN5bmMoaW5kZXgpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgcHVibGljIHJldmVydFN0b3J5UG9pbnRBc3luYyhpbmRleDogbnVtYmVyKTogUHJvbWlzZTxTdG9yeVBvaW50SW5mb0ltcGw+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGluZGV4LCAnaW5kZXgnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShpbmRleCwgJ251bWJlcicsICdpbmRleCcpO1xuXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkluZGV4T3V0T2ZSYW5nZSwgJ1RoZSBpbmRleCBwYXNzZWQgdG8gdGhpcyBjb21tYW5kIGlzIG91dCBvZiByYW5nZS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFN0b3J5QWN0aXZhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TdG9yeUFjdGl2YXRpb24pO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UucmV2ZXJ0U3RvcnlQb2ludEFzeW5jKGluZGV4KS50aGVuPFN0b3J5UG9pbnRJbmZvSW1wbD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVN0b3J5SW5mbyhyZXNwb25zZS5pbmRleCwgcmVzcG9uc2UpO1xuICAgICAgY29uc3Qgc3RvcnlQb2ludEluZm9JbXBsID0gbmV3IFN0b3J5UG9pbnRJbmZvSW1wbChcbiAgICAgICAgcmVzcG9uc2UuY2FwdGlvbixcbiAgICAgICAgcmVzcG9uc2UuaW5kZXgsXG4gICAgICAgIHJlc3BvbnNlLnN0b3J5UG9pbnRJZCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHJlc3BvbnNlLnVwZGF0ZWQsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHN0b3J5UG9pbnRJbmZvSW1wbDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclBlbmRpbmdQcm9taXNlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGVmZXJyZWQpIHtcbiAgICAgIHRoaXMuX2RlZmVycmVkLnJlamVjdCgnQWxsIHBlbmRpbmcgcHJvbWlzZXMgY2xlYXJlZCcpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENvbnRhaW5lZFNoZWV0SW5mb01vZGVsLCBTaGVldEluZm8sIFNoZWV0UGF0aCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFNoZWV0VXRpbHMgfSBmcm9tICcuLi9VdGlscy9TaGVldFV0aWxzJztcbmltcG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0Rhc2hib2FyZEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9TaGVldEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5pbXBvcnQgeyBTdG9yeUltcGwgfSBmcm9tICcuL1N0b3J5SW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW5mb0ltcGwgfSBmcm9tICcuL1N0b3J5UG9pbnRJbmZvSW1wbCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRJbXBsIH0gZnJvbSAnLi9Xb3Jrc2hlZXRJbXBsJztcblxuZXhwb3J0IGNsYXNzIFN0b3J5UG9pbnRJbXBsIHtcbiAgcHJpdmF0ZSBfY29udGFpbmVkU2hlZXRJbXBsOiBTaGVldEltcGw7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3N0b3J5UG9pbnRJbmZvSW1wbDogU3RvcnlQb2ludEluZm9JbXBsLFxuICAgIHNoZWV0SW5mb3M6IEFycmF5PFNoZWV0SW5mbz4sXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIGNvbnRhaW5lZFNoZWV0SW5mbz86IENvbnRhaW5lZFNoZWV0SW5mb01vZGVsLFxuICApIHtcbiAgICBpZiAoY29udGFpbmVkU2hlZXRJbmZvKSB7XG4gICAgICB0aGlzLl9jb250YWluZWRTaGVldEltcGwgPSB0aGlzLmNyZWF0ZUNvbnRhaW5lZFNoZWV0KGNvbnRhaW5lZFNoZWV0SW5mbywgc2hlZXRJbmZvcywgcmVnaXN0cnlJZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGwuaW5kZXg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLmNhcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLmFjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXBkYXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLnVwZGF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IHVwZGF0ZWQodXBkYXRlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC51cGRhdGVkID0gdXBkYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50U3RvcnkoKTogU3RvcnlJbXBsIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLnBhcmVudFN0b3J5O1xuICB9XG5cbiAgcHVibGljIGdldCBjb250YWluZWRTaGVldCgpOiBTaGVldEltcGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb250YWluZWRTaGVldEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0b3J5UG9pbnRJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGwuc3RvcnlQb2ludElkO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb250YWluZWRTaGVldChjb250YWluZWRTaGVldEluZm86IENvbnRhaW5lZFNoZWV0SW5mb01vZGVsLCBzaGVldEluZm9zOiBBcnJheTxTaGVldEluZm8+LCByZWdpc3RyeUlkOiBudW1iZXIpOiBTaGVldEltcGwge1xuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0SWR4ID0gLTE7XG5cbiAgICBjb25zdCBwdWJsaXNoZWRTaGVldEluZm8gPSBTaGVldFV0aWxzLmdldFB1Ymxpc2hlZFNoZWV0SW5mb0J5TmFtZShjb250YWluZWRTaGVldEluZm8ubmFtZSwgc2hlZXRJbmZvcyk7XG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRTaXplID0gU2hlZXRVdGlscy5jcmVhdGVBdXRvbWF0aWNTaXplKCk7XG4gICAgY29uc3QgaXNDb250YWluZWRTaGVldEhpZGRlbiA9IHB1Ymxpc2hlZFNoZWV0SW5mbyA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0VXJsID0gcHVibGlzaGVkU2hlZXRJbmZvID8gcHVibGlzaGVkU2hlZXRJbmZvLnVybCA6ICcnO1xuICAgIC8vIENvbnRhaW5lZCBzaGVldHMgYXJlbid0IGFjdGl2ZSAtIHRoZSBjb250YWluaW5nIHNoZWV0IGlzIGFjdGl2ZS5cbiAgICBjb25zdCBjb250YWluZWRTaGVldEFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKFxuICAgICAgY29udGFpbmVkU2hlZXRJbmZvLm5hbWUsXG4gICAgICBTaGVldFV0aWxzLmdldFNoZWV0VHlwZUVudW0oY29udGFpbmVkU2hlZXRJbmZvLnNoZWV0VHlwZSksXG4gICAgICBjb250YWluZWRTaGVldFNpemUsXG4gICAgICBjb250YWluZWRTaGVldElkeCxcbiAgICAgIGNvbnRhaW5lZFNoZWV0QWN0aXZlLFxuICAgICAgaXNDb250YWluZWRTaGVldEhpZGRlbixcbiAgICAgIGNvbnRhaW5lZFNoZWV0VXJsLFxuICAgICk7XG5cbiAgICBsZXQgc2hlZXRJbXBsOiBTaGVldEltcGw7XG4gICAgc3dpdGNoIChjb250YWluZWRTaGVldEluZm9JbXBsLnNoZWV0VHlwZSkge1xuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFR5cGUuV29ya3NoZWV0OiB7XG4gICAgICAgIGNvbnN0IHZpeklkOiBWaXN1YWxJZCA9IHtcbiAgICAgICAgICB3b3Jrc2hlZXQ6IGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwubmFtZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzaGVldEltcGwgPSBuZXcgV29ya3NoZWV0SW1wbChjb250YWluZWRTaGVldEluZm9JbXBsLCByZWdpc3RyeUlkLCB2aXpJZCwgbnVsbCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFR5cGUuRGFzaGJvYXJkOiB7XG4gICAgICAgIGNvbnN0IHNoZWV0UGF0aDogU2hlZXRQYXRoID0ge1xuICAgICAgICAgIHNoZWV0TmFtZTogY29udGFpbmVkU2hlZXRJbmZvSW1wbC5uYW1lLFxuICAgICAgICAgIGlzRGFzaGJvYXJkOiB0cnVlLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNoZWV0SW1wbCA9IG5ldyBEYXNoYm9hcmRJbXBsKGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwsIGNvbnRhaW5lZFNoZWV0SW5mby5kYXNoYm9hcmRab25lcywgc2hlZXRQYXRoLCByZWdpc3RyeUlkLCB0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5TZXJ2ZXJFcnJvciwgJ0ludmFsaWQgU2hlZXRUeXBlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoZWV0SW1wbDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9TdG9yeUltcGwnO1xuXG5leHBvcnQgY2xhc3MgU3RvcnlQb2ludEluZm9JbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2NhcHRpb246IHN0cmluZyxcbiAgICBwcml2YXRlIF9pbmRleDogbnVtYmVyLFxuICAgIHByaXZhdGUgX3N0b3J5UG9pbnRJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2FjdGl2ZTogYm9vbGVhbixcbiAgICBwcml2YXRlIF91cGRhdGVkOiBib29sZWFuLFxuICAgIHByaXZhdGUgX3BhcmVudFN0b3J5SW1wbDogU3RvcnlJbXBsLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBjYXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9jYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIHNldCBjYXB0aW9uKGNhcHRpb246IHN0cmluZykge1xuICAgIHRoaXMuX2NhcHRpb24gPSBjYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gIH1cblxuICBwdWJsaWMgc2V0IGluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9pbmRleCA9IGluZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCBzdG9yeVBvaW50SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZShpc0FjdGl2ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2FjdGl2ZSA9IGlzQWN0aXZlO1xuICB9XG5cbiAgcHVibGljIGdldCB1cGRhdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl91cGRhdGVkO1xuICB9XG5cbiAgcHVibGljIHNldCB1cGRhdGVkKGlzVXBkYXRlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX3VwZGF0ZWQgPSBpc1VwZGF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudFN0b3J5KCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeUltcGw7XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBXb3JrYm9va0ltcGwge31cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlNZW51VHlwZSxcbiAgQ29udGV4dE1lbnVPcHRpb25zLFxuICBEYXRlUmFuZ2VUeXBlLFxuICBFcnJvckNvZGVzLFxuICBGaWx0ZXJOdWxsT3B0aW9uLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgUGVyaW9kVHlwZSxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2hhcmVkRXJyb3JDb2RlcyxcbiAgVG9vbHRpcENvbnRleHQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU2NoZW1hLCBEYXRhU291cmNlIGFzIERhdGFTb3VyY2VJbmZvLCBWaXN1YWxJZCwgV29ya3NoZWV0RGF0YVNvdXJjZUluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJy4uL0RhdGFTb3VyY2UnO1xuaW1wb3J0IHsgTG9naWNhbFRhYmxlIH0gZnJvbSAnLi4vTG9naWNhbFRhYmxlJztcbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvQWNjZXNzaWJpbGl0eVNlcnZpY2UnO1xuaW1wb3J0IHsgQW5ub3RhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9Bbm5vdGF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UsIEdldERhdGFUeXBlIH0gZnJvbSAnLi4vU2VydmljZXMvR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1NlbGVjdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgVmlzdWFsTW9kZWxTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvVmlzdWFsTW9kZWxTZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkSW1wbCB9IGZyb20gJy4vRGFzaGJvYXJkSW1wbCc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vRGF0YVNvdXJjZUltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9TaGVldEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW1wbCB9IGZyb20gJy4vU3RvcnlQb2ludEltcGwnO1xuXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0SW1wbCBleHRlbmRzIFNoZWV0SW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzaGVldEluZm9JbXBsOiBTaGVldEluZm9JbXBsLFxuICAgIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHByaXZhdGUgX3BhcmVudERhc2hib2FyZEltcGw6IERhc2hib2FyZEltcGwgfCBudWxsLFxuICAgIHByaXZhdGUgX3BhcmVudFN0b3J5UG9pbnRJbXBsOiBTdG9yeVBvaW50SW1wbCB8IG51bGwsXG4gICAgcHJpdmF0ZSBfYmFja2dyb3VuZENvbG9yOiBzdHJpbmcgfCBudWxsID0gbnVsbCxcbiAgICBwcml2YXRlIF9mb3JtYXR0aW5nOiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgfCBudWxsID0gbnVsbCxcbiAgKSB7XG4gICAgc3VwZXIoc2hlZXRJbmZvSW1wbCwgX3JlZ2lzdHJ5SWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnREYXNoYm9hcmQoKTogRGFzaGJvYXJkSW1wbCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnREYXNoYm9hcmRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnRTdG9yeVBvaW50KCk6IFN0b3J5UG9pbnRJbXBsIHwgbnVsbCB7XG4gICAgcmV0dXJuIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsO1xuICB9XG5cbiAgcHVibGljIGdldCB2aXN1YWxJZCgpOiBWaXN1YWxJZCB7XG4gICAgcmV0dXJuIHRoaXMuX3Zpc3VhbElkO1xuICB9XG5cbiAgcHVibGljIGdldE1heFBhZ2VSb3dMaW1pdCgpOiBudW1iZXIge1xuICAgIHJldHVybiAxMDAwMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYmFja2dyb3VuZENvbG9yKCk6IHN0cmluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9iYWNrZ3JvdW5kQ29sb3I7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHRpbmcoKTogQ29udHJhY3QuV29ya3NoZWV0Rm9ybWF0dGluZyB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0aW5nO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGU+KHVwZGF0ZVR5cGUsIENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsICdDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBseUZpbHRlckFzeW5jKHRoaXMudmlzdWFsSWQsIGZpZWxkTmFtZSwgdmFsdWVzLCB1cGRhdGVUeXBlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJhbmdlRmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcsIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LlJhbmdlRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGZpbHRlck9wdGlvbnMsICdmaWx0ZXJPcHRpb25zJyk7XG4gICAgaWYgKGZpbHRlck9wdGlvbnMubnVsbE9wdGlvbikge1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxGaWx0ZXJOdWxsT3B0aW9uPihmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24sIEZpbHRlck51bGxPcHRpb24sICdGaWx0ZXJOdWxsT3B0aW9uJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlSYW5nZVBhcmFtVHlwZShmaWx0ZXJPcHRpb25zLm1pbiwgZmlsdGVyT3B0aW9ucy5tYXgpO1xuICAgIH1cbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGx5UmFuZ2VGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIGZpbHRlck9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+IHwgQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxzLFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIodmFsdWVzLCAndmFsdWVzJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlPih1cGRhdGVUeXBlLCBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLCAnQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZScpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpICYmICF2YWx1ZXMubGV2ZWxzKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgICd2YWx1ZXMgcGFyYW1ldGVyIGZvciBhcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jIG11c3QgYmUgYW4gYXJyYXkgb3IgY29udGFpbiBhIGxldmVscyBrZXknLFxuICAgICAgKTtcbiAgICB9XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKHRoaXMudmlzdWFsSWQsIGZpZWxkTmFtZSwgdmFsdWVzLCB1cGRhdGVUeXBlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuY2xlYXJGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcsIG9wdGlvbnM6IENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTdHJpbmdQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihvcHRpb25zLCAnb3B0aW9ucycpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8UGVyaW9kVHlwZT4ob3B0aW9ucy5wZXJpb2RUeXBlLCBQZXJpb2RUeXBlLCAnUGVyaW9kVHlwZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RGF0ZVJhbmdlVHlwZT4ob3B0aW9ucy5yYW5nZVR5cGUsIERhdGVSYW5nZVR5cGUsICdEYXRlUmFuZ2VUeXBlJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKHRoaXMudmlzdWFsSWQsIGZpZWxkTmFtZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXREYXRhU291cmNlc0FzeW5jKHRoaXMudmlzdWFsSWQpLnRoZW48QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+KChyZXN1bHQpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFTY2hlbWE6IERhdGFTY2hlbWEgPSByZXN1bHQ7XG4gICAgICBjb25zdCB3b3Jrc2hlZXREYXRhU291cmNlSW5mbzogV29ya3NoZWV0RGF0YVNvdXJjZUluZm8gPSBkYXRhU2NoZW1hLndvcmtzaGVldERhdGFTY2hlbWFNYXBbdGhpcy5uYW1lXTtcblxuICAgICAgY29uc3QgZGF0YVNvdXJjZXM6IEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+ID0gW107XG5cbiAgICAgIC8vIEZpcnN0LCBhZGQgdGhlIHByaW1hcnkgZGF0YXNvdXJjZS4gIEJ5IGNvbnZlbnRpb24sIGl0IGNvbWVzIGZpcnN0IGluIHRoZSByZXR1cm5lZCBhcnJheS5cbiAgICAgIGNvbnN0IHByaW1hcnlJZDogc3RyaW5nID0gd29ya3NoZWV0RGF0YVNvdXJjZUluZm8ucHJpbWFyeURhdGFTb3VyY2U7XG4gICAgICBkYXRhU291cmNlcy5wdXNoKHRoaXMuY3JlYXRlRGF0YVNvdXJjZUZyb21JbmZvKGRhdGFTY2hlbWEuZGF0YVNvdXJjZXNbcHJpbWFyeUlkXSkpO1xuXG4gICAgICAvLyBUaGVuLCBsb29wIHRocm91Z2ggYW55IHNlY29uZGFyeSBkYXRhIHNvdXJjZXMgYW5kIGFkZCB0aGVtLlxuICAgICAgZm9yIChjb25zdCBzZWNvbmRhcnlJZCBvZiB3b3Jrc2hlZXREYXRhU291cmNlSW5mby5yZWZlcmVuY2VkRGF0YVNvdXJjZUxpc3QpIHtcbiAgICAgICAgaWYgKHNlY29uZGFyeUlkICE9PSBwcmltYXJ5SWQpIHtcbiAgICAgICAgICBkYXRhU291cmNlcy5wdXNoKHRoaXMuY3JlYXRlRGF0YVNvdXJjZUZyb21JbmZvKGRhdGFTY2hlbWEuZGF0YVNvdXJjZXNbc2Vjb25kYXJ5SWRdKSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGRhdGFTb3VyY2VzO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldEZpbHRlcnNBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldEhpZ2hsaWdodGVkTWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRIaWdobGlnaHRlZE1hcmtzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFBc3luYyhvcHRpb25zOiBDb250cmFjdC5HZXRTdW1tYXJ5RGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgR2V0RGF0YVR5cGUuU3VtbWFyeSxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgIHRydWUsXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkIHx8IFtdLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICAgIG9wdGlvbnMuYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nID8/IGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhwYWdlUm93Q291bnQ6IG51bWJlciwgb3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIHBhZ2VSb3dDb3VudCB8fCB0aGlzLmdldE1heFBhZ2VSb3dMaW1pdCgpLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgdHJ1ZSwgLy8gaW5jbHVkZUFsbENvbHVtbnMgKGNhbiBiZSBvdmVycmlkZGVuIGJ5IGNvbHVtbnNUb0luY2x1ZGVCeUlkKVxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICAgb3B0aW9ucy5hcHBseVdvcmtzaGVldEZvcm1hdHRpbmcgPz8gZmFsc2UsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5WaXN1YWxTcGVjaWZpY2F0aW9uPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxWaXN1YWxNb2RlbFNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXN1YWxNb2RlbCk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgYWRkTWFya3NDYXJkRmllbGRzQXN5bmMoXG4gICAgbWFya3NDYXJkSW5kZXg6IG51bWJlcixcbiAgICBlbmNvZGluZ1R5cGU6IENvbnRyYWN0LkVuY29kaW5nVHlwZSxcbiAgICBjb2x1bW5zOiBBcnJheTxDb250cmFjdC5Db2x1bW4+LFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxWaXN1YWxNb2RlbFNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXN1YWxNb2RlbCk7XG5cbiAgICByZXR1cm4gc2VydmljZS5hZGRNYXJrc0NhcmRGaWVsZHNBc3luYyh0aGlzLnZpc3VhbElkLCBtYXJrc0NhcmRJbmRleCwgZW5jb2RpbmdUeXBlLCBjb2x1bW5zLCBzdGFydEluZGV4KTtcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlTWFya3NDYXJkRmllbGRBc3luYyhtYXJrc0NhcmRJbmRleDogbnVtYmVyLCBmcm9tSW5kZXg6IG51bWJlciwgdG9JbmRleDogbnVtYmVyLCBmaWVsZENvdW50OiBudW1iZXIpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFZpc3VhbE1vZGVsU2VydmljZT4oU2VydmljZU5hbWVzLlZpc3VhbE1vZGVsKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLm1vdmVNYXJrc0NhcmRGaWVsZEFzeW5jKHRoaXMudmlzdWFsSWQsIG1hcmtzQ2FyZEluZGV4LCBmcm9tSW5kZXgsIHRvSW5kZXgsIGZpZWxkQ291bnQpO1xuICB9XG5cbiAgcHVibGljIHNwbGljZU1hcmtzQ2FyZEZpZWxkc0FzeW5jKFxuICAgIG1hcmtzQ2FyZEluZGV4OiBudW1iZXIsXG4gICAgZW5jb2RpbmdUeXBlOiBDb250cmFjdC5FbmNvZGluZ1R5cGUsXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICAgIGRlbGV0ZUNvdW50OiBudW1iZXIsXG4gICAgY29sdW1uczogQXJyYXk8Q29udHJhY3QuQ29sdW1uPixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxWaXN1YWxNb2RlbFNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXN1YWxNb2RlbCk7XG5cbiAgICByZXR1cm4gc2VydmljZS5zcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyh0aGlzLnZpc3VhbElkLCBtYXJrc0NhcmRJbmRleCwgZW5jb2RpbmdUeXBlLCBzdGFydEluZGV4LCBkZWxldGVDb3VudCwgY29sdW1ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db2x1bW4+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBHZXREYXRhVHlwZS5VbmRlcmx5aW5nLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgICBvcHRpb25zLmFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyA/PyBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdUYWJsZXNBc3luYyh0aGlzLnZpc3VhbElkKS50aGVuPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+KChsb2dpY2FsVGFibGVJbmZvcykgPT4ge1xuICAgICAgcmV0dXJuIGxvZ2ljYWxUYWJsZUluZm9zLm1hcCgobG9naWNhbFRhYmxlSW5mbykgPT4gbmV3IExvZ2ljYWxUYWJsZShsb2dpY2FsVGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgbG9naWNhbFRhYmxlSWQsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVTZWxlY3Rpb24sXG4gICAgICAhIW9wdGlvbnMuaW5jbHVkZUFsbENvbHVtbnMsXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkIHx8IFtdLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICAgIG9wdGlvbnMuYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nID8/IGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMsXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgIHBhZ2VSb3dDb3VudCB8fCB0aGlzLmdldE1heFBhZ2VSb3dMaW1pdCgpLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICAgb3B0aW9ucy5hcHBseVdvcmtzaGVldEZvcm1hdHRpbmcgPz8gZmFsc2UsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLmNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jKHNlbGVjdGlvbnM6IEFycmF5PENvbnRyYWN0LlNlbGVjdGlvbkNyaXRlcmlhPiwgc2VsZWN0aW9uVXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2VsZWN0aW9ucywgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8U2VsZWN0aW9uVXBkYXRlVHlwZT4oc2VsZWN0aW9uVXBkYXRlVHlwZSwgU2VsZWN0aW9uVXBkYXRlVHlwZSwgJ1NlbGVjdGlvblVwZGF0ZVR5cGUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jKHRoaXMudmlzdWFsSWQsIHNlbGVjdGlvbnMsIHNlbGVjdGlvblVwZGF0ZVR5cGUpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlJZEFzeW5jKHNlbGVjdGlvbnM6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiwgc2VsZWN0aW9uVXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2VsZWN0aW9ucywgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8U2VsZWN0aW9uVXBkYXRlVHlwZT4oc2VsZWN0aW9uVXBkYXRlVHlwZSwgU2VsZWN0aW9uVXBkYXRlVHlwZSwgJ1NlbGVjdGlvblVwZGF0ZVR5cGUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdE1hcmtzQnlJZEFzeW5jKHRoaXMudmlzdWFsSWQsIHNlbGVjdGlvbnMsIHNlbGVjdGlvblVwZGF0ZVR5cGUpO1xuICB9XG5cbiAgcHVibGljIGFubm90YXRlTWFya0FzeW5jKG1hcms6IENvbnRyYWN0Lk1hcmtJbmZvLCBhbm5vdGF0aW9uVGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihtYXJrLCAnbWFyaycpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5hbm5vdGF0ZU1hcmtBc3luYyh0aGlzLnZpc3VhbElkLCBtYXJrLCBhbm5vdGF0aW9uVGV4dCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QW5ub3RhdGlvbnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxBbm5vdGF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLkFubm90YXRpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldEFubm90YXRpb25zQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQW5ub3RhdGlvbkFzeW5jKGFubm90YXRpb246IENvbnRyYWN0LkFubm90YXRpb24pIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGFubm90YXRpb24sICdhbm5vdGF0aW9uJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxBbm5vdGF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLkFubm90YXRpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbW92ZUFubm90YXRpb25Bc3luYyh0aGlzLnZpc3VhbElkLCBhbm5vdGF0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBlbmRDb250ZXh0TWVudUFzeW5jKHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBjb25maWc6IENvbnRleHRNZW51T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGVuZENvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIGNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbW92ZUNvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIG1lbnVJdGVtSWQpO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGVDb250ZXh0TWVudUFzeW5jKHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRXh0ZXJuYWxDb250ZXh0TWVudSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZXhlY3V0ZUNvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIG1lbnVJdGVtSWQpO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZUNvbnRleHRNZW51QXN5bmModGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVIZWFkZXI6IHN0cmluZywgbWVudURlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRXh0ZXJuYWxDb250ZXh0TWVudSk7XG4gICAgcmV0dXJuIHNlcnZpY2UucmVuYW1lQ29udGV4dE1lbnVBc3luYyh0aGlzLnZpc3VhbElkLndvcmtzaGVldCwgdGFyZ2V0TWVudSwgbWVudUhlYWRlciwgbWVudURlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBob3ZlclR1cGxlQXN5bmMoaG92ZXJlZFR1cGxlPzogbnVtYmVyLCB0b29sdGlwPzogVG9vbHRpcENvbnRleHQgfCBudWxsLCBhbGxvd0hvdmVyQWN0aW9ucz86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0luc2lkZURhc2hib2FyZEV4dGVuc2lvbigpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgaG92ZXJUdXBsZUFzeW5jIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFzaGJvYXJkIGV4dGVuc2lvbnNgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5ob3ZlclR1cGxlQXN5bmModGhpcy52aXN1YWxJZCwgaG92ZXJlZFR1cGxlLCB0b29sdGlwLCBhbGxvd0hvdmVyQWN0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0VHVwbGVzQXN5bmMoc2VsZWN0ZWRUdXBsZXM6IEFycmF5PG51bWJlcj4sIHNlbGVjdE9wdGlvbjogQ29udHJhY3QuU2VsZWN0T3B0aW9ucywgdG9vbHRpcD86IFRvb2x0aXBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYHNlbGVjdFR1cGxlc0FzeW5jIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFzaGJvYXJkIGV4dGVuc2lvbnNgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RUdXBsZXNBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3RlZFR1cGxlcywgc2VsZWN0T3B0aW9uLCB0b29sdGlwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb29sdGlwVGV4dEFzeW5jKHR1cGxlSWQ6IG51bWJlcik6IFByb21pc2U8U3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYGdldFRvb2x0aXBUZXh0QXN5bmMgaXMgbm90IHN1cHBvcnRlZCBpbiBkYXNoYm9hcmQgZXh0ZW5zaW9uc2ApLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxBY2Nlc3NpYmlsaXR5U2VydmljZT4oU2VydmljZU5hbWVzLkFjY2Vzc2liaWxpdHkpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFRvb2x0aXBUZXh0QXN5bmModGhpcy52aXN1YWxJZCwgdHVwbGVJZCk7XG4gIH1cblxuICBwdWJsaWMgbGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgICBDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsXG4gICAgICAgICAgYGxlYXZlTWFya05hdmlnYXRpb25Bc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QWNjZXNzaWJpbGl0eVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5BY2Nlc3NpYmlsaXR5KTtcbiAgICByZXR1cm4gc2VydmljZS5sZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZWRpdEFsaWFzZXNEaWFsb2dBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuICAgIHJldHVybiBzZXJ2aWNlLmVkaXRBbGlhc2VzRGlhbG9nQXN5bmMoZmllbGROYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGF0YVNvdXJjZUZyb21JbmZvKGRhdGFTb3VyY2VJbmZvOiBEYXRhU291cmNlSW5mbyk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VJbXBsID0gbmV3IERhdGFTb3VyY2VJbXBsKGRhdGFTb3VyY2VJbmZvLCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERhdGFTb3VyY2UoZGF0YVNvdXJjZUltcGwpO1xuICAgIGRhdGFTb3VyY2VJbXBsLmluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcyhkYXRhU291cmNlKTtcbiAgICByZXR1cm4gZGF0YVNvdXJjZTtcbiAgfVxuXG4gIHByaXZhdGUgdmVyaWZ5QWN0aXZlU2hlZXQoKSB7XG4gICAgY29uc3QgaXNSb290QW5kQWN0aXZlV29ya3NoZWV0ID0gdGhpcy5hY3RpdmU7XG4gICAgY29uc3QgaXNJbnNpZGVBY3RpdmVEYXNoYm9hcmQgPSB0aGlzLmlzSW5zaWRlQWN0aXZlRGFzaGJvYXJkKCk7XG4gICAgY29uc3QgaXNJbnNpZGVBY3RpdmVTdG9yeVBvaW50ID0gdGhpcy5pc0luc2lkZUFjdGl2ZVN0b3J5UG9pbnQoKTtcblxuICAgIGlmICghaXNSb290QW5kQWN0aXZlV29ya3NoZWV0ICYmICFpc0luc2lkZUFjdGl2ZURhc2hib2FyZCAmJiAhaXNJbnNpZGVBY3RpdmVTdG9yeVBvaW50KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuTm90QWN0aXZlU2hlZXQsICdPcGVyYXRpb24gbm90IGFsbG93ZWQgb24gbm9uLWFjdGl2ZSBzaGVldCcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNJbnNpZGVBY3RpdmVTdG9yeVBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbCAmJiB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbC5hY3RpdmU7XG4gIH1cblxuICBwcml2YXRlIGlzSW5zaWRlQWN0aXZlRGFzaGJvYXJkKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnREYXNoYm9hcmRJbXBsICYmIHRoaXMuX3BhcmVudERhc2hib2FyZEltcGwuYWN0aXZlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0luc2lkZURhc2hib2FyZEV4dGVuc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbCAhPT0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IExvZ2ljYWxUYWJsZUluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIGEgbG9naWNhbCB0YWJsZS5cbiAqIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXMganVzdCBhIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIExvZ2ljYWxUYWJsZSBpbXBsZW1lbnRzIENvbnRyYWN0LkxvZ2ljYWxUYWJsZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9sb2dpY2FsVGFibGU6IExvZ2ljYWxUYWJsZUluZm8pIHt9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sb2dpY2FsVGFibGUuaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9naWNhbFRhYmxlLmNhcHRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IFRvb2x0aXBUZXh0UmVxdWVzdCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgVG9vbHRpcFRleHRSZXF1ZXN0TW9kZWwgaW1wbGVtZW50cyBUb29sdGlwVGV4dFJlcXVlc3Qge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHVibGljIHZpc3VhbElkUHJlc01vZGVsOiBWaXN1YWxJZCwgcHVibGljIHR1cGxlSWQ6IG51bWJlcikge31cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRlUmFuZ2VUeXBlLCBGaWx0ZXJEb21haW5UeXBlLCBGaWx0ZXJUeXBlLCBQZXJpb2RUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvbGliL3NyYy9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9EYXRhU291cmNlU2VydmljZSc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRmlsdGVyU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgRmlsdGVyIGltcGxlbWVudHMgQ29udHJhY3QuRmlsdGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBfd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfZmllbGROYW1lOiBzdHJpbmcsXG4gICAgcHJvdGVjdGVkIF9maWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHByb3RlY3RlZCBfZmllbGRJZDogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfcmVnaXN0cnlJZDogbnVtYmVyLFxuICApIHt9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmlsdGVyVHlwZSgpOiBGaWx0ZXJUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmlsdGVyVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWVsZEFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuRmllbGQ+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldEZpZWxkQXN5bmModGhpcy5fZmllbGRJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luYygpOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmModGhpcy5fd29ya3NoZWV0TmFtZSwgdGhpcy5fZmllbGRJZCk7XG4gIH1cblxuICBwdWJsaWMgc2V0QXBwbGllZFdvcmtzaGVldHNBc3luYyhhcHBseVRvV29ya3NoZWV0czogQXJyYXk8c3RyaW5nPik6IFByb21pc2U8QXJyYXk8c3RyaW5nPj4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoYXBwbHlUb1dvcmtzaGVldHMsICdhcHBseVRvV29ya3NoZWV0cycpO1xuICAgIGNvbnN0IHVuaXF1ZVdvcmtzaGVldHMgPSBuZXcgU2V0KGFwcGx5VG9Xb3Jrc2hlZXRzKTtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLnNldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmModGhpcy5fd29ya3NoZWV0TmFtZSwgdGhpcy5fZmllbGROYW1lLCB0aGlzLl9maWVsZElkLCBBcnJheS5mcm9tKHVuaXF1ZVdvcmtzaGVldHMpKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2F0ZWdvcmljYWxGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5DYXRlZ29yaWNhbEZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2FwcGxpZWRWYWx1ZXM6IEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4sXG4gICAgcHJpdmF0ZSBfaXNFeGNsdWRlTW9kZTogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pc0FsbFNlbGVjdGVkPzogYm9vbGVhbixcbiAgKSB7XG4gICAgc3VwZXIod29ya3NoZWV0TmFtZSwgZmllbGROYW1lLCBmaWx0ZXJUeXBlLCBmaWVsZElkLCByZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faXNBbGxTZWxlY3RlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBwbGllZFZhbHVlcygpOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBwbGllZFZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeGNsdWRlTW9kZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNFeGNsdWRlTW9kZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREb21haW5Bc3luYyhkb21haW5UeXBlPzogRmlsdGVyRG9tYWluVHlwZSk6IFByb21pc2U8Q29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4+IHtcbiAgICBpZiAoIWRvbWFpblR5cGUpIHtcbiAgICAgIGRvbWFpblR5cGUgPSBGaWx0ZXJEb21haW5UeXBlLlJlbGV2YW50O1xuICAgIH1cblxuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RmlsdGVyRG9tYWluVHlwZT4oZG9tYWluVHlwZSwgRmlsdGVyRG9tYWluVHlwZSwgJ0ZpbHRlckRvbWFpblR5cGUnKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0Q2F0ZWdvcmljYWxEb21haW5Bc3luYyh0aGlzLl93b3Jrc2hlZXROYW1lLCB0aGlzLl9maWVsZElkLCBkb21haW5UeXBlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsRGF0YVZhbHVlIGltcGxlbWVudHMgQ29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyRGF0YVZhbHVlIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3ZhbHVlOiBDb250cmFjdC5EYXRhVmFsdWUsIHByaXZhdGUgX2hpZXJhcmNoaWNhbFBhdGg6IHN0cmluZywgcHJpdmF0ZSBfbGV2ZWw6IG51bWJlcikge31cblxuICBwdWJsaWMgZ2V0IHZhbHVlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3ZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBoaWVyYXJjaGljYWxQYXRoKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2hpZXJhcmNoaWNhbFBhdGg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxldmVsKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2xldmVsO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIaWVyYXJjaGljYWxMZXZlbERldGFpbCBpbXBsZW1lbnRzIENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVsRGV0YWlsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX25hbWU6IHN0cmluZywgcHJpdmF0ZSBfbGV2ZWxTZWxlY3Rpb25TdGF0ZTogSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGV2ZWxTZWxlY3Rpb25TdGF0ZSgpOiBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIHtcbiAgICByZXR1cm4gdGhpcy5fbGV2ZWxTZWxlY3Rpb25TdGF0ZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsRmlsdGVyIGV4dGVuZHMgRmlsdGVyIGltcGxlbWVudHMgQ29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICByZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfZGltZW5zaW9uTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgX2hpZXJhcmNoeUNhcHRpb246IHN0cmluZyxcbiAgICBwcml2YXRlIF9udW1iZXJPZkxldmVsczogbnVtYmVyLFxuICAgIHByaXZhdGUgX2xldmVsRGV0YWlsczogQXJyYXk8Q29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWw+LFxuICAgIHByaXZhdGUgX2FwcGxpZWRWYWx1ZXM6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZT4sXG4gICAgcHJpdmF0ZSBfaXNBbGxTZWxlY3RlZDogYm9vbGVhbixcbiAgKSB7XG4gICAgc3VwZXIod29ya3NoZWV0TmFtZSwgZmllbGROYW1lLCBmaWx0ZXJUeXBlLCBmaWVsZElkLCByZWdpc3RyeUlkKTtcbiAgfVxuICBnZXREb21haW5Bc3luYyhkb21haW5UeXBlPzogQ29udHJhY3QuRmlsdGVyRG9tYWluVHlwZSk6IFByb21pc2U8Q29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ01ldGhvZCBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRpbWVuc2lvbk5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGltZW5zaW9uTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGllcmFyY2h5Q2FwdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9oaWVyYXJjaHlDYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBudW1iZXJPZkxldmVscygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9udW1iZXJPZkxldmVscztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbGV2ZWxEZXRhaWxzKCk6IENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVsRGV0YWlsW10ge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbERldGFpbHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQWxsU2VsZWN0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwcGxpZWRWYWx1ZXMoKTogQXJyYXk8Q29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwcGxpZWRWYWx1ZXM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFJhbmdlRmlsdGVyIGV4dGVuZHMgRmlsdGVyIGltcGxlbWVudHMgQ29udHJhY3QuUmFuZ2VGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9taW46IENvbnRyYWN0LkRhdGFWYWx1ZSxcbiAgICBwcml2YXRlIF9tYXg6IENvbnRyYWN0LkRhdGFWYWx1ZSxcbiAgICBwcml2YXRlIF9pbmNsdWRlTnVsbFZhbHVlczogYm9vbGVhbixcbiAgKSB7XG4gICAgc3VwZXIod29ya3NoZWV0TmFtZSwgZmllbGROYW1lLCBmaWx0ZXJUeXBlLCBmaWVsZElkLCByZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbWluVmFsdWUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fbWluO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXhWYWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluY2x1ZGVOdWxsVmFsdWVzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pbmNsdWRlTnVsbFZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyBnZXREb21haW5Bc3luYyhkb21haW5UeXBlPzogRmlsdGVyRG9tYWluVHlwZSk6IFByb21pc2U8Q29udHJhY3QuUmFuZ2VEb21haW4+IHtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIGlmICghZG9tYWluVHlwZSkge1xuICAgICAgZG9tYWluVHlwZSA9IEZpbHRlckRvbWFpblR5cGUuUmVsZXZhbnQ7XG4gICAgfVxuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxGaWx0ZXJEb21haW5UeXBlPihkb21haW5UeXBlLCBGaWx0ZXJEb21haW5UeXBlLCAnRmlsdGVyRG9tYWluVHlwZScpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0UmFuZ2VEb21haW5Bc3luYyh0aGlzLl93b3Jrc2hlZXROYW1lLCB0aGlzLl9maWVsZElkLCBkb21haW5UeXBlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmVsYXRpdmVEYXRlRmlsdGVyIGV4dGVuZHMgRmlsdGVyIGltcGxlbWVudHMgQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICByZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfYW5jaG9yRGF0ZTogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX3BlcmlvZFR5cGU6IFBlcmlvZFR5cGUsXG4gICAgcHJpdmF0ZSBfcmFuZ2VUeXBlOiBEYXRlUmFuZ2VUeXBlLFxuICAgIHByaXZhdGUgX3JhbmdlTjogbnVtYmVyLFxuICApIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQsIHJlZ2lzdHJ5SWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBhbmNob3JEYXRlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2FuY2hvckRhdGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBlcmlvZFR5cGUoKTogUGVyaW9kVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3BlcmlvZFR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJhbmdlVHlwZSgpOiBEYXRlUmFuZ2VUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fcmFuZ2VUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCByYW5nZU4oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fcmFuZ2VOO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDYXRlZ29yaWNhbERvbWFpbiBpbXBsZW1lbnRzIENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3ZhbHVlczogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPiwgcHJpdmF0ZSBfZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSkge31cblxuICBwdWJsaWMgZ2V0IHZhbHVlcygpOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IEZpbHRlckRvbWFpblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kb21haW5UeXBlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYW5nZURvbWFpbiBpbXBsZW1lbnRzIENvbnRyYWN0LlJhbmdlRG9tYWluIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX21pbjogQ29udHJhY3QuRGF0YVZhbHVlLCBwcml2YXRlIF9tYXg6IENvbnRyYWN0LkRhdGFWYWx1ZSwgcHJpdmF0ZSBfZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSkge31cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogRmlsdGVyRG9tYWluVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2RvbWFpblR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1pbigpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1heCgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgTWFya1R5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVRhYmxlIHtcbiAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9kYXRhOiBBcnJheTxBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+PixcbiAgICBwcml2YXRlIF9jb2x1bW5zOiBBcnJheTxDb250cmFjdC5Db2x1bW4+LFxuICAgIHByaXZhdGUgX3RvdGFsUm93Q291bnQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9pc1RvdGFsUm93Q291bnRMaW1pdGVkOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lzU3VtbWFyeURhdGE6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfbWFya3NJbmZvPzogQXJyYXk8TWFya0luZm8+LFxuICApIHtcbiAgICB0aGlzLl9uYW1lID0gX2lzU3VtbWFyeURhdGEgPyAnU3VtbWFyeSBEYXRhIFRhYmxlJyA6ICdVbmRlcmx5aW5nIERhdGEgVGFibGUnO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGEoKTogQXJyYXk8QXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgcHVibGljIGdldCBjb2x1bW5zKCk6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4ge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXJrc0luZm8oKTogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWFya3NJbmZvO1xuICB9XG5cbiAgcHVibGljIGdldCB0b3RhbFJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3RvdGFsUm93Q291bnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzVG90YWxSb3dDb3VudExpbWl0ZWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzVG90YWxSb3dDb3VudExpbWl0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzU3VtbWFyeURhdGEoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3VtbWFyeURhdGE7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hcmtJbmZvIGltcGxlbWVudHMgQ29udHJhY3QuTWFya0luZm8ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfdHlwZTogTWFya1R5cGUsIHByaXZhdGUgX2NvbG9yOiBzdHJpbmcsIHByaXZhdGUgX3R1cGxlSWQ/OiBudW1iZXIpIHt9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IE1hcmtUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29sb3I7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR1cGxlSWQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdHVwbGVJZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29sdW1uIGltcGxlbWVudHMgQ29udHJhY3QuQ29sdW1uIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2ZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgX2ZpZWxkSWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIF9kYXRhVHlwZTogRGF0YVR5cGUsXG4gICAgcHJpdmF0ZSBfaXNSZWZlcmVuY2VkOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2luZGV4OiBudW1iZXIsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kYXRhVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNSZWZlcmVuY2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1JlZmVyZW5jZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2luZGV4O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhVmFsdWUgaW1wbGVtZW50cyBDb250cmFjdC5EYXRhVmFsdWUge1xuICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1hbnkgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3ZhbHVlOiBhbnksXG4gICAgcHJpdmF0ZSBfbmF0aXZlVmFsdWU6IGFueSxcbiAgICBwcml2YXRlIF9mb3JtYXR0ZWRWYWx1ZT86IHN0cmluZyxcbiAgICBwcml2YXRlIF9hbGlhc1ZhbHVlPzogc3RyaW5nLFxuICAgIHByaXZhdGUgX2hhc0FsaWFzPzogYm9vbGVhbixcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hdGl2ZVZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX25hdGl2ZVZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0ZWRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxpYXNWYWx1ZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9hbGlhc1ZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNBbGlhcygpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faGFzQWxpYXM7XG4gIH1cbiAgLyogdHNsaW50OmVuYWJsZTpuby1hbnkgKi9cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVSZWFkZXIgaW1wbGVtZW50cyBDb250cmFjdC5EYXRhVGFibGVSZWFkZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJvdGVjdGVkIF9pZDogc3RyaW5nLCBwcm90ZWN0ZWQgX3RvdGFsUm93Q291bnQ6IG51bWJlciwgcHJvdGVjdGVkIF9wYWdlUm93Q291bnQsIHByaXZhdGUgX3JlZ2lzdHJ5SWQ6IG51bWJlcikge1xuICAgIHRoaXMuX3BhZ2VDb3VudCA9IE1hdGguY2VpbChfdG90YWxSb3dDb3VudCAvIF9wYWdlUm93Q291bnQpO1xuICB9XG4gIHByb3RlY3RlZCBfcGFnZUNvdW50OiBudW1iZXI7XG5cbiAgcHVibGljIGdldCB0b3RhbFJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3RvdGFsUm93Q291bnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhZ2VDb3VudCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9wYWdlQ291bnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFnZUFzeW5jKHBhZ2VOdW1iZXI6IG51bWJlcik6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVJhbmdlKHBhZ2VOdW1iZXIsIDAsIHRoaXMuX3BhZ2VDb3VudCk7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFBhZ2VBc3luYyh0aGlzLl9pZCwgcGFnZU51bWJlciwgdGhpcy5fcGFnZVJvd0NvdW50KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBbGxQYWdlc0FzeW5jKG1heFJvd3M/OiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIGNvbnN0IGZpcnN0UGFnZTogQ29udHJhY3QuRGF0YVRhYmxlID0gYXdhaXQgdGhpcy5nZXRQYWdlQXN5bmMoMCk7XG4gICAgbWF4Um93cyA9IG1heFJvd3MgfHwgdGhpcy50b3RhbFJvd0NvdW50O1xuICAgIGNvbnN0IHJvd3NSZXF1ZXN0ZWQgPSBNYXRoLm1pbihtYXhSb3dzLCB0aGlzLnRvdGFsUm93Q291bnQpO1xuICAgIGNvbnN0IHBhZ2VzUmVxdWVzdGVkID0gTWF0aC5jZWlsKHJvd3NSZXF1ZXN0ZWQgLyB0aGlzLl9wYWdlUm93Q291bnQpO1xuXG4gICAgLy8gRmV0Y2ggdXAgdG8gNDAwIHBhZ2VzLCB3aXRoIGEgZGVmYXVsdCBvZiAxMCwwMDAgcGFnZVJvd0NvdW50IHRoYXQgZ2l2ZXMgdXMgNCwwMDAsMDAwIHJvd3NcbiAgICBjb25zdCBwYWdlc1RvRmV0Y2ggPSBNYXRoLm1pbihwYWdlc1JlcXVlc3RlZCwgNDAwKTtcbiAgICBjb25zdCBpc0RhdGFMaW1pdGVkID0gcGFnZXNUb0ZldGNoIDwgcGFnZXNSZXF1ZXN0ZWQ7XG4gICAgbGV0IHJlbWFpbmluZ0RhdGE6IEFycmF5PEFycmF5PEFycmF5PENvbnRyYWN0LkRhdGFWYWx1ZT4+PiA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcGFnZXNUb0ZldGNoOyBpKyspIHtcbiAgICAgIGNvbnN0IHBhZ2UgPSBhd2FpdCB0aGlzLmdldFBhZ2VBc3luYyhpKTtcbiAgICAgIHJlbWFpbmluZ0RhdGEucHVzaChwYWdlLmRhdGEpO1xuICAgIH1cblxuICAgIGxldCBmdWxsRGF0YSA9IGZpcnN0UGFnZS5kYXRhLmNvbmNhdCguLi5yZW1haW5pbmdEYXRhKTtcbiAgICAvLyBUaGlzIHNsaWNlcyB0aGUgYXJyYXkgb25seSBpZiBtYXhSb3dzIGhhcyBiZWVuIHNldCBhbmQgaXMgbGVzcyB0aGFuIHRvdGFsUm93Q291bnRcbiAgICBmdWxsRGF0YS5sZW5ndGggPSByb3dzUmVxdWVzdGVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IGZpcnN0UGFnZS5uYW1lLFxuICAgICAgZGF0YTogZnVsbERhdGEsXG4gICAgICBjb2x1bW5zOiBmaXJzdFBhZ2UuY29sdW1ucyxcbiAgICAgIHRvdGFsUm93Q291bnQ6IGlzRGF0YUxpbWl0ZWQgPyBwYWdlc1RvRmV0Y2ggKiB0aGlzLl9wYWdlUm93Q291bnQgOiByb3dzUmVxdWVzdGVkLFxuICAgICAgaXNUb3RhbFJvd0NvdW50TGltaXRlZDogaXNEYXRhTGltaXRlZCxcbiAgICAgIGlzU3VtbWFyeURhdGE6IGZpcnN0UGFnZS5pc1N1bW1hcnlEYXRhLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgcmVsZWFzZUFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICByZXR1cm4gc2VydmljZS5yZWxlYXNlQXN5bmModGhpcy5faWQpO1xuICB9XG59XG4iLCJpbXBvcnQgeyBUb29sdGlwQ29udGV4dCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBIb3ZlclR1cGxlSW50ZXJhY3Rpb24sIFNlbGVjdE9wdGlvbnMsIFNlbGVjdFR1cGxlc0ludGVyYWN0aW9uLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogU2VsZWN0aW9uIE1vZGVsLlxuICovXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uTW9kZWwge1xuICBwdWJsaWMgcXVhbGlmaWVkRmllbGRDYXB0aW9uOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVmFsdWUgYmFzZWQgc2VsZWN0aW9uIG1vZGVsLiBNZWFudCBmb3IgaGllcmFyY2hpY2FsLCByYW5nZSBhbmQgY2F0ZWdvcmljYWwgc2VsZWN0aW9ucy5cbiAqL1xuZXhwb3J0IGNsYXNzIFZhbHVlU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBTZWxlY3Rpb25Nb2RlbCB7XG4gIHB1YmxpYyBzZWxlY3RWYWx1ZXM6IEFycmF5PHN0cmluZz4gPSBbXTtcbn1cblxuLyoqXG4gKiBIaWVyYXJjaGljYWwgdmFsdWUgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbCBleHRlbmRzIFZhbHVlU2VsZWN0aW9uTW9kZWwge31cblxuLyoqXG4gKiBSYW5nZSBiYXNlZCB2YWx1ZSBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIFJhbmdlU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBTZWxlY3Rpb25Nb2RlbCB7XG4gIHB1YmxpYyBtaW5WYWx1ZTogc3RyaW5nO1xuICBwdWJsaWMgbWF4VmFsdWU6IHN0cmluZztcbiAgcHVibGljIGluY2x1ZGVkOiBzdHJpbmc7XG59XG5cbi8qKlxuICogRGltZW5zaW9uIHZhbHVlIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgRGltZW5zaW9uU2VsZWN0aW9uTW9kZWwgZXh0ZW5kcyBWYWx1ZVNlbGVjdGlvbk1vZGVsIHt9XG4vKipcbiAqIFR1cGxlIGJhc2VkIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgVHVwbGVTZWxlY3Rpb25Nb2RlbCB7XG4gIHB1YmxpYyBzZWxlY3Rpb25UeXBlOiBzdHJpbmc7XG4gIHB1YmxpYyBvYmplY3RJZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcbn1cblxuLyoqXG4gKiBDb250YWluZXIgY2xhc3MgdG8gcG9wdWxhdGUgYWxsIHRoZSBzZWxlY3Rpb24gbW9kZWxzIHdoZW4gcGFyc2luZyBpbnB1dFxuICovXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgcHVibGljIGhpZXJNb2RlbEFycjogQXJyYXk8SGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWw+ID0gW107XG4gIHB1YmxpYyBkaW1Nb2RlbEFycjogQXJyYXk8RGltZW5zaW9uU2VsZWN0aW9uTW9kZWw+ID0gW107XG4gIHB1YmxpYyBxdWFudE1vZGVsQXJyOiBBcnJheTxSYW5nZVNlbGVjdGlvbk1vZGVsPiA9IFtdO1xuICBwdWJsaWMgc2VsZWN0aW9uOiBUdXBsZVNlbGVjdGlvbk1vZGVsO1xufVxuXG5leHBvcnQgY2xhc3MgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb25Nb2RlbCBpbXBsZW1lbnRzIFNlbGVjdFR1cGxlc0ludGVyYWN0aW9uIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB2aXN1YWxJZFByZXNNb2RlbDogVmlzdWFsSWQsXG4gICAgcHVibGljIHR1cGxlSWRzOiBBcnJheTxudW1iZXI+ID0gW10sXG4gICAgcHVibGljIHNlbGVjdE9wdGlvbnM6IFNlbGVjdE9wdGlvbnMsXG4gICAgcHVibGljIHRvb2x0aXBDb250ZXh0PzogVG9vbHRpcENvbnRleHQsXG4gICkge31cbn1cblxuZXhwb3J0IGNsYXNzIEhvdmVyVHVwbGVJbnRlcmFjdGlvbk1vZGVsIGltcGxlbWVudHMgSG92ZXJUdXBsZUludGVyYWN0aW9uIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHB1YmxpYyB2aXN1YWxJZFByZXNNb2RlbDogVmlzdWFsSWQsXG4gICAgcHVibGljIHR1cGxlSWQ6IG51bWJlcixcbiAgICBwdWJsaWMgdG9vbHRpcENvbnRleHQ/OiBUb29sdGlwQ29udGV4dCB8IG51bGwsXG4gICAgcHVibGljIGFsbG93SG92ZXJBY3Rpb25zPzogYm9vbGVhbixcbiAgKSB7fVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuZXhwb3J0IGNsYXNzIFBvaW50IGltcGxlbWVudHMgQ29udHJhY3QuUG9pbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfeDogbnVtYmVyLCBwcml2YXRlIF95OiBudW1iZXIpIHt9XG5cbiAgcHVibGljIGdldCB4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3g7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHkoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5feTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2VSZWdpc3RyeSc7XG5cbi8qKlxuICogRGVmaW5lcyB3aGljaCB0eXBlIG9mIGdldERhdGEgY2FsbCB0byBtYWtlLlxuICovXG5leHBvcnQgZW51bSBHZXREYXRhVHlwZSB7XG4gIFN1bW1hcnkgPSAnc3VtbWFyeScsXG4gIFVuZGVybHlpbmcgPSAndW5kZXJseWluZycsXG59XG5cbi8qKlxuICogU2VydmljZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBsb2dpYyBmb3IgdmFyaW91cyBnZXREYXRhIGNhbGxzXG4gKlxuICogQGludGVyZmFjZSBHZXREYXRhU2VydmljZVxuICogQGV4dGVuZHMge0FwaVNlcnZpY2V9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RGF0YVNlcnZpY2UgZXh0ZW5kcyBBcGlTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpbWl0IG9mIHJvd3MgZm9yIGdldFVuZGVybHlpbmdEYXRhQXN5bmNcbiAgICovXG4gIGdldE1heFJvd0xpbWl0KCk6IG51bWJlcjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgdW5kZXJseWluZyBkYXRhIGZvciBhIHBhcnRpY3VsYXIgdmlzdWFsXG4gICAqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7R2V0RGF0YVR5cGV9IGdldFR5cGUgIFRoZSB0eXBlIG9mIGdldERhdGEgY2FsbCB0byBtYWtlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBvciBub3QgYWxpYXNlcyBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBvciBub3Qgc2VsZWN0aW9uIHNob3VsZCBiZSBpZ25vcmVkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFNob3VsZCBhbGwgY29sdW1ucyBiZSBpbmNsdWRlZFxuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyAgTWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXR1cm5cbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGdldFR5cGU6IEdldERhdGFUeXBlLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlUm93Q291bnQgVGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlLiBUaGUgZGVmYXVsdCBhbmQgbWF4aW11bSBpcyAxMCwwMDAgcm93cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFNob3VsZCBhbGwgY29sdW1ucyBiZSBpbmNsdWRlZFxuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj59ICBEYXRhIHRhYmxlIHJlYWRlciB0byBhY2Nlc3MgdGhlIHVuZGVybHlpbmcgZGF0YVxuICAgKi9cbiAgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICAgIGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWFya3MgZm9yIGEgZ2l2ZW4gdmlzdWFsXG4gICAqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFjdGl2ZU1hcmtzPn0gIENvbGxlY3Rpb24gb2YgZGF0YSB0YWJsZXMgd2l0aCB0aGUgYWN0aXZlIG1hcmtzXG4gICAqL1xuICBnZXRTZWxlY3RlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgbWFya3MgZm9yIGEgZ2l2ZW4gdmlzdWFsXG4gICAqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFjdGl2ZU1hcmtzPn0gIENvbGxlY3Rpb24gb2YgZGF0YSB0YWJsZXMgd2l0aCB0aGUgYWN0aXZlIG1hcmtzXG4gICAqL1xuICBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNvdXJjZUlkICBUaGUgaWQgb2YgdGhlIGRhdGFzb3VyY2VcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGUgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IGNhcHRpb24uIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IG5hbWUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgIGRhdGFzb3VyY2VJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhc291cmNlSWQgIFRoZSBpZCBvZiB0aGUgZGF0YXNvdXJjZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naWNhbFRhYmxlSWQgIFRoZSBpZCBvZiB0aGUgbG9nY2lhbCB0YWJsZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSb3dzIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZSBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgY2FwdGlvbi4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgbmFtZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhcbiAgICBkYXRhc291cmNlSWQ6IHN0cmluZyxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhc291cmNlSWQgIFRoZSBpZCBvZiB0aGUgZGF0YXNvdXJjZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naWNhbFRhYmxlSWQgIFRoZSBpZCBvZiB0aGUgbG9nY2lhbCB0YWJsZVxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZVJvd0NvdW50IFRoZSBudW1iZXIgb2Ygcm93cyBwZXIgcGFnZS4gVGhlIGRlZmF1bHQgYW5kIG1heGltdW0gaXMgMTAsMDAwIHJvd3MuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgbmFtZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICBkYXRhc291cmNlSWQ6IHN0cmluZyxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVTZWxlY3Rpb24gIFdoZXRoZXIgc2VsZWN0aW9ucyBpbiB0aGlzIHZpeiBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBbGxDb2x1bW5zICBXaGV0aGVyIHRvIGluY2x1ZGUgYWxsIGNvbHVtbnMgb3Igb25seSB0aGUgcmVmZXJlbmNlZCBjb2x1bW5zXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbHVtbnNUb0luY2x1ZGVCeUlkIE92ZXJyaWRlcyBpbmNsdWRlQWxsQ29sdW1ucywgbGlzdHMgdGhlIGNvbHVtbnMgdG8gaW5jbHVkZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSb3dzIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VSb3dDb3VudCBUaGUgbnVtYmVyIG9mIHJvd3MgcGVyIHBhZ2UuIFRoZSBkZWZhdWx0IGFuZCBtYXhpbXVtIGlzIDEwLDAwMCByb3dzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlU2VsZWN0aW9uICBXaGV0aGVyIHNlbGVjdGlvbnMgaW4gdGhpcyB2aXogc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQWxsQ29sdW1ucyAgV2hldGhlciB0byBpbmNsdWRlIGFsbCBjb2x1bW5zIG9yIG9ubHkgdGhlIHJlZmVyZW5jZWQgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmcsXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICovXG4gIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB0YWJsZUlkICAgICBUaGUgdGFibGUgaWQgdXNlZCB0byBmZXRjaCBkYXRhLlxuICAgKiBAcGFyYW0gcGFnZU51bWJlciAgVGhlIHBhZ2UgbnVtYmVyICh6ZXJvLWJhc2VkKS5cbiAgICogQHBhcmFtIHBhZ2VTaXplICAgIFRoZSBwYWdlIHNpemUgb2YgdGhlIG93bmluZyBEYXRhVGFibGVSZWFkZXJcbiAgICogQHJldHVybnMgICAgICAgICAgIEEgRGF0YVRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBwYWdlLiBUaGUgbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWRcbiAgICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSBsZXNzIHRoYW4gcmVxdWVzdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEuXG4gICAqL1xuICBnZXRQYWdlQXN5bmModGFibGVJZDogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB0YWJsZUlkICAgICBUaGUgdGFibGUgaWQgdXNlZCB0byBmZXRjaCBkYXRhLlxuICAgKi9cbiAgcmVsZWFzZUFzeW5jKHRhYmxlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSAnLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0FjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9BbmltYXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBBbm5vdGF0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvQW5ub3RhdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9EYXRhU291cmNlU2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXhwb3J0U2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRXhwb3J0U2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9GaWx0ZXJTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvR2V0RGF0YVNlcnZpY2VJbXBsJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9QYXJhbWV0ZXJzU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvU2VsZWN0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2l6ZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1NpemVTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBWaXN1YWxNb2RlbFNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1Zpc3VhbE1vZGVsU2VydmljZUltcGwnO1xuaW1wb3J0IHsgVml6U2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvVml6U2VydmljZUltcGwnO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1pvbmVTZXJ2aWNlSW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFsbFNoYXJlZFNlcnZpY2VzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgcmVnaXN0cnlJZDogbnVtYmVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBBbmltYXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBEYXRhU291cmNlU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRXhwb3J0U2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgR2V0RGF0YVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEZpbHRlclNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFBhcmFtZXRlcnNTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBTZWxlY3Rpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBBbm5vdGF0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgWm9uZVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFNpemVTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBWaXN1YWxNb2RlbFNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFZpelNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBBY2Nlc3NpYmlsaXR5U2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIEJhc2UgaW50ZXJmYWNlIGZvciBhbiBhcGkgc2VydmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaVNlcnZpY2Uge1xuICAvKipcbiAgICogR2V0cyB0aGUgbmFtZSBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb2xsZWN0aW9uIG9mIHNlcnZpY2UgbmFtZSB3aGljaCB3aWxsIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIGFwaS1zaGFyZWQgcHJvamVjdFxuICovXG5leHBvcnQgY29uc3QgZW51bSBTZXJ2aWNlTmFtZXMge1xuICBBY2Nlc3NpYmlsaXR5ID0gJ2FjY2Vzc2liaWxpdHknLFxuICBBdXRoZW50aWNhdGlvbiA9ICdhdXRoZW50aWNhdGlvbicsXG4gIENsaWVudEluZm8gPSAnY2xpZW50LWluZm8tc2VydmljZScsXG4gIERhdGFTb3VyY2VTZXJ2aWNlID0gJ2RhdGEtc291cmNlLXNlcnZpY2UnLFxuICBHZXREYXRhID0gJ2dldC1kYXRhLXNlcnZpY2UnLFxuICBGaWx0ZXIgPSAnZmlsdGVyLXNlcnZpY2UnLFxuICBOb3RpZmljYXRpb24gPSAnbm90aWZpY2F0aW9uLXNlcnZpY2UnLFxuICBQYXJhbWV0ZXJzID0gJ3BhcmFtZXRlcnMtc2VydmljZScsXG4gIFNlbGVjdGlvbiA9ICdzZWxlY3Rpb24tc2VydmljZScsXG4gIEFubm90YXRpb24gPSAnYW5ub3RhdGlvbi1zZXJ2aWNlJyxcbiAgWm9uZSA9ICd6b25lLXNlcnZpY2UnLFxuICBBbmltYXRpb24gPSAnYW5pbWF0aW9uLXNlcnZpY2UnLFxuICBWaXogPSAndml6LXNlcnZpY2UnLFxuICBFeHRlcm5hbENvbnRleHRNZW51ID0gJ2V4dGVybmFsLWNvbnRleHQtbWVudS1zZXJ2aWNlJyxcbiAgSW5pdGlhbGl6YXRpb24gPSAnaW5pdGlhbGl6YXRpb24tc2VydmljZScsXG4gIFN0b3J5QWN0aXZhdGlvbiA9ICdzdG9yeS1hY3RpdmF0aW9uLXNlcnZpY2UnLFxuICBTaXplID0gJ3NpemUtc2VydmljZScsXG4gIEV4cG9ydCA9ICdleHBvcnQtc2VydmljZScsXG4gIFZpc3VhbE1vZGVsID0gJ3Zpc3VhbC1tb2RlbC1zZXJ2aWNlJyxcbn1cblxuLyoqXG4gKiBEbyBzb21lIGdsb2JhbCBkZWNsYXJhdGlvbnMgc28gd2UgY2FuIGNyZWF0ZSBhIHNpbmdsZXRvbiBvbiB0aGUgd2luZG93IG9iamVjdFxuICovXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIF9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeTogeyBbcmVnaXN0cnlJZDogbnVtYmVyXTogU2VydmljZVJlZ2lzdHJ5IH07XG4gIH1cbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgPSB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5IHx8IHt9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBuZXcgc2VydmljZSBpbnRvIHRoZSBzZXJ2aWNlIHJlZ2lzdHJ5LiBBbnkgZXhpc3Rpbmcgb25lIHdpbGxcbiAgICogYmUgb3ZlcndyaXR0ZW4uIHRoZSBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQgdW5kZXIgc2VydmljZS5zZXJ2aWNlTmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge0FwaVNlcnZpY2V9IHNlcnZpY2UgVGhlIHNlcnZpdmUgdG8gcmVnaXN0ZXJcbiAgICovXG4gIHJlZ2lzdGVyU2VydmljZShzZXJ2aWNlOiBBcGlTZXJ2aWNlKTogdm9pZDtcblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBnaXZlbiBzZXJ2aWNlIGZyb20gdGhlIHJlZ2lzdHJ5LiBJZiB0aGVyZSBpcyBub3QgYVxuICAgKiBzZXJ2aWNlIHJlZ2lzdGVyZWQgdW5kZXIgdGhhdCBuYW1lLCB0aHJvd3MgYW5kIGVycm9yXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHRoZSBzZXJ2aWNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXJ2aWNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZS5cbiAgICogQHJldHVybnMge1R9IFRoZSByZXF1ZXN0ZWQgc2VydmljZVxuICAgKi9cbiAgZ2V0U2VydmljZTxUIGV4dGVuZHMgQXBpU2VydmljZT4oc2VydmljZU5hbWU6IHN0cmluZyk6IFQ7XG59XG5cbmNsYXNzIFNlcnZpY2VSZWdpc3RyeUltcGwgaW1wbGVtZW50cyBTZXJ2aWNlUmVnaXN0cnkge1xuICBwcml2YXRlIF9zZXJ2aWNlczogeyBbc2VydmljZU5hbWU6IHN0cmluZ106IEFwaVNlcnZpY2UgfTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fc2VydmljZXMgPSB7fTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlclNlcnZpY2Uoc2VydmljZTogQXBpU2VydmljZSk6IHZvaWQge1xuICAgIHRoaXMuX3NlcnZpY2VzW3NlcnZpY2Uuc2VydmljZU5hbWVdID0gc2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZXJ2aWNlPFQgZXh0ZW5kcyBBcGlTZXJ2aWNlPihzZXJ2aWNlTmFtZTogc3RyaW5nKTogVCB7XG4gICAgaWYgKCF0aGlzLl9zZXJ2aWNlcy5oYXNPd25Qcm9wZXJ0eShzZXJ2aWNlTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgU2VydmljZSBub3QgcmVnaXN0ZXJlZDogJHtzZXJ2aWNlTmFtZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2VydmljZXNbc2VydmljZU5hbWVdIGFzIFQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTdGF0aWMgY2xhc3MgdXNlZCBmb3IgZ2V0dGluZyBhY2Nlc3MgdG8gdGhlIHNpbmdsZSBpbnN0YW5jZVxuICogb2YgdGhlIEFwaVNlcnZpY2VSZWdpc3RyeSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlZ2lzdHJ5SWQuXG4gKlxuICogRXh0ZW5zaW9ucyBieSBkZXNpZ24gZG9uJ3QgbmVlZCB0byBzdG9yZS9hY2Nlc3MgbXVsdGlwbGUgc2VydmljZSByZWdpc3RyaWVzLiBUaGVpciBzaW5nbGUgaW5zdGFuY2Ugb2YgU2VydmljZVJlZ2lzdHJ5IGlzXG4gKiBzdG9yZWQvYWNjZXNzIHdpdGggcmVnaXN0cnlJZCA9IDAuXG4gKlxuICogV2hlcmVhcyBFbWJlZGRpbmcgbmVlZHMgdG8gYmUgYXdhcmUgb2Ygd2hpY2ggU2VydmljZVJlZ2lzdHJ5IHRvIHVzZSB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSB2aXp6ZXMgZW1iZWRkZWQuXG4gKiBBbiBleGFtcGxlIG9mIGhvdyB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5IHdpbGwgbG9vayB3aGVuIHRoZXJlIGFyZSB0d28gdml6emVzOiB7IDAgOiBTZXJ2aWNlUmVnaXN0cnksIDEgOiBTZXJ2aWNlUmVnaXN0cnl9XG4gKiB3aGVyZSByZWdpc3RyeSBJRCBvZiAwICYgMSByZWZlcnMgdG8gdml6J3MgaW50ZXJuYWwgaWRlbnRpZmllciAod2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IFZpek1hbmFnZXIpLlxuICovXG5leHBvcnQgY2xhc3MgQXBpU2VydmljZVJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgU2VydmljZVJlZ2lzdHJ5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldChyZWdpc3RyeUlkOiBudW1iZXIpOiBTZXJ2aWNlUmVnaXN0cnkge1xuICAgIGlmICghd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB8fCAhd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeVtyZWdpc3RyeUlkXSkge1xuICAgICAgQXBpU2VydmljZVJlZ2lzdHJ5LnNldEluc3RhbmNlKHJlZ2lzdHJ5SWQsIG5ldyBTZXJ2aWNlUmVnaXN0cnlJbXBsKCkpO1xuICAgIH1cblxuICAgIGlmICghd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeVtyZWdpc3RyeUlkXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdTZXJ2aWNlIHJlZ2lzdHJ5IGZhaWxlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5W3JlZ2lzdHJ5SWRdO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdGhhdCBzZXRzIHRoZSBzZXJ2aWNlIHJlZ2lzdHJ5IGluc3RhbmNlIGZvciB0aGUgY29ycmVzcG9uZGluZyByZWdpc3RyeUlkLiBDYW4gYmUgdXNlZCBieSB1bml0IHRlc3RzXG4gICAqXG4gICAqIEBwYXJhbSB7U2VydmljZVJlZ2lzdHJ5fSBzZXJ2aWNlUmVnaXN0cnkgVGhlIG5ldyByZWdpc3RyeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRJbnN0YW5jZShyZWdpc3RyeUlkOiBudW1iZXIsIHNlcnZpY2VSZWdpc3RyeTogU2VydmljZVJlZ2lzdHJ5KTogdm9pZCB7XG4gICAgaWYgKCF3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5KSB7XG4gICAgICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5ID0ge307XG4gICAgfVxuICAgIHdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0gPSBzZXJ2aWNlUmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogT25seSB1c2VkIGJ5IHVuaXQgdGVzdHNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY2xlYXJSZWdpc3RyeSgpOiB2b2lkIHtcbiAgICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5ID0ge307XG4gIH1cblxuICAvLyBQcml2YXRlIHRvIGF2b2lkIGFueW9uZSBjb25zdHJ1Y3RpbmcgdGhpc1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgVmVyYklkLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUb29sdGlwVGV4dFJlcXVlc3RNb2RlbCB9IGZyb20gJy4uLy4uL01vZGVscy9BY2Nlc3NpYmlsaXR5TW9kZWxzJztcbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vQWNjZXNzaWJpbGl0eVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuQWNjZXNzaWJpbGl0eTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb29sdGlwVGV4dEFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgdHVwbGVJZDogbnVtYmVyKTogUHJvbWlzZTxTdHJpbmc+IHtcbiAgICBsZXQgdG9vbHRpcFRleHRSZXF1ZXN0ID0gbmV3IFRvb2x0aXBUZXh0UmVxdWVzdE1vZGVsKHZpc3VhbElkLCB0dXBsZUlkKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRUb29sdGlwVGV4dEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Ub29sdGlwVGV4dFJlcXVlc3RdOiB0b29sdGlwVGV4dFJlcXVlc3QsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFRvb2x0aXBUZXh0LCBwYXJhbWV0ZXJzKS50aGVuPFN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIFN0cmluZztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2xlYXZlTWFya05hdmlnYXRpb25Bc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuUmFpc2VMZWF2ZU1hcmtOYXZOb3RpZmljYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFJlcGxheVNwZWVkVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyBhcyBFeHRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uLy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQW5pbWF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgQW5pbWF0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBBbmltYXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuQW5pbWF0aW9uO1xuICB9XG5cbiAgcHVibGljIHJlcGxheUFzeW5jKHJlcGxheVNwZWVkOiBSZXBsYXlTcGVlZFR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLlJlcGxheVNwZWVkXTogMS4wLFxuICAgIH07XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFJlcGxheVNwZWVkVHlwZT4ocmVwbGF5U3BlZWQsIFJlcGxheVNwZWVkVHlwZSwgJ1JlcGxheVNwZWVkVHlwZScpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUmVwbGF5U3BlZWRdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLnNldFJlcGxheVNwZWVkVHlwZS5jb252ZXJ0KHJlcGxheVNwZWVkKTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlcGxheUFuaW1hdGlvbiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFubm90YXRlRW51bSwgQW5ub3RhdGlvbiwgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyLCBUdXBsZVNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vTW9kZWxzL1NlbGVjdGlvbk1vZGVscyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgQW5ub3RhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Bbm5vdGF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgQW5ub3RhdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQW5ub3RhdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBhbm5vdGF0ZSBhIG1hcmsgb24gdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBtYXJrXG4gICAqIEBwYXJhbSBhbm5vdGF0aW9uVGV4dFxuICAgKi9cbiAgcHVibGljIGFubm90YXRlTWFya0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgbWFyazogQ29udHJhY3QuTWFya0luZm8sIGFubm90YXRpb25UZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gdGhpcy5wYXJzZU1hcmtTZWxlY3Rpb25JZHMoW21hcmtdKTtcbiAgICBjb25zdCBkdW1teVRhcmdldFBvaW50ID0geyB4OiAwLCB5OiAwIH07XG4gICAgY29uc3QgZm9ybWF0dGVkVGV4dCA9IGA8Zm9ybWF0dGVkLXRleHQ+PHJ1bj4ke2Fubm90YXRpb25UZXh0fTwvcnVuPjwvZm9ybWF0dGVkLXRleHQ+YDtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhbm5vdGF0ZU1hcmtBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Bbm5vdGF0ZUVudW1dOiBBbm5vdGF0ZUVudW0uTWFyayxcbiAgICAgIFtQYXJhbWV0ZXJJZC5UYXJnZXRQb2ludF06IGR1bW15VGFyZ2V0UG9pbnQsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uTGlzdF06IFtzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb25dLFxuICAgICAgW1BhcmFtZXRlcklkLkZvcm1hdHRlZFRleHRdOiBmb3JtYXR0ZWRUZXh0LFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuQ3JlYXRlQW5ub3RhdGlvbiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIEV4cGVjdGluZyBhbiBlbXB0eSBtb2RlbCBhbmQgaGVuY2UgdGhlIHZvaWQgcmVzcG9uc2UuXG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHJldHJpZXZlIGFubm90YXRpb25zIGZvciB0aGUgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8QW5ub3RhdGlvbj4+fVxuICAgKi9cbiAgcHVibGljIGdldEFubm90YXRpb25zQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRBbm5vdGF0aW9uc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0QW5ub3RhdGlvbnMsIHBhcmFtZXRlcnMpLnRoZW48QXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgYW5ub3RhdGlvbnNMaXN0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PEFubm90YXRpb24+O1xuICAgICAgcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkZpbHRlck1hcChhbm5vdGF0aW9uc0xpc3QpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byByZW1vdmUgYW4gYW5ub3RhdGlvbiBmcm9tIGEgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHBhcmFtIGFubm90YXRpb25cbiAgICovXG4gIHB1YmxpYyByZW1vdmVBbm5vdGF0aW9uQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VBbm5vdGF0aW9uU2VsZWN0aW9uSWRzKFthbm5vdGF0aW9uXSk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVtb3ZlQW5ub3RhdGlvbkFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvbkxpc3RdOiBbc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uXSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlbW92ZUFubm90YXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBwcmVwYXJlIHRoZSBwcmVzIG1vZGVscyBmb3Igc2VsZWN0aW9uIGJ5IE1hcmtzSW5mb1xuICAgKiBAcGFyYW0gbWFya3NcbiAgICovXG4gIHByaXZhdGUgcGFyc2VNYXJrU2VsZWN0aW9uSWRzKG1hcmtzOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IGlkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG4gICAgbWFya3MuZm9yRWFjaCgobWFyaykgPT4ge1xuICAgICAgY29uc3QgdHVwbGVJZDogbnVtYmVyIHwgdW5kZWZpbmVkID0gbWFyay50dXBsZUlkO1xuICAgICAgaWYgKHR1cGxlSWQgIT09IHVuZGVmaW5lZCAmJiB0dXBsZUlkICE9PSBudWxsICYmIHR1cGxlSWQgPiAwKSB7XG4gICAgICAgIGlkcy5wdXNoKHR1cGxlSWQudG9TdHJpbmcoKSk7IC8vIGNvbGxlY3QgdGhlIHR1cGxlIGlkc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIHR1cGxlSWQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgLy8gdHVwbGUgaWRzIGJhc2VkIHNlbGVjdGlvblxuICAgICAgY29uc3QgdHVwbGVTZWxlY3Rpb25Nb2RlbDogVHVwbGVTZWxlY3Rpb25Nb2RlbCA9IG5ldyBUdXBsZVNlbGVjdGlvbk1vZGVsKCk7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLnNlbGVjdGlvblR5cGUgPSAndHVwbGVzJztcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwub2JqZWN0SWRzID0gaWRzO1xuICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uID0gdHVwbGVTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBwcmVwYXJlIHRoZSBwcmVzIG1vZGVscyBmb3Igc2VsZWN0aW9uIGJ5IE1hcmtBbm5vdGF0aW9uSW5mb1xuICAgKiBAcGFyYW0gbWFya3NcbiAgICovXG4gIHByaXZhdGUgcGFyc2VBbm5vdGF0aW9uU2VsZWN0aW9uSWRzKGFubm90YXRpb25zOiBBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPik6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gICAgY29uc3QgaWRzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IG5ldyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIoKTtcbiAgICBhbm5vdGF0aW9ucy5mb3JFYWNoKChhbm5vdGF0aW9uKSA9PiB7XG4gICAgICBjb25zdCBhbm5vdGF0aW9uSWQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IGFubm90YXRpb24uYW5ub3RhdGlvbklkO1xuICAgICAgaWYgKGFubm90YXRpb25JZCAhPT0gdW5kZWZpbmVkICYmIGFubm90YXRpb25JZCAhPT0gbnVsbCAmJiBhbm5vdGF0aW9uSWQgPj0gMCkge1xuICAgICAgICBpZHMucHVzaChhbm5vdGF0aW9uSWQudG9TdHJpbmcoKSk7IC8vIGNvbGxlY3QgdGhlIGFubm90YXRpb24gaWRzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgYW5ub3RhdGlvbklkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IDApIHtcbiAgICAgIC8vIGFubm90YXRpb24gaWRzIGJhc2VkIHNlbGVjdGlvblxuICAgICAgY29uc3QgdHVwbGVTZWxlY3Rpb25Nb2RlbDogVHVwbGVTZWxlY3Rpb25Nb2RlbCA9IG5ldyBUdXBsZVNlbGVjdGlvbk1vZGVsKCk7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLnNlbGVjdGlvblR5cGUgPSAnYW5ub3RhdGlvbnMnO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5vYmplY3RJZHMgPSBpZHM7XG4gICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb24gPSB0dXBsZVNlbGVjdGlvbk1vZGVsO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZWxDb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIG1hcCBBbm5vdGF0aW9uIHRvIE1hcmtBbm5vdGF0aW9uSW5mb1xuICAgKiBAcGFyYW0gYW5ub3RhdGlvblxuICAgKiBAcmV0dXJucyB7QW5ub3RhdGlvbn1cbiAgICovXG4gIHByaXZhdGUgbWFwQW5ub3RhdGlvbihhbm5vdGF0aW9uOiBBbm5vdGF0aW9uKTogQ29udHJhY3QuQW5ub3RhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFubm90YXRpb25IVE1MOiBhbm5vdGF0aW9uLmFubm90YXRpb25UZXh0LFxuICAgICAgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uLmFubm90YXRpb25JZCxcbiAgICAgIGFubm90YXRpb25UZXh0OiBhbm5vdGF0aW9uLmFubm90YXRpb25QbGFpblRleHQsXG4gICAgICBhbm5vdGF0aW9uVHlwZTogSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmFubm90YXRpb25UeXBlLmNvbnZlcnQoYW5ub3RhdGlvbi5hbm5vdGF0ZUVudW0pLFxuICAgICAgdHVwbGVJZDogYW5ub3RhdGlvbi50dXBsZUlkISxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciB0aGUgQW5ub3RhdGlvbnMgdG8gTWFyayBBbm5vdGF0aW9ucywgYW5kIG1hcCB0aGVtIHRvIE1hcmtBbm5vdGF0aW9uSW5mb1xuICAgKiBAcGFyYW0gYW5ub3RhdGlvbnNcbiAgICogQHJldHVybnMge0FycmF5PEFubm90YXRpb24+fVxuICAgKi9cbiAgcHJpdmF0ZSBhbm5vdGF0aW9uRmlsdGVyTWFwKGFubm90YXRpb25zOiBBcnJheTxBbm5vdGF0aW9uPik6IEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+IHtcbiAgICBjb25zdCBhbm5vdGF0aW9uSW5mb3MgPSBhbm5vdGF0aW9ucy5tYXAoKGFubm90YXRpb24pID0+IHRoaXMubWFwQW5ub3RhdGlvbihhbm5vdGF0aW9uKSk7XG5cbiAgICByZXR1cm4gYW5ub3RhdGlvbkluZm9zO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFbWJlZGRpbmdCb290c3RyYXBJbmZvLCBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDbGllbnRJbmZvU2VydmljZSB9IGZyb20gJy4uL0NsaWVudEluZm9TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBDbGllbnRJbmZvU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBDbGllbnRJbmZvU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkNsaWVudEluZm87XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2xpZW50SW5mb0FzeW5jKCk6IFByb21pc2U8RW1iZWRkaW5nQm9vdHN0cmFwSW5mbz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RW1iZWRkaW5nQ2xpZW50SW5mbztcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q2xpZW50SW5mb0FzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEVtYmVkZGluZ0Jvb3RzdHJhcEluZm8+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY2xpZW50SW5mbyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFbWJlZGRpbmdCb290c3RyYXBJbmZvO1xuICAgICAgcmV0dXJuIGNsaWVudEluZm87XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnksXG4gIERhdGFTY2hlbWEsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXIsXG4gIExvZ2ljYWxUYWJsZUluZm8sXG4gIFBhcmFtZXRlcklkLFxuICBUYWJsZUluZm8sXG4gIFRhYmxlSW5mb3MsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vRGF0YVNvdXJjZSc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4uLy4uL0ZpZWxkJztcbmltcG9ydCB7IERhdGFTb3VyY2VJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0ZpZWxkSW1wbCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRGF0YVNvdXJjZVNlcnZpY2UgfSBmcm9tICcuLi9EYXRhU291cmNlU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuZXhwb3J0IGNsYXNzIERhdGFTb3VyY2VTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIERhdGFTb3VyY2VTZXJ2aWNlIHtcbiAgLy8gU2luY2UgT2JqZWN0IE1vZGVsIGlzIHN1cHBvcnRlZCBzaW5jZSBUYWJsZWF1IDIwMjAuMiwgRGF0YVNvdXJjZVNlcnZpY2VJbXBsIGNhbiBiZSBpbml0aWFsaXplZCB3aXRoIHRoZVxuICAvLyBwbGF0Zm9ybSB2ZXJzaW9uIHdoZW4gT00gd2FzIHN1cHBvcnRlZC4gT25jZSB3ZSBkcm9wIHN1cHBvcnQgZm9yIFRhYmxlYXUgdmVyc2lvbnMgPD0gMjAyMC4xLCBhbGwgYWRkaXRpb25hbFxuICAvLyBjb2RlIGluIGhlcmUgZm9yIE9iamVjdCBNb2RlbCBjYW4gYmUgcmVtb3ZlZC5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgcmVnaXN0cnlJZDogbnVtYmVyKSB7XG4gICAgc3VwZXIoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCk7XG4gIH1cbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKGRhdGFTb3VyY2VJZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZWZyZXNoQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRlbHRhVGltZU1zXTogMCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG91bGRSZWZyZXNoRFNdOiB0cnVlLFxuICAgIH07XG5cbiAgICAvLyBPbiBzZXJ2ZXI6IE5vdCBwYXNzaW5nIHRoZSBkYXRhc291cmNlIGlkIHdpbGwgcmVmcmVzaCBhbGwgZGF0YXNvdXJjZXMuXG4gICAgaWYgKGRhdGFTb3VyY2VJZCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdID0gZGF0YVNvdXJjZUlkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlZnJlc2hEYXRhU291cmNlLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEFjdGl2ZVRhYmxlc0FzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxUYWJsZUluZm8+PiB7XG4gICAgY29uc3Qgam9pblBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRBY3RpdmVUYWJsZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YVNvdXJjZUlkLFxuICAgIH07XG5cbiAgICAvLyBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0YWJsZXMgdXNlZCBieSB0aGlzIGNvbm5lY3Rpb25cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRBY3RpdmVUYWJsZXMsIGpvaW5QYXJhbWV0ZXJzKS50aGVuPEFycmF5PFRhYmxlSW5mbz4+KChqb2luUmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlSW5mb3MgPSBqb2luUmVzcG9uc2UucmVzdWx0IGFzIFRhYmxlSW5mb3M7XG5cbiAgICAgIC8vIGdldEFjdGl2ZVRhYmxlcyBpcyB1bnN1cHBvcnRlZCBmb3IgY3ViZXMgYW5kIEdBLiBXZSBkbyBub3QgaGF2ZSBhIGNvbm5lY3Rpb24gdHlwZSBwcm9wZXJ0eVxuICAgICAgLy8gYXZhaWxhYmxlIGZyb20gdGhlIHBsYXRmb3JtIChpbnRlbnRpb25hbGx5LCB0byByZWR1Y2UgY29kZSBjaHVybiBhcyBuZXcgY29ubmVjdGlvbnMgYXJlIGFkZGVkKS5cbiAgICAgIC8vIEluc3RlYWQsanVzdCBjaGVjayBpZiBhbnkgdGFibGVzIGFyZSByZXR1cm5lZC4gVGhpcyBhcnJheSB3aWxsIGJlIGVtcHR5IGZvciBhbnkgbm9uLXRhYmxlIGJhc2VkIGRhdGFzb3VyY2UuXG4gICAgICBpZiAodGFibGVJbmZvcy50YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5VbnN1cHBvcnRlZE1ldGhvZEZvckRhdGFTb3VyY2VUeXBlLCBgZ2V0QWN0aXZlVGFibGVzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlSW5mb3MudGFibGVzO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxEYXRhU2NoZW1hPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldERhdGFTb3VyY2VzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhU291cmNlcywgcGFyYW1ldGVycykudGhlbjxEYXRhU2NoZW1hPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFTY2hlbWEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVNjaGVtYTtcbiAgICAgIHJldHVybiBkYXRhU2NoZW1hO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEFsbERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxEYXRhU2NoZW1hPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEFsbERhdGFTb3VyY2VzQXN5bmMnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0QWxsRGF0YVNvdXJjZXMsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVNjaGVtYT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFTY2hlbWE7XG4gICAgICByZXR1cm4gZGF0YVNjaGVtYTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoZGF0YVNvdXJjZUlkOiBzdHJpbmcpOiBQcm9taXNlPENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YVNvdXJjZUlkLFxuICAgIH07XG5cbiAgICAvLyBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0YWJsZXMgdXNlZCBieSB0aGlzIGNvbm5lY3Rpb25cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMsIHBhcmFtcykudGhlbjxDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5W10+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRpb25TdW1tYXJpZXMgPSByZXNwb25zZS5yZXN1bHQgYXMgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeVtdO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uU3VtbWFyaWVzO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEZpZWxkQXN5bmMoZ2xvYmFsZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPENvbnRyYWN0LkZpZWxkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRGaWVsZEFuZERhdGFTb3VyY2U7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEZpZWxkQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkZpZWxkSWRdOiBnbG9iYWxmaWVsZE5hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5GaWVsZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkYXRhU291cmNlID0gcmVzcG9uc2UucmVzdWx0W1BhcmFtZXRlcklkLkRhdGFTb3VyY2VdIGFzIEludGVybmFsQ29udHJhY3QuRGF0YVNvdXJjZTtcbiAgICAgIGNvbnN0IGZpZWxkID0gcmVzcG9uc2UucmVzdWx0W1BhcmFtZXRlcklkLkZpZWxkXSBhcyBGaWVsZDtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRGaWVsZChmaWVsZCwgdGhpcy5jb252ZXJ0RGF0YVNvdXJjZShkYXRhU291cmNlKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlc0FzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4ge1xuICAgIGNvbnN0IHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldExvZ2ljYWxUYWJsZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YVNvdXJjZUlkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0TG9naWNhbFRhYmxlcywgcGFyYW1zKS50aGVuPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8TG9naWNhbFRhYmxlSW5mbz47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRVbmRlcmx5aW5nVGFibGVzLCBwYXJhbXMpLnRoZW48QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxMb2dpY2FsVGFibGVJbmZvPjtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEZpZWxkKGZpZWxkOiBJbnRlcm5hbENvbnRyYWN0LkZpZWxkLCBkYXRhU291cmNlOiBDb250cmFjdC5EYXRhU291cmNlKTogQ29udHJhY3QuRmllbGQge1xuICAgIHJldHVybiBuZXcgRmllbGQobmV3IEZpZWxkSW1wbChmaWVsZCwgZGF0YVNvdXJjZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGF0YVNvdXJjZShkYXRhU291cmNlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFTb3VyY2UpOiBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgICByZXR1cm4gbmV3IERhdGFTb3VyY2UobmV3IERhdGFTb3VyY2VJbXBsKGRhdGFTb3VyY2UsIHRoaXMuX3JlZ2lzdHJ5SWQpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4cG9ydENyb3NzdGFiU2hlZXRNYXAsXG4gIEV4cG9ydEZpbGUsXG4gIEV4cG9ydFBERk9wdGlvbnMgYXMgSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICBQYXJhbWV0ZXJJZCxcbiAgVmVyYklkLFxuICBWaXN1YWxJZCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIENyb3NzdGFiRmlsZUZvcm1hdCxcbiAgRXhwb3J0RGF0YU9wdGlvbnMsXG4gIEV4cG9ydFBERk9wdGlvbnMgYXMgRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICBFeHBvcnRTY2VuYXJpb3NGb3JQREZBbmRQb3dlclBvaW50LFxuICBTaGFyZWRFcnJvckNvZGVzLFxuICBTaGVldFR5cGUgYXMgRXh0ZXJuYWxTaGVldFR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IEV4cG9ydEhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FeHBvcnRIZWxwZXJzJztcbmltcG9ydCB7IEV4cG9ydFNlcnZpY2UgfSBmcm9tICcuLi9FeHBvcnRTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEV4cG9ydFNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRXhwb3J0U2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkV4cG9ydDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwQXN5bmMoY3VycmVudFNoZWV0VHlwZTogRXh0ZXJuYWxTaGVldFR5cGUpOiBQcm9taXNlPEV4cG9ydENyb3NzdGFiU2hlZXRNYXA+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldEV4cG9ydENyb3NzdGFiU2hlZXRNYXA7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEV4cG9ydENyb3NzdGFiU2hlZXRNYXBBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VycmVudFNoZWV0VHlwZV06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaGVldFR5cGUuY29udmVydChjdXJyZW50U2hlZXRUeXBlKSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxFeHBvcnRDcm9zc3RhYlNoZWV0TWFwPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHBvcnRDcm9zc3RhYlNoZWV0TWFwO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBleHBvcnRDcm9zc3RhYkFzeW5jKFxuICAgIHNoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZvcm1hdDogQ3Jvc3N0YWJGaWxlRm9ybWF0LFxuICAgIGV4cG9ydGFibGVXb3Jrc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPixcbiAgICBjdXJyZW50U2hlZXRUeXBlOiBFeHRlcm5hbFNoZWV0VHlwZSxcbiAgKTogUHJvbWlzZTxFeHBvcnRGaWxlPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVNoZWV0TmFtZShleHBvcnRhYmxlV29ya3NoZWV0TmFtZXMsIHNoZWV0TmFtZSk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxDcm9zc3RhYkZpbGVGb3JtYXQ+KGZvcm1hdCwgQ3Jvc3N0YWJGaWxlRm9ybWF0LCAnQ3Jvc3N0YWJGaWxlRm9ybWF0Jyk7XG5cbiAgICAvLyBUaGUgcHJlcyBsYXllciBjb21tYW5kIGZvciBleHBvcnRpbmcgQ3Jvc3N0YWIgdXNlcyBTaW1wbGVTaGVldElkZW50aWZpZXJzIGluc3RlYWQgb2Ygc2hlZXQgbmFtZXMuXG4gICAgLy8gVGhlIGV4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkgY3VycmVudCBkb2VzIG5vdCBzdG9yZSByZWZlcmVuY2VzIHRvIHRoZSBTaW1wbGVTaGVldElkZW50aWZpZXJzIG9mIGl0cyBzaGVldHNcbiAgICAvLyBzbyB3ZSBjYWxsIGEgcHJlcyBsYXllciBjb21tYW5kIHRoYXQgZ2l2ZXMgdXMgdGhlIFNpbXBsZVNoZWV0SWRlbnRpZmllciBmb3IgZWFjaCBzaGVldCBuYW1lIHRoYXQgYXBwZWFycyBpbiB0aGVcbiAgICAvLyBleHBvcnQgQ3Jvc3N0YWIgZGlhbG9nIHBvcHVwLlxuICAgIGNvbnN0IHNoZWV0TmFtZVRvSWRNYXAgPSBhd2FpdCB0aGlzLmdldEV4cG9ydENyb3NzdGFiU2hlZXRNYXBBc3luYyhjdXJyZW50U2hlZXRUeXBlKTtcbiAgICBpZiAoIXNoZWV0TmFtZVRvSWRNYXBbc2hlZXROYW1lXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdtaXNzaW5nIHNoZWV0IGRvYyBpZCBmcm9tIHNoZWV0TWFwJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2V4cG9ydENyb3NzdGFiQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlNoZWV0SWRlbnRpZmllcl06IHNoZWV0TmFtZVRvSWRNYXBbc2hlZXROYW1lXSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZW5kTm90aWZpY2F0aW9uc106IHRydWUsIC8vIHNlbmQgbm90aWZpY2F0aW9uIG9uIHByZXMgbGF5ZXIgdGhhdCB0cmlnZ2VycyBmaWxlIGRvd25sb2FkXG4gICAgfTtcblxuICAgIC8vIHByZXMgbGF5ZXIgY29tbWFuZCBpbnZva2VkIGRlcGVuZHMgb24gdGhlIGNyb3NzdGFiIGZpbGUgZm9ybWF0XG4gICAgbGV0IHZlcmI7XG4gICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgIGNhc2UgQ3Jvc3N0YWJGaWxlRm9ybWF0LkNTVjpcbiAgICAgICAgdmVyYiA9IFZlcmJJZC5FeHBvcnRDcm9zc3RhYkNzdkRvd25sb2FkO1xuICAgICAgICAvLyBDU1Ygb25seSBwYXJhbWV0ZXI6IHNlZSBicm93c2VyLWNsaWVudHMvZXhwb3J0LWNyb3NzdGFiLW9wdGlvbnMtZGlhbG9nIHJlcG9cbiAgICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Vc2VUYWJEZWxpbWl0ZXJzXSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDcm9zc3RhYkZpbGVGb3JtYXQuRXhjZWw6XG4gICAgICAgIHZlcmIgPSBWZXJiSWQuRXhwb3J0Q3Jvc3N0YWJFeGNlbERvd25sb2FkO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAndW5zdXBwb3J0ZWQgQ3Jvc3N0YWIgZmlsZSBmb3JtYXQuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKVxuICAgICAgLnRoZW48RXhwb3J0RmlsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHBvcnRGaWxlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5Dcm9zc3RhYkNyZWF0aW9uRXJyb3IsICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGRvY3VtZW50LicpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZXhwb3J0RGF0YUFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgb3B0aW9uczogRXhwb3J0RGF0YU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RXhwb3J0RGF0YU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICAvLyBSZW1vdmUgYW55IGR1cGxpY2F0ZXMgZnJvbSB0aGUgaW5wdXQgYXJyYXlcbiAgICBjb25zdCBjb2x1bW5zQXNTZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldChvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkKTtcbiAgICBjb25zdCBjb2x1bW5zVG9JbmNsdWRlQnlJZCA9IEFycmF5LmZyb20oY29sdW1uc0FzU2V0KTtcblxuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuRXhwb3J0RGF0YURvd25sb2FkO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleHBvcnREYXRhQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IG9wdGlvbnMuaWdub3JlQWxpYXNlcyA/PyBmYWxzZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IGNvbHVtbnNUb0luY2x1ZGVCeUlkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpXG4gICAgICAudGhlbjx2b2lkPigoKSA9PiB7fSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5EYXRhQ3JlYXRpb25FcnJvciwgJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgZ2VuZXJhdGluZyB0aGUgZG9jdW1lbnQuJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBleHBvcnRQb3dlclBvaW50QXN5bmMoc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPiwgZXhwb3J0U2NlbmFyaW9zOiBFeHBvcnRTY2VuYXJpb3NGb3JQREZBbmRQb3dlclBvaW50KTogUHJvbWlzZTxFeHBvcnRGaWxlPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVNoZWV0TmFtZXNGb3JQREZBbmRQUFQoc2hlZXROYW1lcywgZXhwb3J0U2NlbmFyaW9zKTtcblxuICAgIC8vIE5vdGU6IHRoZSBFeHBvcnRPcmlnaW5VcmwgcGFyYW0gaXMgbGlzdGVkIGFzIG9wdGlvbmFsIGZvciB0aGUgcHJlcyBsYXllciBjb21tYW5kIHdlIGFyZSBpbnZva2luZzsgaG93ZXZlcixcbiAgICAvLyByZWNlbnQgY2hhbmdlcyB3ZXJlIG1hZGUgdGhhdCBlbmZvcmNlZCB0aGUgdXNlIG9mIHRoZSBlbXB0eSBzdHJpbmcgd2hlbiBpbnZva2luZyB0aGlzIGNvbW1hbmQgd2l0aCBubyBFeHBvcnRPcmlnaW5VcmwuXG4gICAgLy8gc2VlIGJyb3dzZXItY2xpZW50cy9leHBvcnQtcG93ZXJwb2ludC1vcHRpb25zLWRpYWxvZyByZXBvLlxuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuRXhwb3J0UG93ZXJwb2ludERvd25sb2FkO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleHBvcnRQb3dlclBvaW50QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4cG9ydE9yaWdpblVybF06ICcnLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGVkU2hlZXROYW1lc106IHNoZWV0TmFtZXMsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycylcbiAgICAgIC50aGVuPEV4cG9ydEZpbGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXhwb3J0RmlsZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICAgIFNoYXJlZEVycm9yQ29kZXMuUG93ZXJQb2ludENyZWF0aW9uRXJyb3IsXG4gICAgICAgICAgJ0FuIGVycm9yIG9jY3VyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBnZW5lcmF0ZSB0aGUgUG93ZXJQb2ludCBmaWxlLicsXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBleHBvcnRQREZBc3luYyhcbiAgICBzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIGV4dGVybmFsRXhwb3J0UGRmT3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICAgIGV4cG9ydFNjZW5hcmlvczogRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCxcbiAgKTogUHJvbWlzZTxFeHBvcnRGaWxlPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUV4cG9ydFBERk9wdGlvbnMoZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U2hlZXROYW1lc0ZvclBERkFuZFBQVChzaGVldE5hbWVzLCBleHBvcnRTY2VuYXJpb3MpO1xuXG4gICAgY29uc3QgaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zOiBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMgPSBhd2FpdCB0aGlzLmdldEV4cG9ydFBERk9wdGlvbnNBc3luYygpO1xuICAgIEV4cG9ydEhlbHBlcnMudXBkYXRlSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zKGludGVybmFsRXhwb3J0UGRmT3B0aW9ucywgZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zLCBzaGVldE5hbWVzKTtcblxuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuRXhwb3J0UGRmRG93bmxvYWQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2V4cG9ydFBERkFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHBvcnRQZGZPcHRpb25zXTogaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpXG4gICAgICAudGhlbjxFeHBvcnRGaWxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4cG9ydEZpbGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLlBERkNyZWF0aW9uRXJyb3IsICdVbmFibGUgdG8gY3JlYXRlIFBERiBiZWNhdXNlIHNvbWV0aGluZyB3ZW50IHdyb25nLiBUcnkgYWdhaW4uJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRFeHBvcnRQREZPcHRpb25zQXN5bmMoKTogUHJvbWlzZTxJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnM+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldEV4cG9ydFBkZk9wdGlvbnM7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEV4cG9ydFBkZk9wdGlvbnNBc3luYycsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48SW50ZXJuYWxFeHBvcnRQREZPcHRpb25zPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnM7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBBcGlNZW51VHlwZSwgQ29udGV4dE1lbnVPcHRpb25zIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlIH0gZnJvbSAnLi4vRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuRXh0ZXJuYWxDb250ZXh0TWVudTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBlbmRDb250ZXh0TWVudUFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCB0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgY29uZmlnOiBDb250ZXh0TWVudU9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwZW5kRXh0ZXJuYWxNZW51SXRlbTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwZW5kQ29udGV4dE1lbnVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHNoZWV0TmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVJdGVtRGlzcGxheU5hbWVdOiBjb25maWcuZGlzcGxheU5hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgbmV3TWVudUl0ZW1JZCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgICByZXR1cm4gbmV3TWVudUl0ZW1JZDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVDb250ZXh0TWVudUFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCB0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5SZW1vdmVFeHRlcm5hbE1lbnVJdGVtO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZW1vdmVDb250ZXh0TWVudUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogc2hlZXROYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVybmFsTWVudUl0ZW1JZF06IG1lbnVJdGVtSWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBleGVjdXRlQ29udGV4dE1lbnVBc3luYyhzaGVldE5hbWU6IHN0cmluZywgdGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVJdGVtSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuRXhlY3V0ZUV4dGVybmFsTWVudUl0ZW07XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2V4ZWN1dGVDb250ZXh0TWVudUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogc2hlZXROYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVybmFsTWVudUl0ZW1JZF06IG1lbnVJdGVtSWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZW5hbWVDb250ZXh0TWVudUFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCB0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUhlYWRlcjogc3RyaW5nLCBtZW51RGVzY3JpcHRpb246IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuUmVuYW1lRXh0ZXJuYWxNZW51O1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZW5hbWVDb250ZXh0TWVudUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogc2hlZXROYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVybmFsTWVudUhlYWRlcl06IG1lbnVIZWFkZXIsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51RGVzY3JpcHRpb25dOiBtZW51RGVzY3JpcHRpb24sXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIERhdGVSYW5nZVR5cGUsXG4gIEVtYmVkZGluZ0Vycm9yQ29kZXMsXG4gIEVycm9yQ29kZXMsXG4gIEZpbHRlckRvbWFpblR5cGUsXG4gIEZpbHRlclR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJUeXBlLFxuICBTaGFyZWRFcnJvckNvZGVzLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0ICogYXMgSW50ZXJuYWxDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEZpbHRlclR5cGUsIFBhcmFtZXRlcklkLCBWZXJiSWQsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uLy4uL0FwaVNoYXJlZCc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRXh0ZXJuYWxFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgYXMgSW50ZXJuYWxFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQge1xuICBDYXRlZ29yaWNhbERvbWFpbixcbiAgQ2F0ZWdvcmljYWxGaWx0ZXIsXG4gIEhpZXJhcmNoaWNhbERhdGFWYWx1ZSxcbiAgSGllcmFyY2hpY2FsRmlsdGVyLFxuICBIaWVyYXJjaGljYWxMZXZlbERldGFpbCxcbiAgUmFuZ2VEb21haW4sXG4gIFJhbmdlRmlsdGVyLFxuICBSZWxhdGl2ZURhdGVGaWx0ZXIsXG59IGZyb20gJy4uLy4uL01vZGVscy9GaWx0ZXJNb2RlbHMnO1xuaW1wb3J0IHsgRGF0YVZhbHVlIH0gZnJvbSAnLi4vLi4vTW9kZWxzL0dldERhdGFNb2RlbHMnO1xuaW1wb3J0IHsgRGF0YVZhbHVlRmFjdG9yeSB9IGZyb20gJy4uLy4uL1V0aWxzL0RhdGFWYWx1ZUZhY3RvcnknO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuLi8uLi9VdGlscy9QYXJhbSc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vRmlsdGVyU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgRmlsdGVyU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBGaWx0ZXJTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuRmlsdGVyO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBseUNhdGVnb3JpY2FsRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBseUZpbHRlckFzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZE5hbWVdID0gZmllbGROYW1lO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ3ZhbHVlcyBwYXJhbWV0ZXIgZm9yIGFwcGx5RmlsdGVyQXN5bmMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclZhbHVlc10gPSB2YWx1ZXM7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJVcGRhdGVUeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJVcGRhdGVUeXBlLmNvbnZlcnQodXBkYXRlVHlwZSk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Jc0V4Y2x1ZGVNb2RlXSA9XG4gICAgICBmaWx0ZXJPcHRpb25zID09PSB1bmRlZmluZWQgfHwgZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlID09PSB1bmRlZmluZWQgPyBmYWxzZSA6IGZpbHRlck9wdGlvbnMuaXNFeGNsdWRlTW9kZTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkTmFtZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJhbmdlRmlsdGVyQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBmaWVsZE5hbWU6IHN0cmluZywgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuUmFuZ2VGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFwcGx5UmFuZ2VGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5UmFuZ2VGaWx0ZXJBc3luYycsXG4gICAgfTtcblxuICAgIGlmIChmaWx0ZXJPcHRpb25zLm1pbiAhPT0gdW5kZWZpbmVkICYmIGZpbHRlck9wdGlvbnMubWluICE9PSBudWxsKSB7XG4gICAgICBsZXQgbWluOiBzdHJpbmcgfCBudW1iZXI7XG4gICAgICBpZiAoZmlsdGVyT3B0aW9ucy5taW4gaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIG1pbiA9IFBhcmFtLnNlcmlhbGl6ZURhdGVGb3JQbGF0Zm9ybShmaWx0ZXJPcHRpb25zLm1pbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtaW4gPSBmaWx0ZXJPcHRpb25zLm1pbjtcbiAgICAgIH1cbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyUmFuZ2VNaW5dID0gbWluO1xuICAgIH1cblxuICAgIGlmIChmaWx0ZXJPcHRpb25zLm1heCAhPT0gdW5kZWZpbmVkICYmIGZpbHRlck9wdGlvbnMubWF4ICE9PSBudWxsKSB7XG4gICAgICBsZXQgbWF4OiBzdHJpbmcgfCBudW1iZXI7XG4gICAgICBpZiAoZmlsdGVyT3B0aW9ucy5tYXggaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICAgIG1heCA9IFBhcmFtLnNlcmlhbGl6ZURhdGVGb3JQbGF0Zm9ybShmaWx0ZXJPcHRpb25zLm1heCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXggPSBmaWx0ZXJPcHRpb25zLm1heDtcbiAgICAgIH1cbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyUmFuZ2VNYXhdID0gbWF4O1xuICAgIH1cblxuICAgIC8vIFRoZSBudWxsIG9wdGlvbiBpcyB1c2VkIHdpdGggbWluK21heCBmb3IgJ2luY2x1ZGUtcmFuZ2UnIG9yICdpbmNsdWRlLXJhbmdlLW9yLW51bGwnXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubnVsbE9wdGlvbikge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU51bGxPcHRpb25dID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLm51bGxPcHRpb25zLmNvbnZlcnQoZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uKTtcbiAgICB9XG5cbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgdGhpcy5hcGlGaWx0ZXJIYW5kbGVyQ2hlY2tGb3JDb21tYW5kRXJyb3IocmVzcG9uc2UucmVzdWx0IGFzIHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0pO1xuICAgICAgcmV0dXJuIGZpZWxkTmFtZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4gfCBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbHMsXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuSGllcmFyY2hpY2FsRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZE5hbWVdID0gZmllbGROYW1lO1xuXG4gICAgY29uc3QgaGllcmFyY2hpY2FsTGV2ZWxzID0gKHZhbHVlcyBhcyBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbHMpLmxldmVscztcblxuICAgIGlmIChBcnJheS5pc0FycmF5KGhpZXJhcmNoaWNhbExldmVscykgJiYgaGllcmFyY2hpY2FsTGV2ZWxzLmxlbmd0aCA+IDApIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyTGV2ZWxzXSA9IGhpZXJhcmNoaWNhbExldmVscztcbiAgICB9IGVsc2UgaWYgKCh2YWx1ZXMgYXMgQXJyYXk8U3RyaW5nPikubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJWYWx1ZXNdID0gdmFsdWVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB0aGUgc2VydmVyIGNvbW1hbmQgZXhwZWN0cyBlbXB0eSBsaXN0IGZvciBjbGVhcmluZyB0aGUgZmlsdGVyXG4gICAgICAvLyBpdCBhbHNvIGV4cGVjdHMgZWl0aGVycyBGaWx0ZXJMZXZlbHMgb3IgRmlsdGVyVmFsdWVzIHRvIGJlIHNldFxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJMZXZlbHNdID0gW107XG4gICAgfVxuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJVcGRhdGVUeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJVcGRhdGVUeXBlLmNvbnZlcnQodXBkYXRlVHlwZSk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Jc0V4Y2x1ZGVNb2RlXSA9IGZpbHRlck9wdGlvbnMgJiYgISFmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGU7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiBmaWVsZE5hbWU7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkNsZWFyRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjbGVhckZpbHRlckFzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZE5hbWVdID0gZmllbGROYW1lO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KChyZXNwb3NuZSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkTmFtZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgZmllbGROYW1lOiBzdHJpbmcsIG9wdGlvbnM6IENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlck9wdGlvbnMpIHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZE5hbWVdID0gZmllbGROYW1lO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUGVyaW9kVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIucGVyaW9kVHlwZS5jb252ZXJ0KG9wdGlvbnMucGVyaW9kVHlwZSk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5EYXRlUmFuZ2VUeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5kYXRlUmFuZ2VUeXBlLmNvbnZlcnQob3B0aW9ucy5yYW5nZVR5cGUpO1xuICAgIGlmIChvcHRpb25zLnJhbmdlVHlwZSA9PT0gRGF0ZVJhbmdlVHlwZS5MYXN0TiB8fCBvcHRpb25zLnJhbmdlVHlwZSA9PT0gRGF0ZVJhbmdlVHlwZS5OZXh0Tikge1xuICAgICAgaWYgKG9wdGlvbnMucmFuZ2VOID09PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5yYW5nZU4gPT09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgICBFbWJlZGRpbmdFcnJvckNvZGVzLk1pc3NpbmdSYW5nZU5Gb3JSZWxhdGl2ZURhdGVGaWx0ZXJzLFxuICAgICAgICAgICdNaXNzaW5nIHJhbmdlTiBmaWVsZCBmb3IgYSByZWxhdGl2ZSBkYXRlIGZpbHRlciBvZiBMQVNUTiBvciBORVhUTi4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5SYW5nZU5dID0gb3B0aW9ucy5yYW5nZU47XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMuYW5jaG9yRGF0ZSAhPT0gdW5kZWZpbmVkICYmIG9wdGlvbnMuYW5jaG9yRGF0ZSAhPT0gbnVsbCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5BbmNob3JEYXRlXSA9IHRoaXMuY29udmVydEFuY2hvckRhdGUob3B0aW9ucy5hbmNob3JEYXRlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48c3RyaW5nPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlcnNBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldEZpbHRlcnM7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEZpbHRlcnNBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxBcnJheTxDb250cmFjdC5GaWx0ZXI+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlcnMgPSByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8SW50ZXJuYWxDb250cmFjdC5GaWx0ZXI+O1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydERvbWFpbkZpbHRlcnMoZmlsdGVycyk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2F0ZWdvcmljYWxEb21haW5Bc3luYyhcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGRvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUsXG4gICk6IFByb21pc2U8Q29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldENhdGVnb3JpY2FsRG9tYWluO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRDYXRlZ29yaWNhbERvbWFpbkFzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0ge1xuICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lLFxuICAgIH07XG5cbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkSWRdID0gZmllbGRJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRvbWFpblR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlckRvbWFpblR5cGUuY29udmVydChkb21haW5UeXBlKTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZG9tYWluID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW47XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0Q2F0ZWdvcmljYWxEb21haW4oZG9tYWluLCBkb21haW5UeXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRSYW5nZURvbWFpbkFzeW5jKHdvcmtzaGVldE5hbWU6IHN0cmluZywgZmllbGRJZDogc3RyaW5nLCBkb21haW5UeXBlOiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5SYW5nZURvbWFpbj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0UmFuZ2VEb21haW47XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFJhbmdlRG9tYWluQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgfTtcblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRG9tYWluVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyRG9tYWluVHlwZS5jb252ZXJ0KGRvbWFpblR5cGUpO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5SYW5nZURvbWFpbj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkb21haW4gPSByZXNwb25zZS5yZXN1bHQgYXMgSW50ZXJuYWxDb250cmFjdC5SYW5nZURvbWFpbjtcblxuICAgICAgcmV0dXJuIHRoaXMuY29udmVydFJhbmdlRG9tYWluKGRvbWFpbiwgZG9tYWluVHlwZSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGFzaGJvYXJkRmlsdGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RGFzaGJvYXJkRmlsdGVycztcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RGFzaGJvYXJkRmlsdGVyc0FzeW5jJyxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxBcnJheTxDb250cmFjdC5GaWx0ZXI+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGZpbHRlcnMgPSByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8SW50ZXJuYWxDb250cmFjdC5GaWx0ZXI+O1xuICAgICAgcmV0dXJuIHRoaXMuY29udmVydERvbWFpbkZpbHRlcnMoZmlsdGVycyk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlEYXNoYm9hcmRGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuRGFzaGJvYXJkQ2F0ZWdvcmljYWxGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5RGFzaGJvYXJkRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZE5hbWVdID0gZmllbGROYW1lO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVmFsdWVzXSA9IHZhbHVlcztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclVwZGF0ZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlclVwZGF0ZVR5cGUuY29udmVydCh1cGRhdGVUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklzRXhjbHVkZU1vZGVdID0gZmlsdGVyT3B0aW9ucyAmJiAhIWZpbHRlck9wdGlvbnMuaXNFeGNsdWRlTW9kZTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luYyh3b3Jrc2hlZXROYW1lOiBzdHJpbmcsIGZpZWxkSWQ6IHN0cmluZyk6IFByb21pc2U8QXJyYXk8c3RyaW5nPj4ge1xuICAgIGNvbnN0IHNoYXJlZEZpbHRlck1vZGVsID0gYXdhaXQgdGhpcy5leGVjdXRlR2V0QXBwbGllZFdvcmtzaGVldHMod29ya3NoZWV0TmFtZSwgZmllbGRJZCwgJ2dldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMnKTtcbiAgICBjb25zdCB3b3Jrc2hlZXROYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBzaGFyZWRGaWx0ZXJNb2RlbC53b3Jrc2hlZXRzPy5tYXAoKHdvcmtzaGVldEluZm86IEludGVybmFsQ29udHJhY3QuU2hhcmVkRmlsdGVyV29ya3NoZWV0TW9kZWwpID0+IHtcbiAgICAgIGlmICh3b3Jrc2hlZXRJbmZvLmlzU2VsZWN0ZWQpIHtcbiAgICAgICAgd29ya3NoZWV0TmFtZXMucHVzaCh3b3Jrc2hlZXRJbmZvLndvcmtzaGVldE5hbWUpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB3b3Jrc2hlZXROYW1lcztcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBzZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgYXBwbHlUb1dvcmtzaGVldHM6IEFycmF5PHN0cmluZz4sXG4gICk6IFByb21pc2U8QXJyYXk8c3RyaW5nPj4ge1xuICAgIGNvbnN0IHNoYXJlZEZpbHRlck1vZGVsID0gYXdhaXQgdGhpcy5leGVjdXRlR2V0QXBwbGllZFdvcmtzaGVldHMod29ya3NoZWV0TmFtZSwgZmllbGRJZCwgJ2dldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmNJbnRlcm5hbCcpO1xuICAgIGlmICghc2hhcmVkRmlsdGVyTW9kZWwgfHwgIXNoYXJlZEZpbHRlck1vZGVsLndvcmtzaGVldHMpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnVGhpcyBmaWx0ZXIgZG9lcyBub3QgYXBwbHkgdG8gbXVsdGlwbGUgd29ya3NoZWV0cycpO1xuICAgIH1cblxuICAgIGNvbnN0IGFsbG93ZWRXb3Jrc2hlZXRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGxldCBhY3RpdmVXb3Jrc2hlZXQgPSAnJztcbiAgICBzaGFyZWRGaWx0ZXJNb2RlbC53b3Jrc2hlZXRzLmZvckVhY2goKHdvcmtzaGVldCkgPT4ge1xuICAgICAgLy8gR2V0IGFjdGl2ZSB3b3Jrc2hlZXRcbiAgICAgIGlmICh3b3Jrc2hlZXQuaXNBY3RpdmUpIHtcbiAgICAgICAgYWN0aXZlV29ya3NoZWV0ID0gd29ya3NoZWV0LndvcmtzaGVldE5hbWU7XG4gICAgICB9XG5cbiAgICAgIC8vIFBvcHVsYXRlIGFsbG93ZWQgd29ya3NoZWV0c1xuICAgICAgaWYgKHdvcmtzaGVldC5pc1NlbGVjdGVkIHx8IHdvcmtzaGVldC5pc0VuYWJsZWQpIHtcbiAgICAgICAgYWxsb3dlZFdvcmtzaGVldHMucHVzaCh3b3Jrc2hlZXQud29ya3NoZWV0TmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoYWN0aXZlV29ya3NoZWV0ID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdObyBhY3RpdmUgd29ya3NoZWV0Jyk7XG4gICAgfVxuXG4gICAgaWYgKCFhcHBseVRvV29ya3NoZWV0cy5pbmNsdWRlcyhhY3RpdmVXb3Jrc2hlZXQpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYCR7YWN0aXZlV29ya3NoZWV0fSBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBhcHBsaWVkIHdvcmtzaGVldHNgKTtcbiAgICB9XG5cbiAgICBhcHBseVRvV29ya3NoZWV0cy5mb3JFYWNoKChzaGVldCkgPT4ge1xuICAgICAgLy8gY2hlY2sgaWYgaXQncyBwcmVzZW50IHdpdGhpbiBjb21wYXRpYmxlIHNoZWV0c1xuICAgICAgaWYgKCFhbGxvd2VkV29ya3NoZWV0cy5pbmNsdWRlcyhzaGVldCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBUaGUgZmllbGQgJHtmaWVsZE5hbWV9IGlzbid0IGFwcGxpY2FibGUgdG8gdGhlIHdvcmtzaGVldCAke3NoZWV0fWApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5DaGFuZ2VTaGFyZWRGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7fTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV0gPSAnc2V0QXBwbGllZFdvcmtzaGVldHNBc3luYyc7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkSWRdID0gZmllbGRJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlNoYXJlZEZpbHRlclNoZWV0c10gPSBhcHBseVRvV29ya3NoZWV0cztcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmdbXT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gYXBwbHlUb1dvcmtzaGVldHM7XG4gICAgfSk7XG4gIH1cblxuICAvLyBIZWxwZXIgTWV0aG9kc1xuXG4gIHByaXZhdGUgZXhlY3V0ZUdldEFwcGxpZWRXb3Jrc2hlZXRzKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgdGVsZW1ldHJ5RnVuY3Rpb25OYW1lOiBzdHJpbmcsXG4gICk6IFByb21pc2U8SW50ZXJuYWxDb250cmFjdC5TaGFyZWRGaWx0ZXJNb2RlbD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0U2hhcmVkRmlsdGVyO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge307XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdID0gdGVsZW1ldHJ5RnVuY3Rpb25OYW1lO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0ge1xuICAgICAgd29ya3NoZWV0OiB3b3Jrc2hlZXROYW1lLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48SW50ZXJuYWxDb250cmFjdC5TaGFyZWRGaWx0ZXJNb2RlbD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBzaGFyZWRGaWx0ZXJNb2RlbCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlck1vZGVsO1xuICAgICAgcmV0dXJuIHNoYXJlZEZpbHRlck1vZGVsO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RG9tYWluRmlsdGVycyhkb21haW5GaWx0ZXJzOiBBcnJheTxJbnRlcm5hbENvbnRyYWN0LkZpbHRlcj4pOiBBcnJheTxDb250cmFjdC5GaWx0ZXI+IHtcbiAgICBjb25zdCBmaWx0ZXJzOiBBcnJheTxDb250cmFjdC5GaWx0ZXI+ID0gW107XG4gICAgZG9tYWluRmlsdGVycy5mb3JFYWNoKChkb21haW5GaWx0ZXIpID0+IHtcbiAgICAgIHN3aXRjaCAoZG9tYWluRmlsdGVyLmZpbHRlclR5cGUpIHtcbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLkNhdGVnb3JpY2FsOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXI7XG4gICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHRoaXMuY29udmVydENhdGVnb3JpY2FsRmlsdGVyKGZpbHRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgQ2F0ZWdvcmljYWwgRmlsdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLkhpZXJhcmNoaWNhbDoge1xuICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGRvbWFpbkZpbHRlciBhcyBJbnRlcm5hbENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0SGllcmFyY2hpY2FsRmlsdGVyKGZpbHRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgSGllcmFyY2hpY2FsIEZpbHRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgRmlsdGVyVHlwZS5SYW5nZToge1xuICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGRvbWFpbkZpbHRlciBhcyBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRSYW5nZUZpbHRlcihmaWx0ZXIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFJhbmdlIEZpbHRlcicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGU6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXI7XG4gICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHRoaXMuY29udmVydFJlbGF0aXZlRGF0ZUZpbHRlcihmaWx0ZXIpKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIFJlbGF0aXZlIERhdGUgRmlsdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGZpbHRlcnM7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRDYXRlZ29yaWNhbEZpbHRlcihkb21haW5GaWx0ZXI6IEludGVybmFsQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXIpOiBDb250cmFjdC5DYXRlZ29yaWNhbEZpbHRlciB7XG4gICAgY29uc3QgYXBwbGllZFZhbHVlczogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPiA9IGRvbWFpbkZpbHRlci52YWx1ZXMubWFwKChkdikgPT4ge1xuICAgICAgcmV0dXJuIERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkdik7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IENhdGVnb3JpY2FsRmlsdGVyKFxuICAgICAgZG9tYWluRmlsdGVyLnZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZENhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGROYW1lLFxuICAgICAgRmlsdGVyVHlwZS5DYXRlZ29yaWNhbCxcbiAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICBhcHBsaWVkVmFsdWVzLFxuICAgICAgZG9tYWluRmlsdGVyLmlzRXhjbHVkZSxcbiAgICAgIGRvbWFpbkZpbHRlci5pc0FsbFNlbGVjdGVkLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRIaWVyYXJjaGljYWxGaWx0ZXIoZG9tYWluRmlsdGVyOiBJbnRlcm5hbENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlcik6IENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlciB7XG4gICAgY29uc3QgYXBwbGllZFZhbHVlczogQXJyYXk8Q29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyRGF0YVZhbHVlPiA9IGRvbWFpbkZpbHRlci52YWx1ZXMubWFwKChoaWVyYXJjaGljYWxEYXRhVmFsdWUpID0+IHtcbiAgICAgIHJldHVybiBuZXcgSGllcmFyY2hpY2FsRGF0YVZhbHVlKFxuICAgICAgICBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoaGllcmFyY2hpY2FsRGF0YVZhbHVlLnZhbHVlKSxcbiAgICAgICAgaGllcmFyY2hpY2FsRGF0YVZhbHVlLmhpZXJhcmNoaWNhbFBhdGgsXG4gICAgICAgIGhpZXJhcmNoaWNhbERhdGFWYWx1ZS5sZXZlbCxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBsZXZlbERldGFpbHM6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVsRGV0YWlsPiA9IGRvbWFpbkZpbHRlci5sZXZlbEluZm8ubWFwKChhTGV2ZWwpID0+IHtcbiAgICAgIHJldHVybiBuZXcgSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwoXG4gICAgICAgIGFMZXZlbC5uYW1lLFxuICAgICAgICBJbnRlcm5hbEVudW1Db252ZXJ0ZXIuaGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5jb252ZXJ0KGFMZXZlbC5sZXZlbFNlbGVjdGlvblN0YXRlKSxcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gbmV3IEhpZXJhcmNoaWNhbEZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEZpbHRlclR5cGUuSGllcmFyY2hpY2FsLFxuICAgICAgdGhpcy5fcmVnaXN0cnlJZCxcbiAgICAgIGRvbWFpbkZpbHRlci5kaW1lbnNpb25OYW1lLFxuICAgICAgZG9tYWluRmlsdGVyLmhpZXJhcmNoeUNhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIubGV2ZWxzLFxuICAgICAgbGV2ZWxEZXRhaWxzLFxuICAgICAgYXBwbGllZFZhbHVlcyxcbiAgICAgIGRvbWFpbkZpbHRlci5pc0FsbFNlbGVjdGVkLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRSYW5nZUZpbHRlcihkb21haW5GaWx0ZXI6IEludGVybmFsQ29udHJhY3QuUmFuZ2VGaWx0ZXIpOiBDb250cmFjdC5SYW5nZUZpbHRlciB7XG4gICAgY29uc3QgbWluVmFsdWU6IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW5GaWx0ZXIubWluKTtcbiAgICBjb25zdCBtYXhWYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5tYXgpO1xuICAgIHJldHVybiBuZXcgUmFuZ2VGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBGaWx0ZXJUeXBlLlJhbmdlLFxuICAgICAgdGhpcy5fcmVnaXN0cnlJZCxcbiAgICAgIG1pblZhbHVlLFxuICAgICAgbWF4VmFsdWUsXG4gICAgICBkb21haW5GaWx0ZXIuaW5jbHVkZU51bGxWYWx1ZXMsXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydFJlbGF0aXZlRGF0ZUZpbHRlcihkb21haW5GaWx0ZXI6IEludGVybmFsQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyKTogQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyIHtcbiAgICBjb25zdCBhbmNob3JEYXRlVmFsdWU6IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW5GaWx0ZXIuYW5jaG9yRGF0ZSk7XG4gICAgcmV0dXJuIG5ldyBSZWxhdGl2ZURhdGVGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBFeHRlcm5hbEZpbHRlclR5cGUuUmVsYXRpdmVEYXRlLFxuICAgICAgdGhpcy5fcmVnaXN0cnlJZCxcbiAgICAgIGFuY2hvckRhdGVWYWx1ZSxcbiAgICAgIEludGVybmFsRW51bUNvbnZlcnRlci5kYXRlU3RlcFBlcmlvZC5jb252ZXJ0KGRvbWFpbkZpbHRlci5wZXJpb2RUeXBlKSxcbiAgICAgIEludGVybmFsRW51bUNvbnZlcnRlci5kYXRlUmFuZ2VUeXBlLmNvbnZlcnQoZG9tYWluRmlsdGVyLnJhbmdlVHlwZSksXG4gICAgICBkb21haW5GaWx0ZXIucmFuZ2VOLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRDYXRlZ29yaWNhbERvbWFpbihkb21haW46IEludGVybmFsQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4sIGRvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpOiBDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbiB7XG4gICAgY29uc3QgdmFsdWVzOiBBcnJheTxEYXRhVmFsdWU+ID0gZG9tYWluLnZhbHVlcy5tYXAoKGRvbWFpbkR2KSA9PiB7XG4gICAgICByZXR1cm4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkR2KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3IENhdGVnb3JpY2FsRG9tYWluKHZhbHVlcywgZG9tYWluVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRSYW5nZURvbWFpbihkb21haW46IEludGVybmFsQ29udHJhY3QuUmFuZ2VEb21haW4sIGRvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpOiBDb250cmFjdC5SYW5nZURvbWFpbiB7XG4gICAgY29uc3QgbWluOiBEYXRhVmFsdWUgPSBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluLm1pbik7XG4gICAgY29uc3QgbWF4OiBEYXRhVmFsdWUgPSBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VGaWx0ZXJEYXRhVmFsdWUoZG9tYWluLm1heCk7XG4gICAgcmV0dXJuIG5ldyBSYW5nZURvbWFpbihtaW4sIG1heCwgZG9tYWluVHlwZSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRBbmNob3JEYXRlKGFuY2hvckRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIC8vIENvbnZlcnRzIGEgRGF0ZSBvYmplY3QgaW50byBhIHN0cmluZyBmb3JtYXQgdGhhdCB0aGUgc2VydmVyIGV4cGVjdHMgZm9yIGRhdGUvdGltZSB2YWx1ZXMuXG4gICAgLy8gSWYgYW5jaG9yRGF0ZSBkb2Vzbid0IHJlcHJlc2VudCBhIHZhbGlkIERhdGUgb2JqZWN0LCBhbnkgb2YgdGhlc2Ugd291bGQgYmUgTmFOLlxuICAgIGNvbnN0IHllYXIgPSBhbmNob3JEYXRlLmdldFVUQ0Z1bGxZZWFyKCk7XG4gICAgY29uc3QgbW9udGggPSBhbmNob3JEYXRlLmdldFVUQ01vbnRoKCkgKyAxO1xuICAgIGNvbnN0IGRheSA9IGFuY2hvckRhdGUuZ2V0VVRDRGF0ZSgpO1xuICAgIGNvbnN0IGhoID0gYW5jaG9yRGF0ZS5nZXRVVENIb3VycygpO1xuICAgIGNvbnN0IG1tID0gYW5jaG9yRGF0ZS5nZXRVVENNaW51dGVzKCk7XG4gICAgY29uc3Qgc2VjID0gYW5jaG9yRGF0ZS5nZXRVVENTZWNvbmRzKCk7XG5cbiAgICBpZiAoaXNOYU4oeWVhcikgfHwgaXNOYU4obW9udGgpIHx8IGlzTmFOKGRheSkgfHwgaXNOYU4oaGgpIHx8IGlzTmFOKG1tKSB8fCBpc05hTihzZWMpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZERhdGVQYXJhbWV0ZXIsICdJbnZhbGlkIGRhdGUgcGFyYW1ldGVyOiBhbmNob3JEYXRlJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0ID0gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9ICR7aGh9OiR7bW19OiR7c2VjfWA7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgYXBpRmlsdGVySGFuZGxlckNoZWNrRm9yQ29tbWFuZEVycm9yKHNlcnZlclBtOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgaWYgKCFzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLlBhcmFtZXRlckVycm9yXSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAoc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkRmllbGRDYXB0aW9uXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRGaWx0ZXJGaWVsZE5hbWUsIHNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuSW52YWxpZEZpZWxkQ2FwdGlvbl0pO1xuICAgIH1cbiAgICBpZiAoc2VydmVyUG1bSW50ZXJuYWxDb250cmFjdC5QYXJhbWV0ZXJJZC5JbnZhbGlkVmFsdWVzXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRGaWx0ZXJGaWVsZFZhbHVlLCBzZXJ2ZXJQbVtJbnRlcm5hbENvbnRyYWN0LlBhcmFtZXRlcklkLkludmFsaWRWYWx1ZXNdKTtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuSW52YWxpZEFnZ0ZpZWxkTmFtZV0pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkQWdncmVnYXRpb25GaWVsZE5hbWUsIHNlcnZlclBtW0ludGVybmFsQ29udHJhY3QuUGFyYW1ldGVySWQuSW52YWxpZEFnZ0ZpZWxkTmFtZV0pO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuU2VydmVyRXJyb3IsICdTZXJ2ZXIgRXJyb3InKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9yQ29kZXMsIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNob3dEYXRhVGFibGVGb3JtYXQsXG4gIERhdGFUYWJsZSBhcyBEYXRhVGFibGVJbnRlcm5hbENvbnRyYWN0LFxuICBEYXRhVGFibGVSZWFkZXIgYXMgRGF0YVRhYmxlUmVhZGVySW50ZXJuYWxDb250cmFjdCxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEhpZ2hsaWdodGVkTWFya3NUYWJsZSxcbiAgUGFyYW1ldGVySWQsXG4gIFNlbGVjdGVkTWFya3NUYWJsZSxcbiAgVW5kZXJseWluZ0RhdGFUYWJsZSxcbiAgVmVyYklkLFxuICBWaXN1YWxJZCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IHY0IGFzIHV1aWR2NCB9IGZyb20gJ3V1aWQnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vLi4vQXBpU2hhcmVkJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgQ29sdW1uLCBEYXRhVGFibGUsIE1hcmtJbmZvIH0gZnJvbSAnLi4vLi4vTW9kZWxzL0dldERhdGFNb2RlbHMnO1xuaW1wb3J0IHsgRGF0YVRhYmxlUmVhZGVyIH0gZnJvbSAnLi4vLi4vTW9kZWxzL0dldERhdGFUYWJsZVJlYWRlck1vZGVscyc7XG5pbXBvcnQgeyBEYXRhVmFsdWVGYWN0b3J5IH0gZnJvbSAnLi4vLi4vVXRpbHMvRGF0YVZhbHVlRmFjdG9yeSc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZSwgR2V0RGF0YVR5cGUgfSBmcm9tICcuLi9HZXREYXRhU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgR2V0RGF0YVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgR2V0RGF0YVNlcnZpY2Uge1xuICAvLyBUaGUgZXh0ZW5zaW9uL2VtYmVkZGluZyBpbnN0YW5jZSB1c2VzIHRoZSBzYW1lIGNhY2hlIGZvciBhbGwgRGF0YVRhYmxlUmVhZGVycy5cbiAgcHJpdmF0ZSB2aWV3RGF0YVRhYmxlQ2FjaGVJZDogc3RyaW5nID0gdXVpZHY0KCk7XG5cbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuR2V0RGF0YTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhSb3dMaW1pdCgpOiBudW1iZXIge1xuICAgIHJldHVybiAxMDAwMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRWaWV3RGF0YVRhYmxlQ2FjaGVJZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnZpZXdEYXRhVGFibGVDYWNoZUlkO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMaW1pdGVkTWF4Um93cyhyZXF1ZXN0ZWRSb3dzOiBudW1iZXIsIHJvd0NvdW50TGltaXQ6IG51bWJlcik6IG51bWJlciB7XG4gICAgcmV0dXJuIHJlcXVlc3RlZFJvd3MgPiAwICYmIHJlcXVlc3RlZFJvd3MgPCByb3dDb3VudExpbWl0ID8gcmVxdWVzdGVkUm93cyA6IHJvd0NvdW50TGltaXQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgZ2V0VHlwZTogR2V0RGF0YVR5cGUsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8RGF0YVRhYmxlPiB7XG4gICAgLy8gQ3JlYXRlIGFsbCBvZiBvdXIgcGFyYW1ldGVyc1xuICAgIGNvbnN0IHN1bW1hcnlEYXRhID0gZ2V0VHlwZSA9PT0gR2V0RGF0YVR5cGUuU3VtbWFyeTtcbiAgICBjb25zdCBmdW5jdGlvbk5hbWUgPSBzdW1tYXJ5RGF0YSA/ICdnZXRTdW1tYXJ5RGF0YUFzeW5jJyA6ICdnZXRVbmRlcmx5aW5nRGF0YUFzeW5jJztcbiAgICBjb25zdCB2ZXJiID0gc3VtbWFyeURhdGEgPyBWZXJiSWQuR2V0RGF0YVN1bW1hcnlEYXRhIDogVmVyYklkLkdldFVuZGVybHlpbmdEYXRhO1xuICAgIGNvbnN0IHJlcXVlc3RNYXhSb3dzID0gdmVyYiA9PT0gVmVyYklkLkdldFVuZGVybHlpbmdEYXRhID8gdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzLCB0aGlzLmdldE1heFJvd0xpbWl0KCkgKyAxKSA6IG1heFJvd3M7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogZnVuY3Rpb25OYW1lLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdID0gaWdub3JlQWxpYXNlcztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl0gPSBpZ25vcmVTZWxlY3Rpb247XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc10gPSBpbmNsdWRlQWxsQ29sdW1ucztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXSA9IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLk1heFJvd3NdID0gcmVxdWVzdE1heFJvd3M7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XSA9IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZ10gPSBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGEuZGF0YSwgcmVzcG9uc2VEYXRhLmlzU3VtbWFyeSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICAgIGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxEYXRhVGFibGVSZWFkZXI+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUNhY2hlSWRdOiB0aGlzLmdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCksXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYWdlUm93Q291bnRdOiBwYWdlUm93Q291bnQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlU2VsZWN0aW9uXTogaWdub3JlU2VsZWN0aW9uLFxuICAgICAgW1BhcmFtZXRlcklkLkluY2x1ZGVBbGxDb2x1bW5zXTogaW5jbHVkZUFsbENvbHVtbnMsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCksXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5BcHBseVdvcmtzaGVldEZvcm1hdHRpbmddOiBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmcsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldERhdGFTdW1tYXJ5RGF0YVJlYWRlciwgcGFyYW1ldGVycykudGhlbjxEYXRhVGFibGVSZWFkZXI+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzcG9uc2VEYXRhID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFUYWJsZVJlYWRlckludGVybmFsQ29udHJhY3Q7XG5cbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlUmVhZGVyKHJlc3BvbnNlRGF0YS5pZCwgcmVzcG9uc2VEYXRhLnRvdGFsUm93Q291bnQsIHBhZ2VSb3dDb3VudCwgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db2x1bW4+PiB7XG4gICAgLy8gQ3JlYXRlIGFsbCB0aGUgcGFyYW1ldGVycyBmb3IgR2V0RGF0YVR5cGUgb2YgU3VtbWFyeSB3aXRoIDEgcm93LCBhbmQgb25seSBuYXRpdmUgdmFsdWVzXG4gICAgLy8gVGhlbiByZXR1cm4ganVzdCB0aGUgY29sdW1uc1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RGF0YVN1bW1hcnlEYXRhO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogdHJ1ZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVTZWxlY3Rpb25dOiB0cnVlLFxuICAgICAgW1BhcmFtZXRlcklkLkluY2x1ZGVBbGxDb2x1bW5zXTogdHJ1ZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogMSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogQXBpU2hvd0RhdGFUYWJsZUZvcm1hdC5OYXRpdmVWYWx1ZXNPbmx5LFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48QXJyYXk8Q29udHJhY3QuQ29sdW1uPj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCB1bmRlcmx5aW5nRGF0YVRhYmxlID0gcmVzcG9uc2UucmVzdWx0IGFzIFVuZGVybHlpbmdEYXRhVGFibGU7XG4gICAgICBjb25zdCBkYXRhVGFibGUgPSB1bmRlcmx5aW5nRGF0YVRhYmxlLmRhdGE7XG4gICAgICBjb25zdCBjb2x1bW5zID0gZGF0YVRhYmxlLmhlYWRlcnMubWFwKChoKSA9PiBuZXcgQ29sdW1uKGguZmllbGRDYXB0aW9uLCBoLmZpZWxkTmFtZSwgaC5kYXRhVHlwZSwgaC5pc1JlZmVyZW5jZWQsIGguaW5kZXgpKTtcbiAgICAgIHJldHVybiBjb2x1bW5zO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFNlbGVjdGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRTZWxlY3RlZE1hcmtzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRTZWxlY3RlZE1hcmtzLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgU2VsZWN0ZWRNYXJrc1RhYmxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLmRhdGEubWFwKCh0YWJsZSkgPT4gdGhpcy5wcm9jZXNzUmVzdWx0c1RhYmxlKHRhYmxlLCB0cnVlKSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEhpZ2hsaWdodGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRIaWdobGlnaHRlZE1hcmtzLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgSGlnaGxpZ2h0ZWRNYXJrc1RhYmxlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogcmVzcG9uc2VEYXRhLmRhdGEubWFwKCh0YWJsZSkgPT4gdGhpcy5wcm9jZXNzUmVzdWx0c1RhYmxlKHRhYmxlLCB0cnVlKSksXG4gICAgICB9O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VEYXRhQXN5bmMoXG4gICAgZGF0YVNvdXJjZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBtYXhSb3dzOiBudW1iZXIsXG4gICAgY29sdW1uc1RvSW5jbHVkZTogQXJyYXk8c3RyaW5nPixcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogQXJyYXk8c3RyaW5nPixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICk6IFByb21pc2U8RGF0YVRhYmxlPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldERhdGFTb3VyY2VEYXRhQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFTb3VyY2VJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogaWdub3JlQWxpYXNlcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhSb3dzXTogdGhpcy5nZXRMaW1pdGVkTWF4Um93cyhtYXhSb3dzLCB0aGlzLmdldE1heFJvd0xpbWl0KCkgKyAxKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZSksXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCksXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0RGF0YVNvdXJjZURhdGEsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGEuZGF0YSwgZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhcbiAgICBkYXRhc291cmNlSWQ6IHN0cmluZyxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZT4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVdOiBjb2x1bW5zVG9JbmNsdWRlLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFzb3VyY2VJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogaWdub3JlQWxpYXNlcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF06IGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLk1heFJvd3NdOiB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKG1heFJvd3MsIHRoaXMuZ2V0TWF4Um93TGltaXQoKSArIDEpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldExvZ2ljYWxUYWJsZURhdGEsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBVbmRlcmx5aW5nRGF0YVRhYmxlO1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNUYWJsZShyZXNwb25zZURhdGEuZGF0YSwgZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICBkYXRhc291cmNlSWQ6IHN0cmluZyxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPERhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHBhZ2VSb3dDb3VudCA9IHRoaXMuZ2V0TGltaXRlZE1heFJvd3MocGFnZVJvd0NvdW50LCB0aGlzLmdldE1heFJvd0xpbWl0KCkpO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVDYWNoZUlkXTogdGhpcy5nZXRWaWV3RGF0YVRhYmxlQ2FjaGVJZCgpLFxuICAgICAgW1BhcmFtZXRlcklkLkRhdGFTb3VyY2VJZF06IGRhdGFzb3VyY2VJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF06IGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLlBhZ2VSb3dDb3VudF06IHBhZ2VSb3dDb3VudCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5JZ25vcmVBbGlhc2VzXTogaWdub3JlQWxpYXNlcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IHRoaXMudmVyaWZ5SW5jbHVkZUNvbHVtbkFycmF5KGNvbHVtbnNUb0luY2x1ZGVCeUlkKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG93RGF0YVRhYmxlRm9ybWF0XTogRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnNob3dEYXRhVGFibGVGb3JtYXRUeXBlLmNvbnZlcnQoaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24pLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZVJlYWRlcj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVRhYmxlUmVhZGVySW50ZXJuYWxDb250cmFjdDtcblxuICAgICAgcmV0dXJuIG5ldyBEYXRhVGFibGVSZWFkZXIocmVzcG9uc2VEYXRhLmlkLCByZXNwb25zZURhdGEudG90YWxSb3dDb3VudCwgcGFnZVJvd0NvdW50LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFVuZGVybHlpbmdUYWJsZURhdGFBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Mb2dpY2FsVGFibGVJZF06IGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZUFsaWFzZXNdOiBpZ25vcmVBbGlhc2VzLFxuICAgICAgW1BhcmFtZXRlcklkLklnbm9yZVNlbGVjdGlvbl06IGlnbm9yZVNlbGVjdGlvbixcbiAgICAgIFtQYXJhbWV0ZXJJZC5JbmNsdWRlQWxsQ29sdW1uc106IGluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNUb0luY2x1ZGVCeUlkXTogdGhpcy52ZXJpZnlJbmNsdWRlQ29sdW1uQXJyYXkoY29sdW1uc1RvSW5jbHVkZUJ5SWQpLFxuICAgICAgW1BhcmFtZXRlcklkLk1heFJvd3NdOiB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKG1heFJvd3MsIHRoaXMuZ2V0TWF4Um93TGltaXQoKSArIDEpLFxuICAgICAgW1BhcmFtZXRlcklkLlNob3dEYXRhVGFibGVGb3JtYXRdOiBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3Muc2hvd0RhdGFUYWJsZUZvcm1hdFR5cGUuY29udmVydChpbmNsdWRlRGF0YVZhbHVlc09wdGlvbiksXG4gICAgICBbUGFyYW1ldGVySWQuQXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nXTogYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRVbmRlcmx5aW5nVGFibGVEYXRhLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgVW5kZXJseWluZ0RhdGFUYWJsZTtcbiAgICAgIHJldHVybiB0aGlzLnByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhLmRhdGEsIGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICAgIGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+IHtcbiAgICBwYWdlUm93Q291bnQgPSB0aGlzLmdldExpbWl0ZWRNYXhSb3dzKHBhZ2VSb3dDb3VudCwgdGhpcy5nZXRNYXhSb3dMaW1pdCgpKTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaWV3RGF0YVRhYmxlQ2FjaGVJZF06IHRoaXMuZ2V0Vmlld0RhdGFUYWJsZUNhY2hlSWQoKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLkxvZ2ljYWxUYWJsZUlkXTogbG9naWNhbFRhYmxlSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IGlnbm9yZUFsaWFzZXMsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlU2VsZWN0aW9uXTogaWdub3JlU2VsZWN0aW9uLFxuICAgICAgW1BhcmFtZXRlcklkLkluY2x1ZGVBbGxDb2x1bW5zXTogaW5jbHVkZUFsbENvbHVtbnMsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc1RvSW5jbHVkZUJ5SWRdOiB0aGlzLnZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zVG9JbmNsdWRlQnlJZCksXG4gICAgICBbUGFyYW1ldGVySWQuU2hvd0RhdGFUYWJsZUZvcm1hdF06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaG93RGF0YVRhYmxlRm9ybWF0VHlwZS5jb252ZXJ0KGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uKSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYWdlUm93Q291bnRdOiBwYWdlUm93Q291bnQsXG4gICAgICBbUGFyYW1ldGVySWQuQXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nXTogYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyLCBwYXJhbWV0ZXJzKS50aGVuPERhdGFUYWJsZVJlYWRlcj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXNwb25zZURhdGEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVRhYmxlUmVhZGVySW50ZXJuYWxDb250cmFjdDtcblxuICAgICAgcmV0dXJuIG5ldyBEYXRhVGFibGVSZWFkZXIocmVzcG9uc2VEYXRhLmlkLCByZXNwb25zZURhdGEudG90YWxSb3dDb3VudCwgcGFnZVJvd0NvdW50LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHN1bW1hcnlUYWJsZUlkID0gJyc7XG5cbiAgcHVibGljIGdldFBhZ2VBc3luYyh0YWJsZUlkOiBzdHJpbmcsIHBhZ2VOdW1iZXI6IG51bWJlciwgcGFnZVNpemU6IG51bWJlcik6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldFBhZ2VBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUNhY2hlSWRdOiB0aGlzLmdldFZpZXdEYXRhVGFibGVDYWNoZUlkKCksXG4gICAgICBbUGFyYW1ldGVySWQuVmlld0RhdGFUYWJsZUlkXTogdGFibGVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXRhUm93SW5kZXhdOiBwYWdlTnVtYmVyICogcGFnZVNpemUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldERhdGFUYWJsZVJlYWRlclBhZ2UsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVRhYmxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3BvbnNlRGF0YSA9IHJlc3BvbnNlLnJlc3VsdCBhcyBEYXRhVGFibGVJbnRlcm5hbENvbnRyYWN0O1xuICAgICAgcmV0dXJuIHRoaXMucHJvY2Vzc1Jlc3VsdHNQYWdlKHJlc3BvbnNlRGF0YSwgdGFibGVJZCA9PT0gR2V0RGF0YVNlcnZpY2VJbXBsLnN1bW1hcnlUYWJsZUlkID8gdHJ1ZSA6IGZhbHNlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZWxlYXNlQXN5bmModGFibGVJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbGVhc2UnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVDYWNoZUlkXTogdGhpcy5nZXRWaWV3RGF0YVRhYmxlQ2FjaGVJZCgpLFxuICAgICAgW1BhcmFtZXRlcklkLlZpZXdEYXRhVGFibGVJZF06IHRhYmxlSWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlbGVhc2VEYXRhVGFibGVSZWFkZXIsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIHZlcmlmeUluY2x1ZGVDb2x1bW5BcnJheShjb2x1bW5zOiBBcnJheTxzdHJpbmc+KTogQXJyYXk8c3RyaW5nPiB7XG4gICAgLy8gY29sdW1ucyBtdXN0IGJlIGEgdmFsaWQgYXJyYXlcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29sdW1ucykpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnY29sdW1uc1RvSW5jbHVkZSBhbmQgY29sdW1uc1RvSW5jbHVkZUJ5SWQgbXVzdCBiZSB2YWxpZCBhcnJheXMnKTtcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgYW55IGR1cGxpY2F0ZXMgZnJvbSB0aGUgaW5wdXQgYXJyYXlcbiAgICBjb25zdCBjb2x1bW5zQXNTZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldChjb2x1bW5zKTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbShjb2x1bW5zQXNTZXQpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NSZXN1bHRzVGFibGUocmVzcG9uc2VEYXRhOiBEYXRhVGFibGVJbnRlcm5hbENvbnRyYWN0LCBpc1N1bW1hcnk6IGJvb2xlYW4pOiBEYXRhVGFibGUge1xuICAgIGNvbnN0IGhlYWRlcnMgPSByZXNwb25zZURhdGEuaGVhZGVycy5tYXAoKGgpID0+IG5ldyBDb2x1bW4oaC5maWVsZENhcHRpb24sIGguZmllbGROYW1lLCBoLmRhdGFUeXBlLCBoLmlzUmVmZXJlbmNlZCwgaC5pbmRleCkpO1xuXG4gICAgLy8gVE9ETyBUaGlzIHNob3VsZCBiZSBjb250cm9sbGVkIGJ5IGEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhpcyBhcGkgd2lsbCByZXNwb25kIG1hcmtzIGluZm8gb3Igbm90XG4gICAgbGV0IG1hcmtzO1xuICAgIGlmIChyZXNwb25zZURhdGEubWFya3MpIHtcbiAgICAgIG1hcmtzID0gcmVzcG9uc2VEYXRhLm1hcmtzLm1hcCgoaCkgPT4gbmV3IE1hcmtJbmZvKGgudHlwZSwgaC5jb2xvciwgaC50dXBsZUlkKSk7XG4gICAgfVxuXG4gICAgLy8gTGltaXQrMSBpcyBvdXIgc2VudGluYWwgdGhhdCB1bmRlcmx5aW5nIGRhdGEgY29udGFpbnMgbW9yZSByb3dzIHRoYW4gdXNlciBpcyBhbGxvd2VkIHRvIGZldGNoLlxuICAgIC8vIFJlbW92ZSB0aGUgbGFzdCBlbGVtZW50IHNvIHdlIGFsd2F5cyByZXR1cm4gTWF4Um93TGltaXRcbiAgICBjb25zdCBpc1RvdGFsUm93Q291bnRMaW1pdGVkID0gaXNTdW1tYXJ5ID09PSBmYWxzZSAmJiByZXNwb25zZURhdGEuZGF0YVRhYmxlLmxlbmd0aCA9PT0gdGhpcy5nZXRNYXhSb3dMaW1pdCgpICsgMTtcbiAgICBpZiAoaXNUb3RhbFJvd0NvdW50TGltaXRlZCkge1xuICAgICAgcmVzcG9uc2VEYXRhLmRhdGFUYWJsZS5sZW5ndGggLT0gMTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZSA9IHJlc3BvbnNlRGF0YS5kYXRhVGFibGUubWFwKChyb3cpID0+IHtcbiAgICAgIHJldHVybiByb3cubWFwKChjZWxsLCBpbmRleCkgPT4ge1xuICAgICAgICByZXR1cm4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlVGFibGVEYXRhVmFsdWUoY2VsbCwgaGVhZGVyc1tpbmRleF0uZGF0YVR5cGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAobWFya3MpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlKHRhYmxlLCBoZWFkZXJzLCB0YWJsZS5sZW5ndGgsIGlzVG90YWxSb3dDb3VudExpbWl0ZWQsIGlzU3VtbWFyeSwgbWFya3MpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGFUYWJsZSh0YWJsZSwgaGVhZGVycywgdGFibGUubGVuZ3RoLCBpc1RvdGFsUm93Q291bnRMaW1pdGVkLCBpc1N1bW1hcnkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIHByb2Nlc3NSZXN1bHRzUGFnZShyZXNwb25zZURhdGE6IERhdGFUYWJsZUludGVybmFsQ29udHJhY3QsIGlzU3VtbWFyeTogYm9vbGVhbik6IERhdGFUYWJsZSB7XG4gICAgY29uc3QgaGVhZGVycyA9IHJlc3BvbnNlRGF0YS5oZWFkZXJzLm1hcCgoaCkgPT4gbmV3IENvbHVtbihoLmZpZWxkQ2FwdGlvbiwgaC5maWVsZE5hbWUsIGguZGF0YVR5cGUsIGguaXNSZWZlcmVuY2VkLCBoLmluZGV4KSk7XG5cbiAgICBsZXQgbWFya3M7XG4gICAgaWYgKHJlc3BvbnNlRGF0YS5tYXJrcykge1xuICAgICAgbWFya3MgPSByZXNwb25zZURhdGEubWFya3MubWFwKChoKSA9PiBuZXcgTWFya0luZm8oaC50eXBlLCBoLmNvbG9yLCBoLnR1cGxlSWQpKTtcbiAgICB9XG5cbiAgICBjb25zdCB0YWJsZSA9IHJlc3BvbnNlRGF0YS5kYXRhVGFibGUubWFwKChyb3cpID0+IHtcbiAgICAgIHJldHVybiByb3cubWFwKChjZWxsLCBpbmRleCkgPT4ge1xuICAgICAgICByZXR1cm4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlVGFibGVEYXRhVmFsdWUoY2VsbCwgaGVhZGVyc1tpbmRleF0uZGF0YVR5cGUpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAobWFya3MpIHtcbiAgICAgIHJldHVybiBuZXcgRGF0YVRhYmxlKHRhYmxlLCBoZWFkZXJzLCB0YWJsZS5sZW5ndGgsIGZhbHNlLCBpc1N1bW1hcnksIG1hcmtzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBEYXRhVGFibGUodGFibGUsIGhlYWRlcnMsIHRhYmxlLmxlbmd0aCwgZmFsc2UsIGlzU3VtbWFyeSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Ob3RpZmljYXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIE5vdGlmaWNhdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEludGVybmFsQXBpRGlzcGF0Y2hlciwgTW9kZWwsIE5vdGlmaWNhdGlvbiwgTm90aWZpY2F0aW9uSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVW5yZWdpc3RlckZuIH0gZnJvbSAnLi4vTm90aWZpY2F0aW9uU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBSZWdpc3RyYXRpb24ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZmlsdGVyRm46IChub3RpZmljYXRpb25Nb2RlbDogTW9kZWwpID0+IGJvb2xlYW4sIHByaXZhdGUgX2NhbGxiYWNrRm46IChub3RpZmljYXRpb25Nb2RlbDogTW9kZWwpID0+IHZvaWQpIHtcbiAgICAvLyBOb3RoaW5nIEhlcmVcbiAgfVxuXG4gIHB1YmxpYyBvbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb25Nb2RlbDogTW9kZWwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZmlsdGVyRm4obm90aWZpY2F0aW9uTW9kZWwpKSB7XG4gICAgICB0aGlzLl9jYWxsYmFja0ZuKG5vdGlmaWNhdGlvbk1vZGVsKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSB7XG4gIHByaXZhdGUgX2hhbmRsZXJzOiB7IFtub3RpZmljYXRpb25JZDogc3RyaW5nXTogQXJyYXk8UmVnaXN0cmF0aW9uPiB9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcikge1xuICAgIHRoaXMuX2hhbmRsZXJzID0ge307XG4gICAgdGhpcy5kaXNwYXRjaGVyLnJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcih0aGlzLm9uTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVySGFuZGxlcihpZDogTm90aWZpY2F0aW9uSWQsIGZpbHRlckZuOiAobW9kZWw6IE1vZGVsKSA9PiBib29sZWFuLCBoYW5kbGVyOiAobW9kZWw6IE1vZGVsKSA9PiB2b2lkKTogVW5yZWdpc3RlckZuIHtcbiAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuX2hhbmRsZXJzW2lkXSB8fCBuZXcgQXJyYXk8UmVnaXN0cmF0aW9uPigpO1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IG5ldyBSZWdpc3RyYXRpb24oZmlsdGVyRm4sIGhhbmRsZXIpO1xuICAgIGhhbmRsZXJzLnB1c2gocmVnaXN0cmF0aW9uKTtcbiAgICB0aGlzLl9oYW5kbGVyc1tpZF0gPSBoYW5kbGVycztcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5yZW1vdmVSZWdpc3RyYXRpb24oaWQsIHJlZ2lzdHJhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGhhc0hhbmRsZXJzRm9yTm90aWZpY2F0aW9uVHlwZShpZDogTm90aWZpY2F0aW9uSWQpOiBib29sZWFuIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gICAgcmV0dXJuIHRoaXMuX2hhbmRsZXJzLmhhc093blByb3BlcnR5KGlkKTtcbiAgfVxuXG4gIHByaXZhdGUgb25Ob3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzSGFuZGxlcnNGb3JOb3RpZmljYXRpb25UeXBlKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25JZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBHbyB0aHJvdWdoIGFuZCBjaGVjayBmb3IgYWxsIHRoZSBoYW5kbGVycyBvZiB0aGlzIHBhcnRpY3VsYXIgbm90aWZpY2F0aW9uXG4gICAgdGhpcy5faGFuZGxlcnNbbm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkXS5mb3JFYWNoKChoKSA9PiBoLm9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbi5kYXRhKSk7XG4gIH1cblxuICBwcml2YXRlIHJlbW92ZVJlZ2lzdHJhdGlvbihpZDogTm90aWZpY2F0aW9uSWQsIHJlZ2lzdHJhdGlvbjogUmVnaXN0cmF0aW9uKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLmhhc0hhbmRsZXJzRm9yTm90aWZpY2F0aW9uVHlwZShpZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9oYW5kbGVyc1tpZF0gPSB0aGlzLl9oYW5kbGVyc1tpZF0uZmlsdGVyKChyZWcpID0+IHJlZyAhPT0gcmVnaXN0cmF0aW9uKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgTW9kZWwsIFBhcmFtZXRlcklkLCBQYXJhbWV0ZXJJbmZvLCBTaGVldFBhdGgsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9QYXJhbWV0ZXJJbXBsJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uL1BhcmFtZXRlcnNTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJzU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBQYXJhbWV0ZXJzU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlBhcmFtZXRlcnM7XG4gIH1cblxuICBwdWJsaWMgZ2V0UGFyYW1ldGVyc0ZvclNoZWV0QXN5bmMoc2hlZXRQYXRoOiBTaGVldFBhdGgpOiBQcm9taXNlPEFycmF5PFBhcmFtZXRlckltcGw+PiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0UGFyYW1ldGVyc0ZvclNoZWV0QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlNoZWV0UGF0aF06IHNoZWV0UGF0aCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0UGFyYW1ldGVyc0FzeW5jKHBhcmFtZXRlcnMpO1xuICB9XG5cbiAgcHVibGljIGdldEFsbFBhcmFtZXRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PFBhcmFtZXRlckltcGw+PiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0UGFyYW1ldGVyc0ZvclNoZWV0QXN5bmMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXJzQXN5bmMocGFyYW1ldGVycyk7XG4gIH1cblxuICBwcml2YXRlIGdldFBhcmFtZXRlcnNBc3luYyhpbnB1dFBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogUHJvbWlzZTxBcnJheTxQYXJhbWV0ZXJJbXBsPj4ge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFBhcmFtZXRlcnNGb3JTaGVldCwgaW5wdXRQYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PFBhcmFtZXRlckluZm8+O1xuICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoKHBhcmFtZXRlckluZm8pID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJJbXBsKHBhcmFtZXRlckluZm8sIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2hhbmdlUGFyYW1ldGVyVmFsdWVBc3luYyhmaWVsZE5hbWU6IHN0cmluZywgbmV3VmFsdWU6IHN0cmluZyk6IFByb21pc2U8UGFyYW1ldGVySW5mbz4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NoYW5nZVBhcmFtZXRlclZhbHVlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlBhcmFtZXRlckZpZWxkTmFtZV06IGZpZWxkTmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5QYXJhbWV0ZXJWYWx1ZV06IG5ld1ZhbHVlLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DaGFuZ2VQYXJhbWV0ZXJWYWx1ZSwgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBQYXJhbWV0ZXJJbmZvO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQnlOYW1lQXN5bmMobmFtZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgcmV0dXJuIHRoaXMuZmluZFBhcmFtZXRlckFzeW5jKG5hbWUsIHVuZGVmaW5lZCk7XG4gIH1cblxuICBwdWJsaWMgZmluZFBhcmFtZXRlckJ5R2xvYmFsRmllbGROYW1lQXN5bmMoZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPFBhcmFtZXRlckltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5maW5kUGFyYW1ldGVyQXN5bmModW5kZWZpbmVkLCBmaWVsZE5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBmaW5kUGFyYW1ldGVyQXN5bmMobmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkLCBmaWVsZE5hbWU6IHN0cmluZyB8IHVuZGVmaW5lZCk6IFByb21pc2U8UGFyYW1ldGVySW1wbCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdmaW5kUGFyYW1ldGVyQXN5bmMnLFxuICAgIH07XG4gICAgaWYgKG5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5QYXJhbWV0ZXJDYXB0aW9uXSA9IG5hbWU7XG4gICAgfSBlbHNlIGlmIChmaWVsZE5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5QYXJhbWV0ZXJGaWVsZE5hbWVdID0gZmllbGROYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ25hbWUgb3IgZmllbGROYW1lIG11c3QgYmUgcHJvdmlkZWQgdG8gZmluZCBwYXJhbWV0ZXInKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5GaW5kUGFyYW1ldGVyLCBwYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgaW5zdGFuY2VPZlBhcmFtZXRlckluZm8gPSAob2JqZWN0OiBNb2RlbCk6IG9iamVjdCBpcyBQYXJhbWV0ZXJJbmZvID0+IHtcbiAgICAgICAgcmV0dXJuICdmaWVsZE5hbWUnIGluIG9iamVjdDtcbiAgICAgIH07XG5cbiAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgdG8gc2VlIGlmIHdlIGdvdCBhIHZhbGlkIHJlc3BvbnNlIGJhY2sgYWdhaW5cbiAgICAgIGlmIChpbnN0YW5jZU9mUGFyYW1ldGVySW5mbyhyZXNwb25zZS5yZXN1bHQpKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdDtcbiAgICAgICAgcmV0dXJuIG5ldyBQYXJhbWV0ZXJJbXBsKHJlc3VsdCwgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIFBhcmFtZXRlcklkLFxuICBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcyxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSBhcyBTZWxlY3Rpb25VcGRhdGVUeXBlSW50ZXJuYWwsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBEaW1lbnNpb25TZWxlY3Rpb25Nb2RlbCxcbiAgSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWwsXG4gIEhvdmVyVHVwbGVJbnRlcmFjdGlvbk1vZGVsLFxuICBSYW5nZVNlbGVjdGlvbk1vZGVsLFxuICBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbk1vZGVsLFxuICBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIsXG4gIFR1cGxlU2VsZWN0aW9uTW9kZWwsXG4gIFZhbHVlU2VsZWN0aW9uTW9kZWwsXG59IGZyb20gJy4uLy4uL01vZGVscy9TZWxlY3Rpb25Nb2RlbHMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlbGVjdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIFNlbGVjdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU2VsZWN0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlNlbGVjdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gY2xlYXIgYWxsIHRoZSBzZWxlY3RlZCBtYXJrcyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqL1xuICBwdWJsaWMgY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuQ2xlYXJTZWxlY3RlZE1hcmtzLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuOyAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBzZWxlY3QgbWFya3MgZm9yIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gc2VsZWN0aW9uQ3JpdGVyaWFcbiAgICogQHBhcmFtIHNlbGVjdGlvblVwZGF0ZVR5cGVcbiAgICovXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5VmFsdWVBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgc2VsZWN0aW9uQ3JpdGVyaWFzOiBBcnJheTxDb250cmFjdC5TZWxlY3Rpb25Dcml0ZXJpYT4sXG4gICAgc2VsZWN0aW9uVXBkYXRlVHlwZTogQ29udHJhY3QuU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHNlbGVjdGlvbkNyaXRlcmlhcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnU2VsZWN0aW9uIGNyaXRlcmlhIG1pc3NpbmcgZm9yIHNlbGVjdGluZyBtYXJrcyBieSB2YWx1ZScpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGlvblR5cGU6IHN0cmluZyA9IHRoaXMudmFsaWRhdGVTZWxlY3Rpb25VcGRhdGVUeXBlKHNlbGVjdGlvblVwZGF0ZVR5cGUpO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSB0aGlzLnBhcnNlU2VsZWN0aW9uTWFya3Moc2VsZWN0aW9uQ3JpdGVyaWFzKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzZWxlY3RNYXJrc0J5VmFsdWVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3Rpb25VcGRhdGVUeXBlXTogc2VsZWN0aW9uVHlwZSxcbiAgICB9O1xuXG4gICAgaWYgKHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmhpZXJNb2RlbEFyciAmJiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5oaWVyTW9kZWxBcnIubGVuZ3RoKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkhpZXJWYWxTZWxlY3Rpb25Nb2RlbHNdID0gc2VsZWN0aW9uTW9kZWxDb250YWluZXIuaGllck1vZGVsQXJyO1xuICAgIH1cbiAgICBpZiAoc2VsZWN0aW9uTW9kZWxDb250YWluZXIucXVhbnRNb2RlbEFyciAmJiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5xdWFudE1vZGVsQXJyLmxlbmd0aCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5RdWFudFJhbmdlU2VsZWN0aW9uTW9kZWxzXSA9IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnF1YW50TW9kZWxBcnI7XG4gICAgfVxuICAgIGlmIChzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5kaW1Nb2RlbEFyciAmJiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5kaW1Nb2RlbEFyci5sZW5ndGgpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRGltVmFsU2VsZWN0aW9uTW9kZWxzXSA9IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmRpbU1vZGVsQXJyO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNlbGVjdEJ5VmFsdWUsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLmFwaUZpbHRlckhhbmRsZXJDaGVja0ZvckNvbW1hbmRFcnJvcihyZXNwb25zZS5yZXN1bHQgYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIGV4ZWN1dGUgaG92ZXIgYWN0aW9ucyBhbmQgcmVuZGVyIHRvb2x0aXAgZm9yIGEgZ2l2ZW4gdHVwbGUgcmVwcmVzZW50aW5nIGEgbWFyayBpbiB0aGUgdmlzdWFsaXphdGlvbi5cbiAgICogSWYgdGhlIHRvb2x0aXAgcGFyYW1ldGVyIGlzIGluY2x1ZGVkIGl0IHdpbGwgc2hvdyB0aGUgdG9vbHRpcCBvbiBob3Zlci4gSWYgbm90LCBubyB0b29sdGlwIGlzIHNob3duLlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHBhcmFtIGhvdmVyZWRUdXBsZVxuICAgKiBAcGFyYW0gdG9vbHRpcFxuICAgKiBAcmV0dXJucyBlbXB0eSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgZXh0ZW5zaW9uIGhvc3QgaGFzIHN1Y2Nlc3NmdWxseSBiZWVuIGluZm9ybWVkIG9mIHRoZSByZXF1ZXN0IGFuZCByZWplY3RzIG9uIGVycm9yXG4gICAqL1xuICBwdWJsaWMgaG92ZXJUdXBsZUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBob3ZlcmVkVHVwbGU/OiBudW1iZXIsXG4gICAgdG9vbHRpcD86IENvbnRyYWN0LlRvb2x0aXBDb250ZXh0IHwgbnVsbCxcbiAgICBhbGxvd0hvdmVyQWN0aW9ucz86IGJvb2xlYW4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCBpbnRlcmFjdGlvbk1vZGVsID0gbmV3IEhvdmVyVHVwbGVJbnRlcmFjdGlvbk1vZGVsKFxuICAgICAgdmlzdWFsSWQsXG4gICAgICB0aGlzLmVuc3VyZVR1cGxlSURJc05vbk5lZ2F0aXZlKGhvdmVyZWRUdXBsZSksXG4gICAgICB0b29sdGlwLFxuICAgICAgYWxsb3dIb3ZlckFjdGlvbnMsXG4gICAgKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdob3ZlclR1cGxlQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkhvdmVyVHVwbGVJbnRlcmFjdGlvbl06IGludGVyYWN0aW9uTW9kZWwsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJhaXNlSG92ZXJUdXBsZU5vdGlmaWNhdGlvbiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gbW9kaWZ5IHNlbGVjdGlvbiwgZXhlY3V0ZSBzZWxlY3QgYWN0aW9ucyBhbmQgcmVuZGVyIHRvb2x0aXAgZm9yIGEgZ2l2ZW4gbGlzdCBvZiB0dXBsZXMgcmVwcmVzZW50aW5nIGEgbWFyayBvciBtYXJrcyBpbiB0aGUgdmlzdWFsaXphdGlvbi5cbiAgICogSWYgdGhlIHRvb2x0aXAgcGFyYW1ldGVyIGlzIGluY2x1ZGVkIGl0IHdpbGwgc2hvdyB0aGUgdG9vbHRpcCBvbiBzZWxlY3QuIElmIG5vdCwgbm8gdG9vbHRpcCBpcyBzaG93bi5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBzZWxlY3RlZFR1cGxlc1xuICAgKiBAcGFyYW0gc2VsZWN0T3B0aW9uXG4gICAqIEBwYXJhbSB0b29sdGlwXG4gICAqIEByZXR1cm5zIGVtcHR5IHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBleHRlbnNpb24gaG9zdCBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gaW5mb3JtZWQgb2YgdGhlIHJlcXVlc3QgYW5kIHJlamVjdHMgb24gZXJyb3JcbiAgICovXG4gIHB1YmxpYyBzZWxlY3RUdXBsZXNBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgc2VsZWN0ZWRUdXBsZXM6IEFycmF5PG51bWJlcj4sXG4gICAgc2VsZWN0T3B0aW9uOiBDb250cmFjdC5TZWxlY3RPcHRpb25zLFxuICAgIHRvb2x0aXA/OiBDb250cmFjdC5Ub29sdGlwQ29udGV4dCxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGludGVyYWN0aW9uTW9kZWwgPSBuZXcgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb25Nb2RlbCh2aXN1YWxJZCwgc2VsZWN0ZWRUdXBsZXMsIHNlbGVjdE9wdGlvbiwgdG9vbHRpcCk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VsZWN0VHVwbGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdFR1cGxlc0ludGVyYWN0aW9uXTogaW50ZXJhY3Rpb25Nb2RlbCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuUmFpc2VTZWxlY3RUdXBsZXNOb3RpZmljYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwaUZpbHRlckhhbmRsZXJDaGVja0ZvckNvbW1hbmRFcnJvcihzZXJ2ZXJQbTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIGlmICghc2VydmVyUG1bUGFyYW1ldGVySWQuUGFyYW1ldGVyRXJyb3JdKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkRmllbGRzXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkludmFsaWRTZWxlY3Rpb25GaWVsZE5hbWUsIHNlcnZlclBtW1BhcmFtZXRlcklkLkludmFsaWRGaWVsZHNdKTtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW1BhcmFtZXRlcklkLkludmFsaWRWYWx1ZXNdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFNlbGVjdGlvblZhbHVlLCBzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkVmFsdWVzXSk7XG4gICAgfVxuICAgIGlmIChzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5JbnZhbGlkRGF0ZXNdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFNlbGVjdGlvbkRhdGUsIHNlcnZlclBtW1BhcmFtZXRlcklkLkludmFsaWREYXRlc10pO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gc2VsZWN0IG1hcmtzIGZvciB0aGUgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHBhcmFtIE1hcmtJbmZvXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25VcGRhdGVUeXBlXG4gICAqL1xuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlkQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIG1hcmtzOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4sXG4gICAgc2VsZWN0aW9uVXBkYXRlVHlwZTogQ29udHJhY3QuU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKG1hcmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdNYXJrcyBpbmZvIG1pc3NpbmcgZm9yIHNlbGVjdGluZyBtYXJrcyBieSBJZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IHNlbGVjdGlvblR5cGU6IHN0cmluZyA9IHRoaXMudmFsaWRhdGVTZWxlY3Rpb25VcGRhdGVUeXBlKHNlbGVjdGlvblVwZGF0ZVR5cGUpO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSB0aGlzLnBhcnNlU2VsZWN0aW9uSWRzKG1hcmtzKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzZWxlY3RNYXJrc0J5SWRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3Rpb25VcGRhdGVUeXBlXTogc2VsZWN0aW9uVHlwZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZWxlY3Rpb25dOiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb24sXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZWxlY3RCeVZhbHVlLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgLy8gRXhwZWN0aW5nIGFuIGVtcHR5IG1vZGVsIGFuZCBoZW5jZSB0aGUgdm9pZCByZXNwb25zZS5cbiAgICAgIHJldHVybjtcbiAgICAgIC8vIFRPRE8gSW52ZXN0aWdhdGUgdGhlIGVycm9yIHJlc3BvbnNlIHdpdGggbXVsdGlwbGUgb3V0cHV0IHBhcmFtcyBhbmQgdGhyb3cgZXJyb3IgYWNjb3JkaW5nbHkuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHByZXBhcmUgdGhlIHByZXMgbW9kZWxzIGZvciBzZWxlY3Rpb24gYnkgTWFya3NJbmZvXG4gICAqIEBwYXJhbSBtYXJrc1xuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVNlbGVjdGlvbklkcyhtYXJrczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+KTogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgICBjb25zdCBpZHM6IEFycmF5PHN0cmluZz4gPSBbXTtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gbmV3IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lcigpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHR1cGxlSWQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IG1hcmtzW2ldLnR1cGxlSWQ7XG4gICAgICBpZiAodHVwbGVJZCAhPT0gdW5kZWZpbmVkICYmIHR1cGxlSWQgIT09IG51bGwpIHtcbiAgICAgICAgLy8gSWYgdHVwbGUgaWQgaXMgcHJvdmlkZWQgdXNlIHRoYXQgaW5zdGVhZCBvZiBwYWlyXG4gICAgICAgIGlkcy5wdXNoKHR1cGxlSWQudG9TdHJpbmcoKSk7IC8vIGNvbGxlY3QgdGhlIHR1cGxlIGlkc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICd0dXBsZUlkIHBhcnNpbmcgZXJyb3InKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IDApIHtcbiAgICAgIC8vIHR1cGxlIGlkcyBiYXNlZCBzZWxlY3Rpb25cbiAgICAgIGNvbnN0IHR1cGxlU2VsZWN0aW9uTW9kZWw6IFR1cGxlU2VsZWN0aW9uTW9kZWwgPSBuZXcgVHVwbGVTZWxlY3Rpb25Nb2RlbCgpO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5zZWxlY3Rpb25UeXBlID0gJ3R1cGxlcyc7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLm9iamVjdElkcyA9IGlkcztcbiAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbiA9IHR1cGxlU2VsZWN0aW9uTW9kZWw7XG4gICAgfVxuICAgIHJldHVybiBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSB2YWx1ZXMuXG4gICAqXG4gICAqIFN1cHBvcnRzIDMgdHlwZXMgZm9yIHNlbGVjdGlvbjpcbiAgICogMSkgSGllcmFyY2hpY2FsIHZhbHVlIGJhc2VkIHNlbGVjdGlvblxuICAgKiAyKSBSYW5nZSB2YWx1ZSBiYXNlZCBzZWxlY3Rpb25cbiAgICogMykgRGltZW5zaW9uIHZhbHVlIGJhc2VkIHNlbGVjdGlvblxuICAgKlxuICAgKiBAcGFyYW0gbWFya3NcbiAgICovXG4gIHByaXZhdGUgcGFyc2VTZWxlY3Rpb25NYXJrcyhzZWxlY3Rpb25Dcml0ZXJpYXM6IEFycmF5PENvbnRyYWN0LlNlbGVjdGlvbkNyaXRlcmlhPik6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IG5ldyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsZWN0aW9uQ3JpdGVyaWFzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzdCA9IHNlbGVjdGlvbkNyaXRlcmlhc1tpXTtcbiAgICAgIGlmICghKHN0LmZpZWxkTmFtZSAmJiBzdC52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHN0LnZhbHVlICE9PSBudWxsKSkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1NlbGVjdGlvbiBDcml0ZXJpYSBwYXJzaW5nIGVycm9yJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNhdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnKFtbQS1aYS16MC05XStdKS4qJywgJ2cnKTtcbiAgICAgIGNvbnN0IHJhbmdlT3B0aW9uID0gc3QudmFsdWUgYXMgQ29udHJhY3QuUmFuZ2VWYWx1ZTtcbiAgICAgIGlmIChjYXRSZWdleC50ZXN0KHN0LmZpZWxkTmFtZSkpIHtcbiAgICAgICAgLy8gSGllcmFyY2hpY2FsIHZhbHVlIHNlbGVjdGlvblxuICAgICAgICBjb25zdCBoaWVyTW9kZWw6IEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsID0gdGhpcy5hZGRUb1BhcmFtc0xpc3Qoc3QuZmllbGROYW1lLCBzdC52YWx1ZSkgYXMgSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWw7XG4gICAgICAgIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmhpZXJNb2RlbEFyci5wdXNoKGhpZXJNb2RlbCk7XG4gICAgICB9IGVsc2UgaWYgKHJhbmdlT3B0aW9uLm1pbiAhPT0gdW5kZWZpbmVkICYmIHJhbmdlT3B0aW9uLm1heCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFJhbmdlIHZhbHVlIHNlbGVjdGlvblxuICAgICAgICBjb25zdCBxdWFudE1vZGVsOiBSYW5nZVNlbGVjdGlvbk1vZGVsID0gdGhpcy5hZGRUb1JhbmdlUGFyYW1zTGlzdChzdC5maWVsZE5hbWUsIHJhbmdlT3B0aW9uKTtcbiAgICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIucXVhbnRNb2RlbEFyci5wdXNoKHF1YW50TW9kZWwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGltZW5zaW9uIHZhbHVlIHNlbGVjdGlvblxuICAgICAgICBjb25zdCBkaW1Nb2RlbDogRGltZW5zaW9uU2VsZWN0aW9uTW9kZWwgPSB0aGlzLmFkZFRvUGFyYW1zTGlzdChzdC5maWVsZE5hbWUsIHN0LnZhbHVlKSBhcyBEaW1lbnNpb25TZWxlY3Rpb25Nb2RlbDtcbiAgICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnIucHVzaChkaW1Nb2RlbCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB0cmFuc2Zvcm0gdGhlIGtleSB2YWx1ZSBwYWlyIGludG8gdmFsdWUgYmFzZWQgcHJlcyBtb2RlbCBvYmplY3QuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZVNlbGVjdGlvbk1vZGVsXG4gICAqIEBwYXJhbSBmaWVsZE5hbWVcbiAgICogQHBhcmFtIHZhbHVlXG4gICAqL1xuICBwcml2YXRlIGFkZFRvUGFyYW1zTGlzdChmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IENvbnRyYWN0LkNhdGVnb3JpY2FsVmFsdWUgfCBDb250cmFjdC5SYW5nZVZhbHVlKTogVmFsdWVTZWxlY3Rpb25Nb2RlbCB7XG4gICAgY29uc3QgdmFsdWVTZWxlY3Rpb25Nb2RlbDogVmFsdWVTZWxlY3Rpb25Nb2RlbCA9IG5ldyBWYWx1ZVNlbGVjdGlvbk1vZGVsKCk7XG4gICAgY29uc3QgbWFya1ZhbHVlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuXG4gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQXJyYXkpIHtcbiAgICAgIGNvbnN0IHZhbHVlQXJyOiBBcnJheTxzdHJpbmc+ID0gdmFsdWU7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlQXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG1hcmtWYWx1ZXMucHVzaChQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZUFycltpXSkpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBtYXJrVmFsdWVzLnB1c2goUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWUpKTtcbiAgICB9XG5cbiAgICB2YWx1ZVNlbGVjdGlvbk1vZGVsLnF1YWxpZmllZEZpZWxkQ2FwdGlvbiA9IGZpZWxkTmFtZTtcbiAgICB2YWx1ZVNlbGVjdGlvbk1vZGVsLnNlbGVjdFZhbHVlcyA9IG1hcmtWYWx1ZXM7XG4gICAgcmV0dXJuIHZhbHVlU2VsZWN0aW9uTW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHRyYW5zZm9ybSB0aGUga2V5IHZhbHVlIHBhaXIgaW50byByYW5nZSBiYXNlZCBzZWxlY3Rpb24gcHJlcyBtb2RlbC5cbiAgICpcbiAgICogVE9ETzogTmVlZCB0byBoYW5kbGUgdGhlIHBhcnNpbmcgb2YgZGF0ZSB0eXBlIHZhbHVlcy5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlU2VsZWN0aW9uTW9kZWxcbiAgICogQHBhcmFtIGZpZWxkTmFtZVxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHByaXZhdGUgYWRkVG9SYW5nZVBhcmFtc0xpc3QoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiBDb250cmFjdC5SYW5nZVZhbHVlKTogUmFuZ2VTZWxlY3Rpb25Nb2RlbCB7XG4gICAgY29uc3QgcmFuZ2VTZWxlY3Rpb25Nb2RlbDogUmFuZ2VTZWxlY3Rpb25Nb2RlbCA9IG5ldyBSYW5nZVNlbGVjdGlvbk1vZGVsKCk7XG4gICAgcmFuZ2VTZWxlY3Rpb25Nb2RlbC5xdWFsaWZpZWRGaWVsZENhcHRpb24gPSBmaWVsZE5hbWU7XG4gICAgaWYgKHZhbHVlLm1heCAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLm1heCAhPT0gbnVsbCkge1xuICAgICAgcmFuZ2VTZWxlY3Rpb25Nb2RlbC5tYXhWYWx1ZSA9IFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlLm1heCk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5taW4gIT09IHVuZGVmaW5lZCAmJiB2YWx1ZS5taW4gIT09IG51bGwpIHtcbiAgICAgIHJhbmdlU2VsZWN0aW9uTW9kZWwubWluVmFsdWUgPSBQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZS5taW4pO1xuICAgIH1cbiAgICByYW5nZVNlbGVjdGlvbk1vZGVsLmluY2x1ZGVkID0gdGhpcy52YWxpZGF0ZU51bGxPcHRpb25UeXBlKHZhbHVlLm51bGxPcHRpb24pO1xuICAgIHJldHVybiByYW5nZVNlbGVjdGlvbk1vZGVsO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byB2YWxpZGF0ZSB0aGUgc2VsZWN0aW9uIHVwZGF0ZSB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gc2VsZWN0aW9uVXBkYXRlVHlwZVxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZVNlbGVjdGlvblVwZGF0ZVR5cGUoc2VsZWN0aW9uVXBkYXRlVHlwZTogQ29udHJhY3QuU2VsZWN0aW9uVXBkYXRlVHlwZSk6IHN0cmluZyB7XG4gICAgaWYgKHNlbGVjdGlvblVwZGF0ZVR5cGUgPT09IENvbnRyYWN0LlNlbGVjdGlvblVwZGF0ZVR5cGUuUmVwbGFjZSkge1xuICAgICAgcmV0dXJuIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbC5SZXBsYWNlO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uVXBkYXRlVHlwZSA9PT0gQ29udHJhY3QuU2VsZWN0aW9uVXBkYXRlVHlwZS5BZGQpIHtcbiAgICAgIHJldHVybiBTZWxlY3Rpb25VcGRhdGVUeXBlSW50ZXJuYWwuQWRkO1xuICAgIH0gZWxzZSBpZiAoc2VsZWN0aW9uVXBkYXRlVHlwZSA9PT0gQ29udHJhY3QuU2VsZWN0aW9uVXBkYXRlVHlwZS5SZW1vdmUpIHtcbiAgICAgIHJldHVybiBTZWxlY3Rpb25VcGRhdGVUeXBlSW50ZXJuYWwuUmVtb3ZlO1xuICAgIH1cbiAgICByZXR1cm4gU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLlJlcGxhY2U7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHZhbGlkYXRlIHRoZSBpbmNsdWRlIHR5cGUgZm9yIHJhbmdlIHNlbGVjdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIG51bGxPcHRpb25cbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVOdWxsT3B0aW9uVHlwZShudWxsT3B0aW9uOiBDb250cmFjdC5GaWx0ZXJOdWxsT3B0aW9uIHwgdW5kZWZpbmVkKTogc3RyaW5nIHtcbiAgICBpZiAobnVsbE9wdGlvbikge1xuICAgICAgaWYgKG51bGxPcHRpb24gPT09IENvbnRyYWN0LkZpbHRlck51bGxPcHRpb24uTnVsbFZhbHVlcykge1xuICAgICAgICByZXR1cm4gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMuSW5jbHVkZU51bGw7XG4gICAgICB9IGVsc2UgaWYgKG51bGxPcHRpb24gPT09IENvbnRyYWN0LkZpbHRlck51bGxPcHRpb24uTm9uTnVsbFZhbHVlcykge1xuICAgICAgICByZXR1cm4gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMuSW5jbHVkZU5vbk51bGw7XG4gICAgICB9IGVsc2UgaWYgKG51bGxPcHRpb24gPT09IENvbnRyYWN0LkZpbHRlck51bGxPcHRpb24uQWxsVmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcy5JbmNsdWRlQWxsO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcy5JbmNsdWRlQWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVUdXBsZUlESXNOb25OZWdhdGl2ZSh0dXBsZUlkPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodHVwbGVJZCAmJiB0dXBsZUlkID4gMCkge1xuICAgICAgcmV0dXJuIHR1cGxlSWQ7XG4gICAgfVxuXG4gICAgLy8gMCB3aWxsIG5vdCByZWZlciB0byBhIHZhbGlkIHR1cGxlIChzaW5jZSB0dXBsZSBpZHMgYXJlIDEtYmFzZWQpLFxuICAgIC8vIGJ1dCBjYW4gYmUgdXNlZCBmb3IgY2xlYXJpbmcgdGhlIGN1cnJlbnQgaG92ZXIgb3Igc2VsZWN0aW9uXG4gICAgcmV0dXJuIDA7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4ZWN1dGVSZXNwb25zZSwgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLCBJbnRlcm5hbFRhYmxlYXVFcnJvciwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFNob3VsZFRocm93IH0gZnJvbSAnLi4vLi4vVXRpbHMvRW51bUNvbnZlcnRlcic7XG5cbi8qKlxuICogRWFjaCBTZXJ2Y2VJbXBsIHNob3VsZCBleHRlbmQgdGhpcyBiYXNlIGNsYXNzIGZvciB0aGUgc2FrZSBvZlxuICogcHJvcGVyIGVycm9yIGhhbmRsaW5nLiAgVGhpcyBiYXNlIGhhbmRsZXMgdGhlIGNvbnZlcnNpb25cbiAqIGZyb20gaW50ZXJuYWwgZXJyb3JzIHRvIGV4dGVybmFsIGVycm9ycyB0aGF0IHdlIHRocm93IHRvIGRldmVsb3BlcnNcbiAqL1xuZXhwb3J0IGNsYXNzIFNlcnZpY2VJbXBsQmFzZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIHByb3RlY3RlZCBfcmVnaXN0cnlJZDogbnVtYmVyKSB7fVxuXG4gIHByb3RlY3RlZCBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoZXIuZXhlY3V0ZSh2ZXJiLCBwYXJhbXMpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgLy8gQW55IGludGVybmFsIGVycm9yIHRoYXQgY29tZXMgZnJvbSB0aGUgZGlzcGF0Y2hlciBzaG91bGQgYmUgY29udmVydGVkXG4gICAgICAvLyB0byBhbiBleHRlcm5hbCBlcnJvciB1c2luZyB0aGUgZW51bSBtYXBwZXIgZm9yIGVycm9yIGNvZGVzLlxuICAgICAgY29uc3QgaW50ZXJuYWxFcnJvciA9IGVycm9yIGFzIEludGVybmFsVGFibGVhdUVycm9yO1xuICAgICAgY29uc3QgZXh0ZXJuYWxFcnJvckNvZGU6IEVycm9yQ29kZXMgPSBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZXJyb3JDb2RlLmNvbnZlcnQoaW50ZXJuYWxFcnJvci5lcnJvckNvZGUsIFNob3VsZFRocm93Lk5vKTtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoZXh0ZXJuYWxFcnJvckNvZGUsIGludGVybmFsRXJyb3IubWVzc2FnZSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNoZWV0U2l6ZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuLi9TaXplU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBTaXplU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTaXplU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlNpemU7XG4gIH1cblxuICBjaGFuZ2VTaXplQXN5bmMobmFtZTogc3RyaW5nLCBuZXdTaXplOiBTaGVldFNpemUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY2hhbmdlU2l6ZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaGVldE5hbWVdOiBuYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLk1pbkhlaWdodF06IG5ld1NpemUubWluU2l6ZT8uaGVpZ2h0IHx8IDAsXG4gICAgICBbUGFyYW1ldGVySWQuTWluV2lkdGhdOiBuZXdTaXplLm1pblNpemU/LndpZHRoIHx8IDAsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4SGVpZ2h0XTogbmV3U2l6ZS5tYXhTaXplPy5oZWlnaHQgfHwgMCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhXaWR0aF06IG5ld1NpemUubWF4U2l6ZT8ud2lkdGggfHwgMCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0U2hlZXRTaXplLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChfcmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBTdG9yeVBvaW50TW9kZWwsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU3RvcnlBY3RpdmF0aW9uU2VydmljZSB9IGZyb20gJy4uL1N0b3J5QWN0aXZhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuU3RvcnlBY3RpdmF0aW9uO1xuICB9XG5cbiAgYWN0aXZhdGVOZXh0U3RvcnlQb2ludEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQWN0aXZhdGVOZXh0U3RvcnlQb2ludDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVOZXh0U3RvcnlQb2ludEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFjdGl2YXRlUHJldmlvdXNTdG9yeVBvaW50O1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgYWN0aXZhdGVTdG9yeVBvaW50QXN5bmMoaW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQWN0aXZhdGVTdG9yeVBvaW50O1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhY3RpdmF0ZVN0b3J5UG9pbnRBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlN0b3J5UG9pbnRJbmRleF0gPSBpbmRleDtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHJldmVydFN0b3J5UG9pbnRBc3luYyhpbmRleDogbnVtYmVyKTogUHJvbWlzZTxTdG9yeVBvaW50TW9kZWw+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLlJldmVydFN0b3J5UG9pbnQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JldmVydFN0b3J5UG9pbnRBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlN0b3J5UG9pbnRJbmRleF0gPSBpbmRleDtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxTdG9yeVBvaW50TW9kZWw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBTdG9yeVBvaW50TW9kZWw7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQsIFZpc3VhbFNwZWNpZmljYXRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFZpc3VhbE1vZGVsU2VydmljZSB9IGZyb20gJy4uL1Zpc3VhbE1vZGVsU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBWaXN1YWxNb2RlbFNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgVmlzdWFsTW9kZWxTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFZpc3VhbFNwZWNpZmljYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgVmlzdWFsU3BlY2lmaWNhdGlvbjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWRkTWFya3NDYXJkRmllbGRzQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIG1hcmtzQ2FyZEluZGV4OiBudW1iZXIsXG4gICAgZW5jb2RpbmdUeXBlOiBDb250cmFjdC5FbmNvZGluZ1R5cGUsXG4gICAgY29sdW1uczogQXJyYXk8Q29udHJhY3QuQ29sdW1uPixcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhZGRNYXJrc0NhcmRGaWVsZHNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXJrc0NhcmRJbmRleF06IG1hcmtzQ2FyZEluZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLkVuY29kaW5nVHlwZV06IGVuY29kaW5nVHlwZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zXTogY29sdW1ucyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TdGFydEluZGV4XTogc3RhcnRJbmRleCxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkFkZE1hcmtzQ2FyZEZpZWxkcywgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbW92ZU1hcmtzQ2FyZEZpZWxkQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIG1hcmtzQ2FyZEluZGV4OiBudW1iZXIsXG4gICAgZnJvbUluZGV4OiBudW1iZXIsXG4gICAgdG9JbmRleDogbnVtYmVyLFxuICAgIGZpZWxkQ291bnQgPSAxLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWRkTWFya3NDYXJkRmllbGRzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBbUGFyYW1ldGVySWQuTWFya3NDYXJkSW5kZXhdOiBtYXJrc0NhcmRJbmRleCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Gcm9tSW5kZXhdOiBmcm9tSW5kZXgsXG4gICAgICBbUGFyYW1ldGVySWQuVG9JbmRleF06IHRvSW5kZXgsXG4gICAgICBbUGFyYW1ldGVySWQuRmllbGRDb3VudF06IGZpZWxkQ291bnQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5Nb3ZlTWFya3NDYXJkRmllbGQsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNwbGljZU1hcmtzQ2FyZEZpZWxkc0FzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICBkZWxldGVDb3VudDogbnVtYmVyLFxuICAgIGNvbHVtbnM6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4sXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuV29ya3NoZWV0TmFtZV06IHZpc3VhbElkLndvcmtzaGVldCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXJrc0NhcmRJbmRleF06IG1hcmtzQ2FyZEluZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLkVuY29kaW5nVHlwZV06IGVuY29kaW5nVHlwZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TdGFydEluZGV4XTogc3RhcnRJbmRleCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EZWxldGVDb3VudF06IGRlbGV0ZUNvdW50LFxuICAgICAgW1BhcmFtZXRlcklkLkNvbHVtbnNdOiBjb2x1bW5zLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU3BsaWNlTWFya3NDYXJkRmllbGRzLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIGVkaXRBbGlhc2VzRGlhbG9nQXN5bmMoZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZWRpdEFsaWFzZXNEaWFsb2dBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRmllbGRJZF06IGZpZWxkTmFtZSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkVkaXRBbGlhc2VzRGlhbG9nLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ3VzdG9tVmlld01vZGVsLCBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDdXN0b21WaWV3SW1wbCB9IGZyb20gJy4uLy4uL0ltcGwvQ3VzdG9tVmlld0ltcGwnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFZpelNlcnZpY2UgfSBmcm9tICcuLi9WaXpTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIFZpelNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgVml6U2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlZpejtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYzogb2JqZWN0KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY3JlYXRlVml6SW1hZ2VBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVml6QVBJSW5wdXRKc29uXTogSlNPTi5zdHJpbmdpZnkoaW5wdXRTcGVjKSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuVml6QVBJLCBwYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWN0aXZhdGVTaGVldEFzeW5jKG5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhY3RpdmF0ZVNoZWV0QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlN3aXRjaFRvU2hlZXROYW1lXTogbmFtZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuQWN0aXZhdGVTaGVldCwgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q3VzdG9tVmlld3NBc3luYygpOiBQcm9taXNlPEFycmF5PEN1c3RvbVZpZXdJbXBsPj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRDdXN0b21WaWV3c0FzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0Q3VzdG9tVmlld3MsIHBhcmFtZXRlcnMpLnRoZW48QXJyYXk8Q3VzdG9tVmlld0ltcGw+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbVZpZXdzID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PEN1c3RvbVZpZXdNb2RlbD47XG4gICAgICByZXR1cm4gY3VzdG9tVmlld3MubWFwKChjdXN0b21WaWV3OiBDdXN0b21WaWV3TW9kZWwpID0+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBDdXN0b21WaWV3SW1wbChjdXN0b21WaWV3LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNob3dDdXN0b21WaWV3QXN5bmMoY3VzdG9tVmlld05hbWU/OiBzdHJpbmcgfCBudWxsKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbCB8IHVuZGVmaW5lZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzaG93Q3VzdG9tVmlld0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3TmFtZV06IGN1c3RvbVZpZXdOYW1lIHx8ICcnLCAvLyBhIGZhbHNleSB2YWx1ZSBtZWFucyBcInNob3cgb3JpZ2luYWwgdmlld1wiXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNob3dDdXN0b21WaWV3LCBwYXJhbWV0ZXJzKS50aGVuPEN1c3RvbVZpZXdJbXBsIHwgdW5kZWZpbmVkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbVZpZXcgPSByZXNwb25zZS5yZXN1bHQgYXMgQ3VzdG9tVmlld01vZGVsO1xuICAgICAgcmV0dXJuIGN1c3RvbVZpZXc/Lmx1aWQgPyBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCkgOiB1bmRlZmluZWQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQ3VzdG9tVmlld0FzeW5jKGN1c3RvbVZpZXdOYW1lOiBzdHJpbmcpOiBQcm9taXNlPEN1c3RvbVZpZXdJbXBsPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbW92ZUN1c3RvbVZpZXdBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld05hbWVdOiBjdXN0b21WaWV3TmFtZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuUmVtb3ZlQ3VzdG9tVmlldywgcGFyYW1ldGVycykudGhlbjxDdXN0b21WaWV3SW1wbD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3ID0gcmVzcG9uc2UucmVzdWx0IGFzIEN1c3RvbVZpZXdNb2RlbDtcbiAgICAgIHJldHVybiBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUN1c3RvbVZpZXdBc3luYyhjdXN0b21WaWV3TmFtZTogc3RyaW5nKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIC8vIEN1c3RvbVZpZXdJc0RlZmF1bHQgaXMgYSByZXF1aXJlZCBwYXJhbWV0ZXIsIGJ1dCBvdXIgQVBJIGhhcyBub3QgYmVlbiB1cGRhdGVkIHRvIGFsbG93IGl0IHRvIGJlIHNwZWNpZmllZCB5ZXQuXG4gICAgLy8gV2Ugc2hvdWxkIGFkZCBhICdkZWZhdWx0JyBwYXJhbWV0ZXIgdG8gdGhlIGludGVyZmFjZS5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2F2ZUN1c3RvbVZpZXdBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld05hbWVdOiBjdXN0b21WaWV3TmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3SXNEZWZhdWx0XTogZmFsc2UsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNhdmVXb3JrYm9va0FzQ3VzdG9tVmlldywgcGFyYW1ldGVycykudGhlbjxDdXN0b21WaWV3SW1wbD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBjdXN0b21WaWV3ID0gcmVzcG9uc2UucmVzdWx0IGFzIEN1c3RvbVZpZXdNb2RlbDtcbiAgICAgIHJldHVybiBuZXcgQ3VzdG9tVmlld0ltcGwoY3VzdG9tVmlldywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2V0QWN0aXZlQ3VzdG9tVmlld0FzRGVmYXVsdEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzZXRBY3RpdmVDdXN0b21WaWV3QXNEZWZhdWx0QXN5bmMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZXRBY3RpdmVDdXN0b21WaWV3QXNEZWZhdWx0LCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQXN5bmMoY3VzdG9tVmlldzogQ3VzdG9tVmlld0ltcGwpOiBQcm9taXNlPEN1c3RvbVZpZXdJbXBsPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NhdmVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld0x1aWRdOiBjdXN0b21WaWV3Lmx1aWQsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld05hbWVdOiBjdXN0b21WaWV3Lm5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld0lzRGVmYXVsdF06IGN1c3RvbVZpZXcuaXNEZWZhdWx0LFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdJc1B1YmxpY106IGN1c3RvbVZpZXcuc2hhcmVkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5VcGRhdGVDdXN0b21WaWV3LCBwYXJhbWV0ZXJzKS50aGVuPEN1c3RvbVZpZXdJbXBsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbVZpZXcgPSByZXNwb25zZS5yZXN1bHQgYXMgQ3VzdG9tVmlld01vZGVsO1xuICAgICAgcmV0dXJuIG5ldyBDdXN0b21WaWV3SW1wbChjdXN0b21WaWV3LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXJyZW50U3JjQXN5bmMoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q3VycmVudFNyY0FzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0Q3VycmVudFNyYywgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmcpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRXh0ZXJuYWxFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0V4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsJztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uLy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uLy4uL1V0aWxzL1BhcmFtJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBab25lU2VydmljZSB9IGZyb20gJy4uL1pvbmVTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIFpvbmVTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFpvbmVTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuWm9uZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRWaXNpYmlsaXR5QXN5bmMoXG4gICAgZGFzaGJvYXJkOiBzdHJpbmcsXG4gICAgZGFzaGJvYXJkWm9uZU1hcDogTWFwPG51bWJlciwgRGFzaGJvYXJkT2JqZWN0SW1wbD4sXG4gICAgem9uZVZpc2liaWxpdHlNYXA6IENvbnRyYWN0LlpvbmVWaXNpYmlsaXR5TWFwLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzZXRWaXNpYmlsaXR5QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRhc2hib2FyZF06IGRhc2hib2FyZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5ab25lSWRzVmlzaWJpbGl0eU1hcF06IHt9LFxuICAgIH07XG5cbiAgICAvLyB6b25lVmlzaWJpbGl0eU1hcCBjYW4gYmUgZWl0aGVyIGFuIG9iamVjdCBvciBhIE1hcCAtIGNvbnZlcnQgaXQgdG8gYSBNYXBcbiAgICBjb25zdCBwYXJhbWV0ZXJBc01hcCA9IFBhcmFtLmNvbnZlcnRQYXJhbWV0ZXJUb01hcCh6b25lVmlzaWJpbGl0eU1hcCwgJ3pvbmVWaXNpYmlsaXR5TWFwJyk7XG5cbiAgICBwYXJhbWV0ZXJBc01hcC5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5Wm9uZUlzVmFsaWQoZGFzaGJvYXJkWm9uZU1hcCwgTnVtYmVyLnBhcnNlSW50KGtleSwgMTApKTtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGU+KHZhbHVlLCBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZSwgJ0Rhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlJyk7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlpvbmVJZHNWaXNpYmlsaXR5TWFwXVtrZXldID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLnNldFZpc2liaWxpdHlUeXBlLmNvbnZlcnQodmFsdWUpO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0Wm9uZVZpc2liaWxpdHksIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgbW92ZUFuZFJlc2l6ZUFzeW5jKFxuICAgIGRhc2hib2FyZDogc3RyaW5nLFxuICAgIGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+LFxuICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXNoYm9hcmRdOiBkYXNoYm9hcmQsXG4gICAgICBbUGFyYW1ldGVySWQuRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlTGlzdF06IGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICAgIH07XG5cbiAgICBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheS5mb3JFYWNoKChkYXNoYm9hcmRPYmplY3Q6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSkgPT4ge1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVpvbmVJc1ZhbGlkQW5kRmxvYXRpbmcoZGFzaGJvYXJkWm9uZU1hcCwgZGFzaGJvYXJkT2JqZWN0LmRhc2hib2FyZE9iamVjdElEKTtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlXaWR0aEFuZEhlaWdodE9mRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlKGRhc2hib2FyZE9iamVjdCk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5Nb3ZlQW5kUmVzaXplWm9uZXMsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZUluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIGEgdGFibGUgc3VtbWFyeS5cbiAqIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXMganVzdCBhIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhYmxlU3VtbWFyeSBpbXBsZW1lbnRzIENvbnRyYWN0LlRhYmxlU3VtbWFyeSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF90YWJsZUluZm86IFRhYmxlSW5mbykge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29ubmVjdGlvbklkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5jb25uZWN0aW9uSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1c3RvbVNRTCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8uY3VzdG9tU1FMO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFbWJlZGRpbmdFcnJvckNvZGVzLCBFcnJvckNvZGVzLCBTaGFyZWRFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBDdXN0b20gZXJyb3IgY2xhc3MgdGhhdCBleHRlbmRzIHRoZSBkZWZhdWx0IEphdmFTY3JpcHQgRXJyb3Igb2JqZWN0LlxuICogVGhpcyBhbGxvd3MgdXMgdG8gcHJvdmlkZSBhIGZpZWxkIHdpdGggYSBzcGVjaWZpYyBlcnJvciBjb2RlXG4gKiBzbyB0aGF0IGRldmVsb3BlcnMgY2FuIG1vcmUgZWFzaWx5IHByb2dyYW1tYXRpY2FsbHkgcmVzcG9uZFxuICogdG8gZXJyb3Igc2NlbmFyaW9zLlxuICovXG5leHBvcnQgY2xhc3MgVGFibGVhdUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZXJyb3JDb2RlOiBFcnJvckNvZGVzIHwgRW1iZWRkaW5nRXJyb3JDb2RlcyB8IFNoYXJlZEVycm9yQ29kZXMsIG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKGAke19lcnJvckNvZGV9OiAke21lc3NhZ2V9YCk7XG5cbiAgICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC13aWtpL2Jsb2IvbWFzdGVyL0JyZWFraW5nLUNoYW5nZXMubWQjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrXG4gICAgLy8gRXJyb3IgaW5oZXJpdGFuY2UgZG9lcyBub3Qgd29yayBwcm9wZXJ0bHkgd2hlbiBjb21waWxpbmcgdG8gRVM1LCB0aGlzIGlzIGEgd29ya2Fyb3VuZCB0byBmb3JjZVxuICAgIC8vIHRoZSBwcm90byBjaGFpbiB0byBiZSBidWlsdCBjb3JyZWN0bHkuICBTZWUgdGhlIGdpdGh1YiBsaW5rIGFib3ZlIGZvciBkZXRhaWxzLlxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBUYWJsZWF1RXJyb3IucHJvdG90eXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXJyb3JDb2RlKCk6IEVycm9yQ29kZXMgfCBFbWJlZGRpbmdFcnJvckNvZGVzIHwgU2hhcmVkRXJyb3JDb2RlcyB7XG4gICAgcmV0dXJuIHRoaXMuX2Vycm9yQ29kZTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgSW50ZXJuYWxDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVZhbHVlIH0gZnJvbSAnLi4vTW9kZWxzL0dldERhdGFNb2RlbHMnO1xuXG4vKipcbiAqIEluIHZlcnNpb24gMiBvZiB0aGUgaW50ZXJmYWNlLCB3ZSBzaG91bGQgY29sbGFwc2UgdmFsdWUgaW50byBuYXRpdmVWYWx1ZSwgYW5kIGRvIGFsbCB0aGlzIHdvcmsgb3ZlclxuICogaW4gdGhlIHBsYXRmb3JtLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YVZhbHVlRmFjdG9yeSB7XG4gIHB1YmxpYyBzdGF0aWMgTWFrZVBhcmFtZXRlckRhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVmFsdWUsIGRhdGFUeXBlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlKTogRGF0YVZhbHVlIHtcbiAgICAvLyBQYXJhbWV0ZXIgdmFsdWVzIGFyZSBhbGwgc3RyaW5ncywgY29udmVydCBmcm9tIHN0cmluZyB0byB2YWx1ZVxuICAgIHJldHVybiBuZXcgRGF0YVZhbHVlKFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsXG4gICAgICBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlQ29udmVydGVyLmNvbnZlcnRTdHJpbmdWYWx1ZVRvTmF0aXZlVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGRhdGFUeXBlKSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmZvcm1hdHRlZFZhbHVlLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUuYWxpYXNlZFZhbHVlLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUuaGFzQWxpYXMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgTWFrZUZpbHRlckRhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVmFsdWUpOiBEYXRhVmFsdWUge1xuICAgIC8vIEZpbHRlcnMgYWxyZWFkeSBoYXZlIG5hdGl2ZSB0eXBlIGluIHZhbHVlLCBqdXN0IHVzZSB0aGF0IGZvciBuYXRpdmVWYWx1ZSBhbHNvXG4gICAgcmV0dXJuIG5ldyBEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBpbnRlcm5hbERhdGFWYWx1ZS5mb3JtYXR0ZWRWYWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIE1ha2VUYWJsZURhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVmFsdWUsIGRhdGFUeXBlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlKTogRGF0YVZhbHVlIHtcbiAgICAvLyBEYXRhVGFibGVzIGNvbnRhaW4gYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IGRhdGUgYXMgc3RyaW5nIHwgJyVudWxsJVxuICAgIC8vIGNvbnZlcnRWYWx1ZVRvTmF0aXZlVmFsdWUgY29udmVydHMgZGF0ZXMgYXMgc3RyaW5nIHRvIGRhdGVzLCBhbmQgYW55IHNwZWNpYWwgdG8gbnVsbFxuICAgIC8vIChib29sZWFuLCBudW1iZXJzLCBzdHJpbmdzIGFyZSBwYXNzZWQgdGhyb3VnaClcbiAgICAvLyBCZWNhdXNlIG9mIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIC0gd2UgY2FuIGhhdmUgdW5kZWZpbmVkIHZhbHVlcywgd2hpY2ggYXJlIGRpZmZlcmVudCB0aGFuIGFueSBzcGVjaWFsXG4gICAgcmV0dXJuIG5ldyBEYXRhVmFsdWUoXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlQ29udmVydGVyLmNvbnZlcnRWYWx1ZVRvTmF0aXZlVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGRhdGFUeXBlKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmZvcm1hdHRlZFZhbHVlLFxuICAgICk7XG4gIH1cbn1cbiIsIi8qKlxuICogQSBQcm9taXNlIHdyYXBwZXIgY2xhc3MgYWxsb3dpbmcgZm9yIHJlc29sdmluZy9yZWplY3RpbmcgdGhlIFByb21pc2Ugb3V0c2lkZSB0aGUgY29udGV4dCBvZiBpdHMgY29uc3RydWN0b3IuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIERlZmVycmVkXG4gKiBAdGVtcGxhdGUgVFJlc29sdmUgVGhlIHR5cGUgdXNlZCB0byByZXNvbHZlIHRoZSBwcm9taXNlLlxuICogQHRlbXBsYXRlIFRSZWplY3QgVGhlIHR5cGUgdXNlZCB0byByZWplY3QgdGhlIHByb21pc2UuIERlZmF1bHRzIHRvIGFueS5cbiAqIEBsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNDYzNzQzNlxuICovXG5leHBvcnQgY2xhc3MgRGVmZXJyZWQ8VFJlc29sdmUsIFRSZWplY3QgPSBhbnk+IHtcbiAgcHJpdmF0ZSBfcHJvbWlzZTogUHJvbWlzZTxUUmVzb2x2ZT47XG4gIHByaXZhdGUgX3Jlc29sdmU6IChyZXNwb25zZTogVFJlc29sdmUgfCBQcm9taXNlTGlrZTxUUmVzb2x2ZT4pID0+IHZvaWQ7XG4gIHByaXZhdGUgX3JlamVjdDogKHJlYXNvbj86IFRSZWplY3QpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRGVmZXJyZWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2U8VFJlc29sdmU+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIFByb21pc2UuXG4gICAqXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7UHJvbWlzZTxUUmVzb2x2ZT59XG4gICAqL1xuICBnZXQgcHJvbWlzZSgpOiBQcm9taXNlPFRSZXNvbHZlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHdyYXBwZWQgUHJvbWlzZS5cbiAgICpcbiAgICogQHBhcmFtIHsoVFJlc29sdmUgfCBQcm9taXNlTGlrZTxUUmVzb2x2ZT4pfSByZXNwb25zZSBUaGUgYXJndW1lbnQgdG8gYmUgcmVzb2x2ZWQgYnkgdGhlIFByb21pc2UuXG4gICAqIEByZXR1cm5zIHsqfSAge3ZvaWR9XG4gICAqL1xuICByZXNvbHZlKHJlc3BvbnNlOiBUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcmVzb2x2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Jlc29sdmUocmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSB7VFJlamVjdH0gW3JlYXNvbl0gVGhlIHJlYXNvbiB3aHkgdGhlIFByb21pc2UgcmVqZWN0ZWQuXG4gICAqIEByZXR1cm5zIHsqfSAge3ZvaWR9XG4gICAqL1xuICByZWplY3QocmVhc29uPzogVFJlamVjdCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcmVqZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVqZWN0KHJlYXNvbik7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFVucmVnaXN0ZXJUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSAzMDAwMDtcbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGNvbnZlcnRzIGZyb20gYSBzb3VyY2UgZW51bSB2YWx1ZSB0byBkZXN0aW5hdGlvbiBlbnVtXG4gKiB2YWx1ZSBnaXZlbiBhIG1hcHBpbmcgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24gd2hlbiBjb25zdHJ1Y3RlZC5cbiAqXG4gKiBOb3RlOiBUaGlzIGV4YWN0IHNhbWUgY2xhc3MgaXMgZGVmaW5lZCBpbiBhcGktY29yZS4gIEdpdmVuIGl0cyBzbWFsbFxuICogbmF0dXJlLCBpdCBpcyBub3Qgd29ydGggaGF2aW5nIGluIGEgc2VwYXJhdGUgcHJvamVjdCB0byBzaGFyZSB0aGlzIGJldHdlZW5cbiAqIGFwaS1jb3JlIGFuZCBhcGktc2hhcmVkLiAgSWYgbW9yZSB1dGlsaXR5IGZ1bmN0aW9uYWxpdHkgaXMgYWRkZWQgdGhhdCBpcyB1c2VkIGJ5IGFwaS1jb3JlXG4gKiBhbmQgYXBpLXNoYXJlZCBidXQgaGFzIG5vIG90aGVyIGRlcGVuZGVjaWVzLCBhIHV0aWx0aXR5IHByb2plY3QgbWlnaHQgYmUgbWVyaXRlZCxcbiAqIGFuZCB0aGlzIGNsYXNzIGNvdWxkIGJlIG1vdmVkLlxuICovXG5leHBvcnQgY2xhc3MgRW51bUNvbnZlcnRlcjxUU291cmNlVHlwZSBleHRlbmRzIHN0cmluZywgVERlc3RpbmF0aW9uVHlwZT4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfbWFwcGluZ3M6IHsgW2VudW1WYWw6IHN0cmluZ106IFREZXN0aW5hdGlvblR5cGUgfSwgcHJpdmF0ZSBfZGVmYXVsdFZhbD86IFREZXN0aW5hdGlvblR5cGUpIHt9XG5cbiAgcHVibGljIGNvbnZlcnQoZW51bVZhbDogVFNvdXJjZVR5cGUsIHRocm93SWZNaXNzaW5nOiBTaG91bGRUaHJvdyA9IFNob3VsZFRocm93Llllcyk6IFREZXN0aW5hdGlvblR5cGUge1xuICAgIGlmICh0aGlzLl9tYXBwaW5ncy5oYXNPd25Qcm9wZXJ0eShlbnVtVmFsKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX21hcHBpbmdzW2VudW1WYWwgYXMgc3RyaW5nXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZGVmYXVsdFZhbCAhPT0gdW5kZWZpbmVkICYmIHRocm93SWZNaXNzaW5nICE9PSBTaG91bGRUaHJvdy5ZZXMpIHtcbiAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0VmFsO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgRW51bSBNYXBwaW5nIG5vdCBmb3VuZCBmb3I6ICR7ZW51bVZhbH1gKTtcbiAgfVxufVxuXG5leHBvcnQgZW51bSBTaG91bGRUaHJvdyB7XG4gIFllcyA9ICd5ZXMnLFxuICBObyA9ICdubycsXG59XG4iLCJpbXBvcnQge1xuICBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUsXG4gIEV4cG9ydERhdGFPcHRpb25zLFxuICBFeHBvcnRTY2VuYXJpb3NGb3JQREZBbmRQb3dlclBvaW50LFxuICBFeHBvcnRQREZPcHRpb25zIGFzIEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgUHJpbnRPcmllbnRhdGlvbixcbiAgUHJpbnRQYWdlU2l6ZSxcbiAgUHJpbnRTY2FsaW5nLFxuICBSYW5nZUZpbHRlck9wdGlvbnMsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RJbXBsIH0gZnJvbSAnLi4vSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4vUGFyYW0nO1xuXG5pbnRlcmZhY2UgRW51bUxpa2Uge1xuICB0b1N0cmluZygpOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGNvbnN0cnVjdCBjb21tb24gZXJyb3JzIHRocm91Z2hvdXQgdGhlIGV4dGVybmFsXG4gKiBwcm9qZWN0cyAoYXBpLXNoYXJlZCwgZXh0ZW5zaW9ucy1hcGksIGV0Yy4pLiAgSXQgaGFzIHNvbWUgZHVwbGljYXRpb24gd2l0aFxuICogdGhlIEVycm9ySGVscGVycyBjbGFzcyBpbiBhcGktY29yZSwgYnV0IGlzIHNlcGFyYXRlIGR1ZSB0byB0aGUgbmVlZCB0byB0aHJvd1xuICogYW4gZXh0ZXJuYWwgVGFibGVhdUVycm9yIHZzLiBhbiBJbnRlcm5hbFRhYmxlYXVFcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEVycm9ySGVscGVycyB7XG4gIC8qKlxuICAgKiBUaHJvd3Mgd2l0aCBjb2RlIEludGVybmFsRXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBhcGlOYW1lIG5hbWUgb2YgYXBpIHRoYXQgd2FzIGNhbGxlZC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYXBpTm90SW1wbGVtZW50ZWQoYXBpTmFtZTogc3RyaW5nKTogVGFibGVhdUVycm9yIHtcbiAgICByZXR1cm4gbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAke2FwaU5hbWV9IEFQSSBub3QgeWV0IGltcGxlbWVudGVkLmApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhbiBpbnRlcm5hbCBlcnJvciBpZiBhcmd1bWVudCBpcyBudWxsIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBhcmd1bWVudE5hbWUgbmFtZSBvZiBhcmd1bWVudCB0byB2ZXJpZnlcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5SW50ZXJuYWxWYWx1ZShhcmd1bWVudFZhbHVlOiBhbnksIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3I6ICR7YXJndW1lbnROYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiBhcmd1bWVudCBpcyBudWxsIG9yIHVuZGVmaW5lZC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBhcmd1bWVudE5hbWUgbmFtZSBvZiBhcmd1bWVudCB0byB2ZXJpZnlcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5UGFyYW1ldGVyKGFyZ3VtZW50VmFsdWU6IGFueSwgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoYXJndW1lbnRWYWx1ZSA9PT0gbnVsbCB8fCBhcmd1bWVudFZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCBgJHthcmd1bWVudFZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvciBwYXJhbWV0ZXI6ICR7YXJndW1lbnROYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiBhcmd1bWVudCBpcyBub3QgdGhlIHNwZWNpZmllZCB0eXBlLlxuICAgKiBGb3Igb2JqZWN0cywgaXQganVzdCB0ZXN0cyB0aGF0IGl0IGlzIGFuIG9iamVjdFxuICAgKlxuICAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGV4cGVjdGVkVHlwZSBleHBlY3RlZCByZXN1bHQgb2YgdHlwZW9mXG4gICAqIEBwYXJhbSBhcmd1bWVudE5hbWUgbmFtZSBvZiBhcmd1bWVudCB0byB2ZXJpZnlcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5UGFyYW1ldGVyVHlwZShhcmd1bWVudFZhbHVlOiBhbnksIGV4cGVjdGVkVHlwZTogc3RyaW5nLCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmICh0eXBlb2YgYXJndW1lbnRWYWx1ZSAhPT0gZXhwZWN0ZWRUeXBlKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaGFzIGludmFsaWQgdHlwZSBmb3IgcGFyYW1ldGVyOiAke2FyZ3VtZW50TmFtZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRocm93cyBhbiBJbnZhbGlkUGFyYW1ldGVyIGVycm9yIGlmIGFyZ3VtZW50IGlzIGVtcHR5IHN0cmluZywgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVN0cmluZ1BhcmFtZXRlcihhcmd1bWVudFZhbHVlOiBzdHJpbmcsIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGFyZ3VtZW50VmFsdWUgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgcGFyYW10ZXI6ICR7YXJndW1lbnROYW1lfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBwYXNzZWQgdmFsdWUgaXMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtLlxuICAgKlxuICAgKiBTdHJpbmcgZW51bXMgYXJlIHtzdHJpbmcgOiBzdHJpbmd9IGRpY3Rpb25hcmllcyB3aGljaCBhcmUgbm90IHJldmVyc2UgbWFwcGFibGVcbiAgICogVGhpcyBpcyBhbiB1Z2x5IHdvcmthcm91bmRcbiAgICpcbiAgICogQHBhcmFtIGVudW1WYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGVudW1UeXBlIGVudW0gdG8gdmVyaWZ5IGFnYWluc3RcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgaXNWYWxpZEVudW1WYWx1ZTxFbnVtVHlwZSBleHRlbmRzIEVudW1MaWtlPihlbnVtVmFsdWU6IEVudW1UeXBlLCBlbnVtVHlwZTogYW55KTogYm9vbGVhbiB7XG4gICAgbGV0IGlzVmFsaWQgPSBmYWxzZTtcbiAgICBPYmplY3Qua2V5cyhlbnVtVHlwZSkuZm9yRWFjaCgoZW51bUtleSkgPT4ge1xuICAgICAgaWYgKGVudW1UeXBlW2VudW1LZXldID09PSBlbnVtVmFsdWUudG9TdHJpbmcoKSkge1xuICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiBpc1ZhbGlkO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHBhc3NlZCB2YWx1ZSBpcyBhIHZhbGlkIHZhbHVlIGZvciB0aGF0IGVudW0uXG4gICAqIFRocm93cyBhbiBJbnZhbGlkUGFyYW1ldGVyIGVycm9yIGlmIHRoZSBlbnVtIHZhbHVlIGlzIG5vdCB2YWxpZC5cbiAgICpcbiAgICogU3RyaW5nIGVudW1zIGFyZSB7c3RyaW5nIDogc3RyaW5nfSBkaWN0aW9uYXJpZXMgd2hpY2ggYXJlIG5vdCByZXZlcnNlIG1hcHBhYmxlXG4gICAqIFRoaXMgaXMgYW4gdWdseSB3b3JrYXJvdW5kXG4gICAqXG4gICAqIEBwYXJhbSBlbnVtVmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBlbnVtVHlwZSBlbnVtIHRvIHZlcmlmeSBhZ2FpbnN0XG4gICAqIEBwYXJhbSBlbnVtTmFtZSBlbnVtIG5hbWUgZm9yIGNsZWFyIGVycm9yIG1lc3NhZ2VcbiAgICovXG4gIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5RW51bVZhbHVlPEVudW1UeXBlIGV4dGVuZHMgRW51bUxpa2U+KGVudW1WYWx1ZTogRW51bVR5cGUsIGVudW1UeXBlOiBhbnksIGVudW1OYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAoIUVycm9ySGVscGVycy5pc1ZhbGlkRW51bVZhbHVlKGVudW1WYWx1ZSwgZW51bVR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7ZW51bVZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvciBlbnVtOiAke2VudW1OYW1lfS5gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgcGFzc2VkIHZhbHVlIGlzIGJldHdlZW4gW21pbiwgbWF4KSAuLi4gbWluIDw9IHZhbHVlIDwgbWF4XG4gICAqIFRocm93cyBhbiBJbnZhbGlkUGFyYW1ldGVyIGVycm9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgdmFsaWQuXG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIG1pbiAgIHZhbHVlIG11c3QgYmUgPj0gbWluXG4gICAqIEBwYXJhbSBtYXggICB2YWx1ZSBtdXN0IGJlIDwgbWF4XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVJhbmdlKHZhbHVlOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcikge1xuICAgIGxldCBpc1ZhbGlkID0gbWluIDw9IHZhbHVlICYmIHZhbHVlIDwgbWF4O1xuXG4gICAgaWYgKCFpc1ZhbGlkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7dmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yIHJhbmdlOiBbJHttaW59Li4ke21heH0pYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBwYXJhbXMgbWluIGFuZCBtYXggZm9yIGFwcGx5aW5nIHJhbmdlIGZpbHRlci5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHJhbmdlIGlzIGludmFsaWQuXG4gICAqXG4gICAqIEBwYXJhbSBtaW4gcmFuZ2UgbWluXG4gICAqIEBwYXJhbSBtYXggcmFuZ2UgbWF4XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVJhbmdlUGFyYW1UeXBlKG1pbjogUmFuZ2VGaWx0ZXJPcHRpb25zWydtaW4nXSwgbWF4OiBSYW5nZUZpbHRlck9wdGlvbnNbJ21heCddKTogdm9pZCB7XG4gICAgY29uc3QgaXNNaW5EZWZpbmVkID0gbWluICE9PSB1bmRlZmluZWQ7XG4gICAgY29uc3QgaXNNYXhEZWZpbmVkID0gbWF4ICE9PSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoIWlzTWluRGVmaW5lZCAmJiAhaXNNYXhEZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgYXQgbGVhc3Qgb25lIG9mIG1pbiBvciBtYXggaXMgcmVxdWlyZWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKGlzTWluRGVmaW5lZCAmJiAhUGFyYW0uaXNUeXBlTnVtYmVyKG1pbikgJiYgIVBhcmFtLmlzVHlwZURhdGUobWluKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAnVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBvbmx5IERhdGUgYW5kIG51bWJlciBhcmUgYWxsb3dlZCBmb3IgcGFyYW1ldGVyIG1pbi4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXhEZWZpbmVkICYmICFQYXJhbS5pc1R5cGVOdW1iZXIobWF4KSAmJiAhUGFyYW0uaXNUeXBlRGF0ZShtYXgpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIG9ubHkgRGF0ZSBhbmQgbnVtYmVyIGFyZSBhbGxvd2VkIGZvciBwYXJhbWV0ZXIgbWF4LicsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpc01pbkRlZmluZWQgJiYgaXNNYXhEZWZpbmVkICYmIHR5cGVvZiBtaW4gIT09IHR5cGVvZiBtYXgpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgcGFyYW1ldGVycyBtaW4gYW5kIG1heCBzaG91bGQgYmUgb2YgdGhlIHNhbWUgdHlwZS4nLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgem9uZUlkIGlzIHByZXNlbnQgaW4gdGhlIGN1cnJlbnQgZGFzaGJvYXJkLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgZWl0aGVyIGNvbmRpdGlvbiBpcyBmYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIGRhc2hib2FyZFpvbmVNYXAgQSBtYXAgb2Ygem9uZUlkJ3MgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGFzaGJvYXJkIG9iamVjdC5cbiAgICogQHBhcmFtIHpvbmVJRCBab25lSWQgdG8gYmUgdmFsaWRhdGVkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVpvbmVJc1ZhbGlkKGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+LCB6b25lSUQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChkYXNoYm9hcmRab25lTWFwLmhhcyh6b25lSUQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgIFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgIGBVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIERhc2hib2FyZCBPYmplY3QgSWQ6ICR7em9uZUlEfSBpcyBub3QgcHJlc2VudCBpbiBkYXNoYm9hcmQuYCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHpvbmUgaXMgcHJlc2VudCBhbmQgZmxvYXRpbmcgaW4gdGhlIGN1cnJlbnQgZGFzaGJvYXJkLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgZWl0aGVyIGNvbmRpdGlvbiBpcyBmYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIGRhc2hib2FyZFpvbmVNYXAgQSBtYXAgb2Ygem9uZUlkJ3MgdG8gdGhlIGNvcnJlc3BvbmRpbmcgZGFzaGJvYXJkIG9iamVjdC5cbiAgICogQHBhcmFtIHpvbmVJRCBab25lSWQgdG8gYmUgdmFsaWRhdGVkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVpvbmVJc1ZhbGlkQW5kRmxvYXRpbmcoZGFzaGJvYXJkWm9uZU1hcDogTWFwPG51bWJlciwgRGFzaGJvYXJkT2JqZWN0SW1wbD4sIHpvbmVJRDogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKGRhc2hib2FyZFpvbmVNYXAuaGFzKHpvbmVJRCkgJiYgZGFzaGJvYXJkWm9uZU1hcC5nZXQoem9uZUlEKSEuaXNGbG9hdGluZykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICBgVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBEYXNoYm9hcmQgT2JqZWN0IElkOiAke3pvbmVJRH0gaXMgbm90IHByZXNlbnQgb3IgaXMgYSBmaXhlZCB6b25lIGluIHRoZSBkYXNoYm9hcmQuYCxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgd2lkdGggYW5kIGhlaWdodCBhcmUgPiAwIGZvciBlYWNoIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSBvYmplY3QuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiBlaXRoZXIgY29uZGl0aW9uIGlzIGZhbHNlLlxuICAgKlxuICAgKiBAcGFyYW0gZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSBvYmplY3QgZm9yIHdoaWNoIHdpZHRoIGFuZCBoZWlnaHQgd2lsbCBiZSB2YWxpZGF0ZWRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5V2lkdGhBbmRIZWlnaHRPZkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZShcbiAgICBkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGU6IERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSxcbiAgKTogdm9pZCB7XG4gICAgaWYgKGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZS53aWR0aCA8IDAgfHwgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlLmhlaWdodCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgYFVuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSBmb3IgZGFzaGJvYXJkIG9iamVjdCBJRCAke2Rhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZS5kYXNoYm9hcmRPYmplY3RJRH06YCArXG4gICAgICAgICAgYCBuZWdhdGl2ZSB3aWR0aHMgYW5kIGhlaWdodHMgYXJlIG5vdCBhbGxvd2VkLmAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBpcyB0aGUgZ2l2ZW4gc2hlZXQgbmFtZSBpcyBpbiB0aGUgbGlzdCBvZiBzaGVldHMgbmFtZXMgYWxsb3dlZCBmb3IgZXhwb3J0aW5nLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgdGhlIGNvbmRpdGlvbiBhYm92ZSBpcyBmYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIGV4cG9ydGFibGVTaGVldE5hbWVzIEEgbGlzdCBvZiBzaGVldCBuYW1lcyBhbGxvd2VkIGZvciBleHBvcnRpbmdcbiAgICogQHBhcmFtIHNoZWV0TmFtZSB0aGUgbmFtZSBvZiB0aGUgc2hlZXQgc2VsZWN0ZWQgZm9yIGV4cG9ydFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlTaGVldE5hbWUoZXhwb3J0YWJsZVNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sIHNoZWV0TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCFleHBvcnRhYmxlU2hlZXROYW1lcy5pbmNsdWRlcyhzaGVldE5hbWUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRTZWxlY3Rpb25TaGVldCxcbiAgICAgICAgJ3NoZWV0TmFtZSBwYXJhbWV0ZXIgbXVzdCBiZWxvbmcgdG8gYSB3b3Jrc2hlZXQgd2l0aGluIHRoZSBjdXJyZW50IHZpZXcnLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIEV4cG9ydERhdGFPcHRpb25zIG9iamVjdFxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgb2YgRXhwb3J0RGF0YU9wdGlvbnMgdHlwZS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgVGhlIEV4cG9ydERhdGFPcHRpb25zIG9iamVjdCB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgb3V0cHV0IENTViBmaWxlIGZvciBleHBvcnREYXRhQXN5bmMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUV4cG9ydERhdGFPcHRpb25zKG9wdGlvbnM6IEV4cG9ydERhdGFPcHRpb25zKTogdm9pZCB7XG4gICAgaWYgKFxuICAgICAgKCFQYXJhbS5pc051bGxPclVuZGVmaW5lZChvcHRpb25zLmlnbm9yZUFsaWFzZXMpICYmICFQYXJhbS5pc1R5cGVCb29sKG9wdGlvbnMuaWdub3JlQWxpYXNlcykpIHx8XG4gICAgICAoIVBhcmFtLmlzTnVsbE9yVW5kZWZpbmVkKG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQpICYmICFBcnJheS5pc0FycmF5KG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQpKVxuICAgIClcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnb3B0aW9ucyBwYXJhbWF0ZXIgbXVzdCBiZSBvZiB0eXBlIEV4cG9ydERhdGFPcHRpb25zJyk7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgaWYgdGhlIHNoZWV0IG5hbWVzIGFyZSBpbmNsdWRlZCBpbiBhbnkgb2YgdGhlIGV4cG9ydCBzY2VuYXJpb3MuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBhbiBhcnJheS5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkU2VsZWN0aW9uU2hlZXQgaWYgdGhlcmUgYXJlIGFycmF5IGVudHJpZXMgdGhhdCBkb250IGV4aXN0IG9yIGlmIHRoZXJlIGlzIG1peGluZyBiZXR3ZWVuIHNoZWV0cyBmcm9tIHRoZSBkYXNoYm9hcmQgYW5kIHNoZWV0IGZyb20gdGhlIHdvcmtib29rLlxuICAgKlxuICAgKiBAcGFyYW0gc2hlZXROYW1lcyBMaXN0IG9mIHNoZWV0IG5hbWVzIHNlbGVjdGVkIGZvciBleHBvcnRpbmcuXG4gICAqIEBwYXJhbSBleHBvcnRTY2VuYXJpb3MgYW4gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGN1cnJlbnQgc2hlZXQgbmFtZSwgZXhwb3J0YWJsZSBzaGVldHMgZnJvbSB0aGUgZGFzaGJvYXJkLCBhbmQgZXhwb3J0YWJsZSBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVNoZWV0TmFtZXNGb3JQREZBbmRQUFQoc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPiwgZXhwb3J0U2NlbmFyaW9zOiBFeHBvcnRTY2VuYXJpb3NGb3JQREZBbmRQb3dlclBvaW50KTogdm9pZCB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHNoZWV0TmFtZXMpKSB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ3NoZWV0TmFtZXMgcGFyYW1ldGVyIG11c3QgYmUgYW4gYXJyYXknKTtcbiAgICBpZiAoc2hlZXROYW1lcy5sZW5ndGggPT09IDApIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnc2hlZXROYW1lcyBzaG91bGQgbm90IGJlIGVtcHR5Jyk7XG5cbiAgICBjb25zdCBpc0luY2x1ZGVkSW5EYXNoYm9hcmQgPSBzaGVldE5hbWVzLmV2ZXJ5KChzaGVldE5hbWU6IHN0cmluZykgPT5cbiAgICAgIGV4cG9ydFNjZW5hcmlvcy5leHBvcnRhYmxlU2hlZXROYW1lc0Zyb21EYXNoYm9hcmQuaW5jbHVkZXMoc2hlZXROYW1lKSxcbiAgICApO1xuICAgIGlmIChpc0luY2x1ZGVkSW5EYXNoYm9hcmQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaXNJbmNsdWRlZEluV29ya2Jvb2sgPSBzaGVldE5hbWVzLmV2ZXJ5KChzaGVldE5hbWU6IHN0cmluZykgPT5cbiAgICAgIGV4cG9ydFNjZW5hcmlvcy5leHBvcnRhYmxlU2hlZXROYW1lc0Zyb21Xb3JrYm9vay5pbmNsdWRlcyhzaGVldE5hbWUpLFxuICAgICk7XG4gICAgaWYgKGlzSW5jbHVkZWRJbldvcmtib29rKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzQ3VycmVudFNoZWV0ID0gc2hlZXROYW1lcy5sZW5ndGggPT09IDEgJiYgc2hlZXROYW1lc1swXSA9PT0gZXhwb3J0U2NlbmFyaW9zLmN1cnJlbnRTaGVldE5hbWU7XG4gICAgaWYgKGlzQ3VycmVudFNoZWV0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gRXhwb3J0IHJlcXVpcmVtZW50OiBhbGwgc2hlZXQgbmFtZXMgbXVzdCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdCBvZiBleHBvcnRhYmxlIHNoZWV0cyBpbiB0aGUgZGFzaGJvYXJkIG9yXG4gICAgLy8gYWxsIHNoZWV0IG5hbWVzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3Qgb2YgZXhwb3J0YWJsZSBzaGVldHMgaW4gdGhlIHdvcmtib29rLCBvciB0aGUgc2hlZXQgbmFtZSBpcyB0aGUgY3VycmVudCBzaGVldFxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRTZWxlY3Rpb25TaGVldCxcbiAgICAgICdzaGVldE5hbWVzIHBhcmFtZXRlciBtdXN0IGhhdmUgYWxsIGl0cyBlbnRyaWVzIGJlIGV4cG9ydGFibGUgc2hlZXQgbmFtZXMgZnJvbSB0aGUgZGFzaGJvYXJkIG9yIGFsbCBpdHMgZW50cmllcyBiZSBleHBvcnRhYmxlIHNoZWV0IG5hbWVzIGZyb20gdGhlIHdvcmtib29rJyxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBleHRlcm5hbCBFeHBvcnRQREZPcHRpb25zIG9iamVjdCdzIHByb3BlcnRpZXMuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBvZiBleHRlcm5hbCBFeHBvcnRQREZPcHRpb25zIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBleHRlcm5hbCB1c2VyLWZhY2luZyBFeHBvcnRQREZPcHRpb25zIG9iamVjdCB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgb3V0cHV0IFBERiBmaWxlIGZvciBleHBvcnRQREZBc3luYy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5RXhwb3J0UERGT3B0aW9ucyhvcHRpb25zOiBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMpIHtcbiAgICB0cnkge1xuICAgICAgdGhpcy52ZXJpZnlFbnVtVmFsdWU8UHJpbnRPcmllbnRhdGlvbj4ob3B0aW9ucy5vcmllbnRhdGlvbiwgUHJpbnRPcmllbnRhdGlvbiwgJ1ByaW50T3JpZW50YXRpb24nKTtcbiAgICAgIHRoaXMudmVyaWZ5RW51bVZhbHVlPFByaW50UGFnZVNpemU+KG9wdGlvbnMucGFnZVNpemUsIFByaW50UGFnZVNpemUsICdQcmludFBhZ2VTaXplJyk7XG4gICAgICB0aGlzLnZlcmlmeUVudW1WYWx1ZTxQcmludFNjYWxpbmc+KG9wdGlvbnMuc2NhbGluZywgUHJpbnRTY2FsaW5nLCAnUHJpbnRTY2FsaW5nJyk7XG4gICAgfSBjYXRjaCB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ29wdGlvbnMgcGFyYW1ldGVyIG11c3QgYmUgb2YgdHlwZSBFeHBvcnRQREZPcHRpb25zJyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQge1xuICBFeHBvcnRMYXlvdXRPcHRpb25zLFxuICBFeHBvcnRQREZPcHRpb25zIGFzIEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgRml0UGFnZXMsXG4gIFBhZ2VPcmllbnRhdGlvbixcbiAgUGFnZVNjYWxpbmdPcHRpb24sXG4gIFBhZ2VTaXplT3B0aW9uLFxuICBTY2FsZU1vZGUsXG4gIFNjYWxpbmdTZWxlY3Rpb24sXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBFeHBvcnREYXRhT3B0aW9ucyxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIFByaW50T3JpZW50YXRpb24sXG4gIFByaW50UGFnZVNpemUsXG4gIFByaW50U2NhbGluZyxcbiAgU2hhcmVkRXJyb3JDb2Rlcyxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZHMgZm9yIEV4cG9ydCBBUElzLlxuICpcbiAqIEBjbGFzcyBFeHBvcnRIZWxwZXJzXG4gKi9cbmV4cG9ydCBjbGFzcyBFeHBvcnRIZWxwZXJzIHtcbiAgcHVibGljIHN0YXRpYyBEZWZhdWx0RGF0YU9wdGlvbnM6IEV4cG9ydERhdGFPcHRpb25zID0ge1xuICAgIGlnbm9yZUFsaWFzZXM6IGZhbHNlLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBbXSxcbiAgfTtcblxuICBwdWJsaWMgc3RhdGljIERlZmF1bHRQREZPcHRpb25zOiBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMgPSB7XG4gICAgc2NhbGluZzogUHJpbnRTY2FsaW5nLkF1dG9tYXRpYyxcbiAgICBwYWdlU2l6ZTogUHJpbnRQYWdlU2l6ZS5MZXR0ZXIsXG4gICAgb3JpZW50YXRpb246IFByaW50T3JpZW50YXRpb24uUG9ydHJhaXQsXG4gIH07XG5cbiAgcHJpdmF0ZSBzdGF0aWMgRGVmYXVsdExheW91dE9wdGlvbnM6IEV4cG9ydExheW91dE9wdGlvbnMgPSB7XG4gICAgaW1hZ2VIZWlnaHQ6IDAsXG4gICAgaW1hZ2VXaWR0aDogMCxcbiAgICBwYWdlRml0SG9yaXpvbnRhbDogMSxcbiAgICBwYWdlRml0VmVydGljYWw6IDEsXG4gICAgcGFnZU9yaWVudGF0aW9uT3B0aW9uOiBQYWdlT3JpZW50YXRpb24uUG9ydHJhaXQsXG4gICAgcGFnZVNjYWxlTW9kZTogU2NhbGVNb2RlLlNjYWxlQXV0byxcbiAgICBwYWdlU2NhbGVQZXJjZW50OiAxMDAsXG4gICAgcGFnZVNpemVPcHRpb246IFBhZ2VTaXplT3B0aW9uLkxldHRlcixcbiAgfTtcblxuICAvKipcbiAgICogTW9kaWZpZXMgdGhlIGludGVybmFsIEV4cG9ydFBERk9wdGlvbnMnIHByb3BlcnRpZXMgYmFzZWQgb24gdGhlIGdpdmVuIFBERiBleHBvcnQgY29uZmlndXJhdGlvbi5cbiAgICogVGhpcyBtZXRob2Qgd2lsbCBjb25zdHJ1Y3QgdGhlIGludGVybmFsIEV4cG9ydFBERk9wdGlvbnMgaWRlbnRpY2FsbHkgdG8gaG93IHRoZSAnRXhwb3J0IFBERicgZGlhbG9nIGNvbnN0cnVjdHMgdGhlIEV4cG9ydFBkZk9wdGlvbnNQcmVzTW9kZWwuXG4gICAqIFNlZSB0aGUgaGFuZGxlRXhwb3J0Q2xpY2sgbWV0aG9kIGluIEBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBkZi1vcHRpb25zLWRpYWxvZyBmb3IgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zIFRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIHByZXMgbW9kZWwgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBQREYgZmlsZS5cbiAgICogQHBhcmFtIGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucyBUaGUgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyB1c2VyLWZhY2luZyBvYmplY3QgcGFzc2VkIHRvIGV4cG9ydFBERkFzeW5jLlxuICAgKiBAcGFyYW0gc2hlZXROYW1lcyBUaGUgbGlzdCBvZiBzaGVldHMgc2VsZWN0ZWQgZm9yIGV4cG9ydC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zKFxuICAgIGludGVybmFsRXhwb3J0UGRmT3B0aW9uczogSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICAgIGV4dGVybmFsRXhwb3J0UGRmT3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICAgIHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sXG4gICk6IHZvaWQge1xuICAgIGludGVybmFsRXhwb3J0UGRmT3B0aW9ucy5jdXJyZW50U2hlZXQgPSBzaGVldE5hbWVzWzBdO1xuICAgIHRoaXMudXBkYXRlRXhwb3J0TGF5b3V0T3B0aW9ucyhpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMsIGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucyk7XG4gICAgdGhpcy51cGRhdGVTaGVldE9wdGlvbnMoaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zLCBzaGVldE5hbWVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIGZvciB1cGRhdGVJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMuXG4gICAqIE1vZGlmaWVzIHRoZSBleHBvcnRMYXlvdXRPcHRpb25zIHByb3BlcnR5IG9mIHRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIGJhc2VkIG9uIHRoZSBleHRlcm5hbCBFeHBvcnRQREZPcHRpb25zLlxuICAgKiBTZWUgdGhlIGdldEV4cG9ydExheW91dE9wdGlvbnMgbWV0aG9kIGluIEBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBkZi1vcHRpb25zLWRpYWxvZyBmb3IgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zIFRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIHByZXMgbW9kZWwgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBQREYgZmlsZS5cbiAgICogQHBhcmFtIGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucyBUaGUgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyB1c2VyLWZhY2luZyBvYmplY3QgcGFzc2VkIHRvIGV4cG9ydFBERkFzeW5jLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB1cGRhdGVFeHBvcnRMYXlvdXRPcHRpb25zKFxuICAgIGludGVybmFsRXhwb3J0UGRmT3B0aW9uczogSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICAgIGV4dGVybmFsRXhwb3J0UGRmT3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICApOiB2b2lkIHtcbiAgICBjb25zdCBleHBvcnRMYXlvdXRPcHRpb25zID0gaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zLmV4cG9ydExheW91dE9wdGlvbnM7XG5cbiAgICAvLyBzZXR0aW5nIHRoZSBpbWFnZSBoZWlnaHQgYW5kIHdpZHRoIHByb3BlcnRpZXMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXNcbiAgICBleHBvcnRMYXlvdXRPcHRpb25zLmltYWdlSGVpZ2h0ID0gdGhpcy5EZWZhdWx0TGF5b3V0T3B0aW9ucy5pbWFnZUhlaWdodDtcbiAgICBleHBvcnRMYXlvdXRPcHRpb25zLmltYWdlV2lkdGggPSB0aGlzLkRlZmF1bHRMYXlvdXRPcHRpb25zLmltYWdlV2lkdGg7XG5cbiAgICAvLyAgc2V0dGluZyB0aGUgb3JpZW50YXRpb24gdmFsdWUgZm9yIHRoZSBleHBvcnRMYXlvdXRPcHRpb25zXG4gICAgc3dpdGNoIChleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMub3JpZW50YXRpb24pIHtcbiAgICAgIGNhc2UgUHJpbnRPcmllbnRhdGlvbi5MYW5kc2NhcGU6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZU9yaWVudGF0aW9uT3B0aW9uID0gUGFnZU9yaWVudGF0aW9uLkxhbmRzY2FwZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50T3JpZW50YXRpb24uUG9ydHJhaXQ6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZU9yaWVudGF0aW9uT3B0aW9uID0gUGFnZU9yaWVudGF0aW9uLlBvcnRyYWl0O1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnaW52YWxpZCBvcmllbnRhdGlvbiBmb3IgRXhwb3J0UERGT3B0aW9uJyk7XG4gICAgfVxuXG4gICAgLy8gc2V0dGluZyB0aGUgcGFnZSBzaXplIHZhbHVlIGZvciB0aGUgZXhwb3J0TGF5b3V0T3B0aW9uc1xuICAgIHN3aXRjaCAoZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zLnBhZ2VTaXplKSB7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuQTM6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5BMztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuQTQ6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5BNDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuQTU6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5BNTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuQjQ6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5CNDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuQjU6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5CNTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuRXhlY3V0aXZlOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uRXhlY3V0aXZlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5Gb2xpbzpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkZvbGlvO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5MZWRnZXI6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5MZWRnZXI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkxlZ2FsOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uTGVnYWw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkxldHRlcjpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkxldHRlcjtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuTm90ZTpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLk5vdGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLlF1YXJ0bzpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLlF1YXJ0bztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuU3RhdGVtZW50OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uU3RhdGVtZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5UYWJsb2lkOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uVGFibG9pZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuVW5zcGVjaWZpZWQ6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5VbnNwZWNpZmllZDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgcGFnZVNpemUgZm9yIEV4cG9ydFBERk9wdGlvbicpO1xuICAgIH1cblxuICAgIC8vIHNldHRpbmcgdGhlIHNjYWxpbmcgdmFsdWVzIGZvciB0aGUgZXhwb3J0TGF5b3V0T3B0aW9uc1xuICAgIHN3aXRjaCAoZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zLnNjYWxpbmcpIHtcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLkF0TW9zdDFQYWdlSGlnaDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBGaXRQYWdlcy5GaXRPbmVIaWdoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5BdE1vc3QxUGFnZVdpZGU6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgRml0UGFnZXMuRml0T25lV2lkZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuQXRNb3N0MlBhZ2VzSGlnaDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBGaXRQYWdlcy5GaXRUd29IaWdoKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5BdE1vc3QyUGFnZXNXaWRlOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIEZpdFBhZ2VzLkZpdFR3b1dpZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLkF1dG9tYXRpYzpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdEF1dG8pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmMxMDA6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3QxMDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmMyMDA6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3QyMDApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmMyNTpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDI1KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjNDAwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0NDAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjNTA6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3Q1MCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzYwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0NjApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM3NTpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDc1KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjODA6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3Q4MCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzkwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0OTApO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnaW52YWxpZCBzY2FsaW5nIGZvciBFeHBvcnRQREZPcHRpb24nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCBmb3IgdXBkYXRlSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zLlxuICAgKiBNb2RpZmllcyB0aGUgc2hlZXRPcHRpb25zIHByb3BlcnR5IG9mIHRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIGJhc2VkIG9uIHRoZSBzaGVldHMgc2VsZWN0ZWQgZm9yIGV4cG9ydC5cbiAgICogU2VlIHRoZSBoYW5kbGVFeHBvcnRDbGljayBtZXRob2QgaW4gQGJyb3dzZXItY2xpZW50cy9leHBvcnQtcGRmLW9wdGlvbnMtZGlhbG9nIGZvciByZWZlcmVuY2UuXG4gICAqXG4gICAqIEBwYXJhbSBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMgVGhlIGludGVybmFsIEV4cG9ydFBERk9wdGlvbnMgcHJlcyBtb2RlbCB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgb3V0cHV0IFBERiBmaWxlLlxuICAgKiBAcGFyYW0gc2hlZXROYW1lcyBUaGUgbGlzdCBvZiBzaGVldHMgc2VsZWN0ZWQgZm9yIGV4cG9ydC5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlU2hlZXRPcHRpb25zKGludGVybmFsRXhwb3J0UGRmT3B0aW9uczogSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zLCBzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+KTogdm9pZCB7XG4gICAgY29uc3QgeyBleHBvcnRMYXlvdXRPcHRpb25zLCBzaGVldE9wdGlvbnMgfSA9IGludGVybmFsRXhwb3J0UGRmT3B0aW9ucztcbiAgICAvLyB1cGRhdGluZyB0aGUgZXhwb3J0IGxheW91dHMgb3B0aW9ucyBmb3IgZWFjaCBzaGVldCBhbmQgc2VsZWN0aW5nIHNoZWV0IGZvciBleHBvcnQgaWYgaW5jbHVkZWQgaW4gbGlzdFxuICAgIGZvciAoY29uc3Qgc2hlZXRPcHRpb24gb2Ygc2hlZXRPcHRpb25zKSB7XG4gICAgICBzaGVldE9wdGlvbi5leHBvcnRMYXlvdXRPcHRpb25zID0gZXhwb3J0TGF5b3V0T3B0aW9ucztcbiAgICAgIHNoZWV0T3B0aW9uLmlzU2VsZWN0ZWQgPSBzaGVldE5hbWVzLmluY2x1ZGVzKHNoZWV0T3B0aW9uLnNoZWV0KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCBmb3IgdXBkYXRlRXhwb3J0TGF5b3V0T3B0b25zLlxuICAgKiBUaGlzIG1ldGhvZCBpcyBhIHNwb29mIG9mIHRoZSBnZXRGaXRBbmRTY2FsZVZhbHVlcyBtZXRob2QgdXNlZCBpbiBAYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wZGYtb3B0aW9ucyB0byBzZXQgdGhlIGV4cG9ydExheW91dE9wdGlvbnMnIHNjYWxpbmcgcHJvcGVydGllcy5cbiAgICogSW4gdGhlIGZ1dHVyZSwgdGhpcyBmaWxlIHNob3VsZCBiZSByZWZhY3RvcmVkIHRvIGltcG9ydCB0aGUgbWV0aG9kIGRpcmVjdGx5IGZyb20gQGJyb3dzZXItY2xpZW50cy9leHBvcnQtcGRmLW9wdGlvbnMuXG4gICAqXG4gICAqIEBwYXJhbSBzY2FsaW5nU2VsZWN0aW9uIHN0cmluZyB1c2VkIGZvciBzZXR0aW5nIHRoZSBleHBvcnRMYXlvdXRPcHRpb25zIGJhc2VkIG9uIHRoZSBQcmludFNjYWxpbmcgcHJvcGVydHkgZnJvbSB0aGUgRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLlxuICAgKiBAcGFyYW0gZXhwb3J0TGF5b3V0T3B0aW9ucyB0aGUgRXhwb3J0TGF5b3V0T3B0aW9ucyB1c2VkIGJ5IHRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIHByZXMgbW9kZWwuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnM6IEV4cG9ydExheW91dE9wdGlvbnMsIHNjYWxpbmdTZWxlY3Rpb246IFNjYWxpbmdTZWxlY3Rpb24pOiB2b2lkIHtcbiAgICBsZXQgeyBwYWdlRml0SG9yaXpvbnRhbCwgcGFnZUZpdFZlcnRpY2FsLCBwYWdlU2NhbGVNb2RlLCBwYWdlU2NhbGVQZXJjZW50IH0gPSB0aGlzLkRlZmF1bHRMYXlvdXRPcHRpb25zO1xuXG4gICAgY29uc3QgZml0TWF0Y2ggPSB0aGlzLmZpdFJlZ2V4LmV4ZWMoc2NhbGluZ1NlbGVjdGlvbik7XG4gICAgY29uc3QgcGVyY2VudE1hdGNoID0gdGhpcy5wY3RSZWdleC5leGVjKHNjYWxpbmdTZWxlY3Rpb24pO1xuXG4gICAgaWYgKGZpdE1hdGNoKSB7XG4gICAgICBbcGFnZUZpdEhvcml6b250YWwsIHBhZ2VGaXRWZXJ0aWNhbF0gPSBmaXRNYXRjaC5zbGljZSgxKS5tYXAoKHZhbHVlKSA9PiBOdW1iZXIodmFsdWUpKTtcbiAgICAgIHBhZ2VTY2FsZU1vZGUgPSBTY2FsZU1vZGUuU2NhbGVGaXRQYWdlcztcbiAgICB9IGVsc2UgaWYgKHBlcmNlbnRNYXRjaCkge1xuICAgICAgW3BhZ2VTY2FsZVBlcmNlbnRdID0gcGVyY2VudE1hdGNoLnNsaWNlKDEpLm1hcCgodmFsdWUpID0+IE51bWJlcih2YWx1ZSkpO1xuICAgICAgcGFnZVNjYWxlTW9kZSA9IFNjYWxlTW9kZS5TY2FsZVBlcmNlbnRhZ2U7XG4gICAgfVxuXG4gICAgLy8gZ2V0Rml0QW5kU2NhbGVWYWx1ZXMgcmV0dXJucyB0aGUgcHJvcGVydGllcyBiZWxvdywgYnV0IGluc3RlYWQgdGhpcyBtZXRob2Qgd2lsbCBzZXQgdGhlbS5cbiAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VGaXRIb3Jpem9udGFsID0gcGFnZUZpdEhvcml6b250YWw7XG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlRml0VmVydGljYWwgPSBwYWdlRml0VmVydGljYWw7XG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2NhbGVNb2RlID0gcGFnZVNjYWxlTW9kZTtcbiAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTY2FsZVBlcmNlbnQgPSBwYWdlU2NhbGVQZXJjZW50O1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZml0UmVnZXggPSBuZXcgUmVnRXhwKCdmaXQoWzAtOV0rKXgoWzAtOV0rKScpO1xuICBwcml2YXRlIHN0YXRpYyBwY3RSZWdleCA9IG5ldyBSZWdFeHAoJ3BjdChbMC05XSspJyk7XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuL0Vycm9ySGVscGVycyc7XG5cbmV4cG9ydCBjbGFzcyBQYXJhbSB7XG4gIC8qKlxuICAgKiBzZXJpYWxpemVzIHRoZSBkYXRlIGludG8gdGhlIGZvcm1hdCB0aGF0IHRoZSBzZXJ2ZXIgZXhwZWN0cy5cbiAgICogQHBhcmFtIGRhdGUgdGhlIGRhdGUgdG8gc2VyaWFsaXplXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZURhdGVGb3JQbGF0Zm9ybShkYXRlOiBEYXRlKTogc3RyaW5nIHtcbiAgICBjb25zdCB5ZWFyOiBudW1iZXIgPSBkYXRlLmdldFVUQ0Z1bGxZZWFyKCk7XG4gICAgY29uc3QgbW9udGg6IG51bWJlciA9IGRhdGUuZ2V0VVRDTW9udGgoKSArIDE7XG4gICAgY29uc3QgZGF5OiBudW1iZXIgPSBkYXRlLmdldFVUQ0RhdGUoKTtcbiAgICBjb25zdCBoaDogbnVtYmVyID0gZGF0ZS5nZXRVVENIb3VycygpO1xuICAgIGNvbnN0IG1tOiBudW1iZXIgPSBkYXRlLmdldFVUQ01pbnV0ZXMoKTtcbiAgICBjb25zdCBzZWM6IG51bWJlciA9IGRhdGUuZ2V0VVRDU2Vjb25kcygpO1xuICAgIHJldHVybiBgJHt5ZWFyfS0ke21vbnRofS0ke2RheX0gJHtoaH06JHttbX06JHtzZWN9YDtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplQm9vbGVhbkZvclBsYXRmb3JtKGJvb2w6IGJvb2xlYW4pOiBzdHJpbmcge1xuICAgIHJldHVybiBib29sID8gJ3RydWUnIDogJ2ZhbHNlJztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgc2VyaWFsaXplTnVtYmVyRm9yUGxhdGZvcm0obnVtOiBudW1iZXIpOiBzdHJpbmcge1xuICAgIHJldHVybiBudW0udG9TdHJpbmcoMTApO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBpbnB1dCBpcyBhIG51bWJlclxuICAgKi9cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVHlwZU51bWJlcihpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ251bWJlcicgfHwgaW5wdXQgaW5zdGFuY2VvZiBOdW1iZXI7XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhlIGlucHV0IGlzIGEgRGF0ZVxuICAgKi9cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVHlwZURhdGUoaW5wdXQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpbnB1dCBpbnN0YW5jZW9mIERhdGU7XG4gIH1cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgaXNUeXBlU3RyaW5nKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnc3RyaW5nJyB8fCBpbnB1dCBpbnN0YW5jZW9mIFN0cmluZztcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVCb29sKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdHlwZW9mIGlucHV0ID09PSAnYm9vbGVhbicgfHwgaW5wdXQgaW5zdGFuY2VvZiBCb29sZWFuO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZXMgaWYgdGhlIGlucHV0IGlzIG51bGwgb3IgdW5kZWZpbmVkXG4gICAqL1xuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgaXNOdWxsT3JVbmRlZmluZWQoaW5wdXQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpbnB1dCA9PT0gbnVsbCB8fCBpbnB1dCA9PT0gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICAgIGlmIChQYXJhbS5pc1R5cGVOdW1iZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4gUGFyYW0uc2VyaWFsaXplTnVtYmVyRm9yUGxhdGZvcm0odmFsdWUgYXMgbnVtYmVyKTtcbiAgICB9IGVsc2UgaWYgKFBhcmFtLmlzVHlwZURhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKHZhbHVlIGFzIERhdGUpO1xuICAgIH0gZWxzZSBpZiAoUGFyYW0uaXNUeXBlQm9vbCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBQYXJhbS5zZXJpYWxpemVCb29sZWFuRm9yUGxhdGZvcm0odmFsdWUgYXMgYm9vbGVhbik7XG4gICAgfSBlbHNlIGlmIChQYXJhbS5pc1R5cGVTdHJpbmcodmFsdWUpKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgVW5leHBlY3RlZCBpbnZhbGlkIHZhbHVlIGZvcjogJHt2YWx1ZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgdGhhdCB0aGUgcGFyYW1ldGVyIGlzIGFscmVhZHkgYSBNYXAsIG9yIGNvbnZlcnRzIGFuIG9iamVjdCB0byBhIE1hcC5cbiAgICogSWYgdGhlIHBhcmFtZXRlciBpcyBhbiBvYmplY3QsIHdlIGNvbnZlcnQgaXQgdG8gYSBNYXAgdXNpbmcgT2JqZWN0LmVudHJpZXMuXG4gICAqIEB0aHJvd3MgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgYW4gb2JqZWN0IG9yIE1hcFxuICAgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRQYXJhbWV0ZXJUb01hcChwYXJhbTogb2JqZWN0LCBwYXJhbU5hbWU6IHN0cmluZyk6IE1hcDxhbnksIGFueT4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXJUeXBlKHBhcmFtLCAnb2JqZWN0JywgcGFyYW1OYW1lKTtcbiAgICBpZiAoQXJyYXkuaXNBcnJheShwYXJhbSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCBgRXhwZWN0aW5nIG9iamVjdCBvciBNYXAgZm9yOiAke3BhcmFtTmFtZX0uYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBhcmFtIGluc3RhbmNlb2YgTWFwID8gcGFyYW0gOiBuZXcgTWFwKE9iamVjdC5lbnRyaWVzKHBhcmFtKSk7XG4gIH1cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgdHJ5UGFyc2VOdW1iZXIodmFsdWU6IGFueSk6IHsgcGFyc2VkPzogbnVtYmVyOyBzdWNjZXNzOiBib29sZWFuIH0ge1xuICAgIGlmIChQYXJhbS5pc051bGxPclVuZGVmaW5lZCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgaWYgKFBhcmFtLmlzVHlwZU51bWJlcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiB7IHBhcnNlZDogdmFsdWUgYXMgbnVtYmVyLCBzdWNjZXNzOiB0cnVlIH07XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVTdHJpbmcgPSB2YWx1ZS50b1N0cmluZygpO1xuICAgIGlmICh2YWx1ZVN0cmluZyA9PT0gJ05hTicpIHtcbiAgICAgIC8vICdOYU4nIHBhcnNlcyBhcyBOYU4gd2hpY2ggaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSBhIGZhaWxlZCBwYXJzZS5cbiAgICAgIHJldHVybiB7IHBhcnNlZDogTmFOLCBzdWNjZXNzOiB0cnVlIH07XG4gICAgfVxuXG4gICAgY29uc3QgcGFyc2VkID0gcGFyc2VGbG9hdCh2YWx1ZVN0cmluZyk7XG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHtcbiAgICAgIHJldHVybiB7IHN1Y2Nlc3M6IGZhbHNlIH07XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgcGFyc2VkLCBzdWNjZXNzOiB0cnVlIH07XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldEluZm8sIFNoZWV0VHlwZSwgU2l6ZUNvbnN0cmFpbnQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcblxuZXhwb3J0IGNsYXNzIFNoZWV0VXRpbHMge1xuICAvLyBUaGlzIGlzIGEgZGlyZWN0IHBvcnQgZnJvbSBTaGVldFNpemUuY3MgLSBTaGVldFNpemVGYWN0b3J5XG4gIHB1YmxpYyBzdGF0aWMgZ2V0U2hlZXRTaXplRnJvbVNpemVDb25zdHJhaW50cyhzaXplQ29uc3RyYWludDogU2l6ZUNvbnN0cmFpbnQpOiBDb250cmFjdC5TaGVldFNpemUge1xuICAgIGNvbnN0IHsgbWluV2lkdGgsIG1pbkhlaWdodCwgbWF4V2lkdGgsIG1heEhlaWdodCB9ID0gc2l6ZUNvbnN0cmFpbnQ7XG5cbiAgICBpZiAobWluSGVpZ2h0ID09PSAwICYmIG1pbldpZHRoID09PSAwKSB7XG4gICAgICBpZiAobWF4SGVpZ2h0ID09PSAwICYmIG1heFdpZHRoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgYmVoYXZpb3I6IENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkF1dG9tYXRpYyxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYmVoYXZpb3I6IENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkF0TW9zdCxcbiAgICAgICAgbWF4U2l6ZTogeyB3aWR0aDogbWF4V2lkdGgsIGhlaWdodDogbWF4SGVpZ2h0IH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChtYXhIZWlnaHQgPT09IDAgJiYgbWF4V2lkdGggPT09IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdExlYXN0LFxuICAgICAgICBtaW5TaXplOiB7IHdpZHRoOiBtaW5XaWR0aCwgaGVpZ2h0OiBtaW5IZWlnaHQgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgaWYgKG1heEhlaWdodCA9PT0gbWluSGVpZ2h0ICYmIG1heFdpZHRoID09PSBtaW5XaWR0aCAmJiBtaW5XaWR0aCA+IDApIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5FeGFjdGx5LFxuICAgICAgICBtaW5TaXplOiB7IHdpZHRoOiBtaW5XaWR0aCwgaGVpZ2h0OiBtaW5IZWlnaHQgfSxcbiAgICAgICAgbWF4U2l6ZTogeyB3aWR0aDogbWluV2lkdGgsIGhlaWdodDogbWluSGVpZ2h0IH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vICdGaXQgV2lkdGgnIGZvciBhIERTRCBsYXlvdXRcbiAgICBjb25zdCBpc0RzZExheW91dCA9IG1pbldpZHRoID09PSAwICYmIG1heFdpZHRoID09PSAwO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5SYW5nZSxcbiAgICAgIG1pblNpemU6IHsgd2lkdGg6IG1pbldpZHRoLCBoZWlnaHQ6IG1pbkhlaWdodCB9LFxuICAgICAgbWF4U2l6ZTogeyB3aWR0aDogaXNEc2RMYXlvdXQgPyAyMTQ3NDgzNjQ3IDogbWF4V2lkdGgsIGhlaWdodDogbWF4SGVpZ2h0IH0sXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlQXV0b21hdGljU2l6ZSgpOiBDb250cmFjdC5TaGVldFNpemUge1xuICAgIGxldCBiZWhhdmlvciA9IENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkF1dG9tYXRpYztcbiAgICBsZXQgbWluU2l6ZSA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgIGxldCBtYXhTaXplID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07XG4gICAgcmV0dXJuIHsgYmVoYXZpb3IsIG1pblNpemUsIG1heFNpemUgfTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0UHVibGlzaGVkU2hlZXRJbmZvQnlOYW1lKG5hbWU6IHN0cmluZywgc2hlZXRJbmZvczogQXJyYXk8U2hlZXRJbmZvPik6IFNoZWV0SW5mbyB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3Qgc2hlZXRJbmZvID0gc2hlZXRJbmZvcy5maW5kKChzaGVldCkgPT4gc2hlZXQubmFtZSA9PT0gbmFtZSk7XG4gICAgcmV0dXJuIHNoZWV0SW5mbztcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgZ2V0U2hlZXRUeXBlRW51bShpbnRlcm5hbFNoZWV0VHlwZTogU2hlZXRUeXBlKTogQ29udHJhY3QuU2hlZXRUeXBlIHtcbiAgICBsZXQgc2hlZXRUeXBlOiBDb250cmFjdC5TaGVldFR5cGU7XG4gICAgc3dpdGNoIChpbnRlcm5hbFNoZWV0VHlwZSkge1xuICAgICAgY2FzZSBTaGVldFR5cGUuV29ya3NoZWV0OiB7XG4gICAgICAgIHNoZWV0VHlwZSA9IENvbnRyYWN0LlNoZWV0VHlwZS5Xb3Jrc2hlZXQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBTaGVldFR5cGUuRGFzaGJvYXJkOiB7XG4gICAgICAgIHNoZWV0VHlwZSA9IENvbnRyYWN0LlNoZWV0VHlwZS5EYXNoYm9hcmQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBTaGVldFR5cGUuU3Rvcnk6IHtcbiAgICAgICAgc2hlZXRUeXBlID0gQ29udHJhY3QuU2hlZXRUeXBlLlN0b3J5O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLlNlcnZlckVycm9yLCAnSW52YWxpZCBTaGVldFR5cGUnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHNoZWV0VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgaXNWYWxpZFNoZWV0U2l6ZShzaXplT2JqZWN0OiBDb250cmFjdC5TaXplIHwgQ29udHJhY3QuU2hlZXRTaXplKTogc2l6ZU9iamVjdCBpcyBDb250cmFjdC5TaGVldFNpemUge1xuICAgIHJldHVybiAoPENvbnRyYWN0LlNoZWV0U2l6ZT5zaXplT2JqZWN0KS5iZWhhdmlvciAhPT0gdW5kZWZpbmVkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IERlZmVycmVkLCBVbnJlZ2lzdGVyVGltZW91dEluTWlsbGlzZWNvbmRzIH0gZnJvbSAnLi9EZWZlcnJlZCc7XG5cbi8qKlxuICogQSBEZWZlcnJlZCB3cmFwcGVyIGNsYXNzIGFkZGluZyBmdW5jdGlvbmFsaXR5IHRvIHJlamVjdCB1bnJlc3BvbnNpdmUgcHJvbWlzZXMgYWZ0ZXIgdGltZW91dFxuICpcbiAqIHRoaXMgY2xhc3MgaGFuZGxlcyB0d28gdGhpbmdzOlxuXG4gKiAgICAxLiBBZGRzIHRpbWVvdXQgbG9naWMgZm9yIGRlZmVycmVkXG4gKiAgICAyLiBJdCBibG9ja3MgbXVsdGlwbGUgY2FsbHMgZnJvbSBleGVjdXRpbmcgYXQgdGhlIHNhbWUgdGltZS5cbiAqXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgU2hvcnRMaXZlZERlZmVycmVkXG4gKiBAdGVtcGxhdGUgVFJlc29sdmUgVGhlIHR5cGUgdXNlZCB0byByZXNvbHZlIHRoZSBwcm9taXNlLlxuICogQHRlbXBsYXRlIFRSZWplY3QgVGhlIHR5cGUgdXNlZCB0byByZWplY3QgdGhlIHByb21pc2UuIERlZmF1bHRzIHRvIGFueS5cbiAqXG4gKi9cbmV4cG9ydCBjbGFzcyBTaG9ydExpdmVkRGVmZXJyZWQ8VFJlc29sdmUsIFRSZWplY3QgPSBhbnk+IHtcbiAgcHJpdmF0ZSBfZGVmZXJyZWQ6IERlZmVycmVkPFRSZXNvbHZlLCBUUmVqZWN0PiB8IHVuZGVmaW5lZDtcbiAgcHJpdmF0ZSBfdGltZW91dElkO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF90aW1lb3V0SW5NaWxsaXNlY29uZHMgPSBVbnJlZ2lzdGVyVGltZW91dEluTWlsbGlzZWNvbmRzKSB7fVxuXG4gIHB1YmxpYyBnZXROZXdQcm9taXNlT3JUaHJvd0lmQnVzeSgpOiBQcm9taXNlPFRSZXNvbHZlPiB7XG4gICAgaWYgKHRoaXMuX2RlZmVycmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuQXBpRXhlY3V0aW9uRXJyb3IsICdUaGlzIGFwaSBjYW5ub3QgYmUgZXhlY3V0ZWQgdGlsbCBwcmV2aW91cyBjYWxsIGlzIHJlc29sdmVkLicpO1xuICAgIH1cbiAgICB0aGlzLl9kZWZlcnJlZCA9IG5ldyBEZWZlcnJlZCgpO1xuXG4gICAgdGhpcy5fdGltZW91dElkID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuVGltZW91dCxcbiAgICAgICAgYEFwaSBmYWlsZWQgdG8gY29tcGxldGUgaW4gJHt0aGlzLl90aW1lb3V0SW5NaWxsaXNlY29uZHMgLyAxMDAwfSBzZWNvbmRzYCxcbiAgICAgICk7XG4gICAgICB0aGlzLnJlamVjdChlcnJvcik7XG4gICAgfSwgdGhpcy5fdGltZW91dEluTWlsbGlzZWNvbmRzKTtcblxuICAgIHJldHVybiB0aGlzLl9kZWZlcnJlZC5wcm9taXNlO1xuICB9XG5cbiAgcHVibGljIHJlc29sdmUocmVzcG9uc2U6IFRSZXNvbHZlIHwgUHJvbWlzZUxpa2U8VFJlc29sdmU+KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RlZmVycmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dElkKTtcbiAgICAgIHRoaXMuX2RlZmVycmVkLnJlc29sdmUocmVzcG9uc2UpO1xuICAgICAgdGhpcy5fZGVmZXJyZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlamVjdChlcnJvcjogYW55KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX2RlZmVycmVkKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy5fdGltZW91dElkKTtcbiAgICAgIHRoaXMuX2RlZmVycmVkLnJlamVjdChlcnJvcik7XG4gICAgICB0aGlzLl9kZWZlcnJlZCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgVmVyc2lvbk51bWJlckNvbnRyYWN0IH0gZnJvbSAnLi9WZXJzaW9uTnVtYmVyQ29udHJhY3QnO1xuXG4vKipcbiAqIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgZXh0ZW5zaW9ucywgZW1iZWRkaW5nXG4gKiBhbmQgZXh0ZW5zaW9ucy1hcGktdHlwZXMgbGlicmFyeVxuICovXG5leHBvcnQgY2xhc3MgVmVyc2lvbk51bWJlciBpbXBsZW1lbnRzIFZlcnNpb25OdW1iZXJDb250cmFjdCB7XG4gIHB1YmxpYyBtYWpvcjogbnVtYmVyO1xuICBwdWJsaWMgbWlub3I6IG51bWJlcjtcbiAgcHVibGljIGZpeDogbnVtYmVyO1xuICBwdWJsaWMgYnVpbGQ6IG51bWJlcjtcbiAgcHVibGljIGlzQWxwaGE6IGJvb2xlYW47XG5cbiAgLy8gcHJpdmF0ZSBjb25zdHJ1Y3RvciBzbyBldmVyeW9uZSB1c2VzIHRoZSBzaW5nbGV0b24gaW5zdGFuY2VcbiAgLy8gYnVpbGQgbnVtYmVycyBoYXZlIHRoaXMgZm9ybTogTS5tLmYtcHJlLk5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHZlcnNpb25TdHJpbmc6IHN0cmluZywgaXNBbHBoYTogYm9vbGVhbikge1xuICAgIGNvbnN0IHBhcnRTdHIgPSB2ZXJzaW9uU3RyaW5nLnNwbGl0KCctJyk7XG4gICAgdGhpcy5idWlsZCA9IHRoaXMuZ2V0QnVpbGROdW1iZXIocGFydFN0clsxXSk7XG4gICAgdmVyc2lvblN0cmluZyA9IHBhcnRTdHJbMF07XG5cbiAgICBjb25zdCBwYXJ0cyA9IHZlcnNpb25TdHJpbmcuc3BsaXQoJy4nKS5tYXAoKHApID0+IHBhcnNlSW50KHAsIDEwKSk7XG4gICAgaWYgKHBhcnRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGBJbnZhbGlkIHZlcnNpb24gbnVtYmVyOiAke3ZlcnNpb25TdHJpbmd9YCk7XG4gICAgfVxuXG4gICAgdGhpcy5tYWpvciA9IHBhcnRzWzBdO1xuICAgIHRoaXMubWlub3IgPSBwYXJ0c1sxXTtcbiAgICB0aGlzLmZpeCA9IHBhcnRzWzJdO1xuICAgIHRoaXMuaXNBbHBoYSA9IGlzQWxwaGE7XG4gIH1cblxuICBwcml2YXRlIGdldEJ1aWxkTnVtYmVyKHByZVJlbGVhc2VTdHJpbmc6IHN0cmluZyk6IG51bWJlciB7XG4gICAgY29uc3Qgbm9CdWlsZE51bWJlciA9IC0xO1xuICAgIGlmICghcHJlUmVsZWFzZVN0cmluZykge1xuICAgICAgcmV0dXJuIG5vQnVpbGROdW1iZXI7XG4gICAgfVxuXG4gICAgLy8gVGhlIHByZVJlbGVhc2Ugc3RyaW5nIGhhcyB0aGlzIGZvcm06IHByZS5OLCBidXQgd2UgZG9uJ3QgZGVwZW5kIG9uIHRoZSBhY3R1YWwgc3RyaW5nIGJlaW5nICdwcmUnXG4gICAgY29uc3QgcGFydFN0ciA9IHByZVJlbGVhc2VTdHJpbmcuc3BsaXQoJy4nKTtcbiAgICByZXR1cm4gcGFydFN0clsxXSA/IHBhcnNlSW50KHBhcnRTdHJbMV0sIDEwKSA6IG5vQnVpbGROdW1iZXI7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLmZpeH1gO1xuICB9XG5cbiAgcHVibGljIGdldCBmdWxsRm9ybWF0dGVkVmFsdWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYCR7dGhpcy5tYWpvcn0uJHt0aGlzLm1pbm9yfS4ke3RoaXMuZml4fS1wcmUuJHt0aGlzLmJ1aWxkfWA7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXIsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeGVjdXRlUmVzcG9uc2UsXG4gIEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXIsXG4gIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sXG4gIE5vdGlmaWNhdGlvbixcbiAgTm90aWZpY2F0aW9uSGFuZGxlcixcbiAgVmVyYklkLFxuICBWZXJzaW9uTGVzc1RoYW4sXG4gIFZlcnNpb25OdW1iZXIsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIEludGVybmFsQXBpRGlzcGF0Y2hlciB3aGljaCBzdXBwb3J0cyB1cGdyYWRpbmcgYW5kIGRvd25ncmFkaW5nIHRoZSBpbnB1dFxuICogaW50ZXJuYWwgY29udHJhY3QgdG8gdGhlIHZlcnNpb24gdGhhdCB0aGlzIG1vZHVsZSBpcyBidWlsdCBhZ2FpbnN0XG4gKlxuICogQGNsYXNzIFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlclxuICogQGltcGxlbWVudHMge0ludGVybmFsQXBpRGlzcGF0Y2hlcn1cbiAqL1xuZXhwb3J0IGNsYXNzIFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlciBpbXBsZW1lbnRzIEludGVybmFsQXBpRGlzcGF0Y2hlciB7XG4gIHByaXZhdGUgX3ZlcnNpb25Db252ZXJ0ZXI6IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyO1xuICBwcml2YXRlIF9ub3RpZmljYXRpb25IYW5kbGVyczogQXJyYXk8Tm90aWZpY2F0aW9uSGFuZGxlcj47XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlclxuICAgKiBXZSBoYXZlIG11bHRpcGxlIHZlcnNpb24gY29udmVydGluZyBkaXNwYXRjaGVycyB0aGF0IHdvcmsgdG9nZXRoZXIuXG4gICAqIElmIG5lZWRlZCwgdGhlIFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlciB3cmFwcyBlaXRoZXIgdGhlIEludGVybmFsQXBpRGlzcGF0Y2hlciAoZGVza3RvcClcbiAgICogb3IgdGhlIENyb3NzRnJhbWVEaXNwYXRjaGVyIChzZXJ2ZXIpLlxuICAgKiBUaGUgSW50ZXJuYWwvQ3Jvc3NGcmFtZSBkaXNwYXRjaGVycyBoYW5kbGUgYW4gdXBkYXRlZCBwbGF0Zm9ybSB3aXRoIGFuIG9sZGVyIGV4dGVybmFsIGxpYnJhcnkuXG4gICAqIChUaGUgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgc2VuZHMgbWVzc2FnZXMgYWNyb3NzIHRoZSBmcmFtZSwgYW5kIGl0IGlzIGhhbmRsZWQgYnkgdGhlIFByZXNMYXllckhhbmRsZXIuKVxuICAgKiBNZWFud2hpbGUsIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgaGFuZGxlcyBhbiB1cGRhdGVkIGV4dGVybmFsIGxpYnJhcnkgd2l0aCBhbiBvbGRlciBwbGF0Zm9ybS5cblxuICAgKiBAcGFyYW0gX2FwaURlbGVnYXRlRGlzcGF0Y2hlciBUaGUgZGVsZWdhdGUgdGhhdCBkb2VzIHRoZSBhY3R1YWwgd29yay5cbiAgICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbk51bWJlciBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2hpY2ggdGhlIHBsYXRmb3JtIG1vZHVsZSBpcyB1c2luZy5cbiAgICogVGhpcyBudW1iZXIgd2lsbCBiZSB1c2VkIHRvIGZpZ3VyZSBvdXQgaG93IHRvIGRvd25ncmFkZSBpbmNvbWluZyBjb21tYW5kcyBhbmQgdXBncmFkZSB0aGUgcmVzdWx0c1xuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2FwaURlbGVnYXRlRGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyLCBwbGF0Zm9ybVZlcnNpb25OdW1iZXI6IFZlcnNpb25OdW1iZXIpIHtcbiAgICB0aGlzLl92ZXJzaW9uQ29udmVydGVyID0gQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcihJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLCBwbGF0Zm9ybVZlcnNpb25OdW1iZXIpO1xuXG4gICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBbXTtcbiAgICBfYXBpRGVsZWdhdGVEaXNwYXRjaGVyLnJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcigobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiB2b2lkID0+IHtcbiAgICAgIGlmICh0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgdXBncmFkZWROb3RpZmljYXRpb24gPSB0aGlzLl92ZXJzaW9uQ29udmVydGVyLnVwZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uKTtcbiAgICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLmZvckVhY2goKGhhbmRsZXIpID0+IHtcbiAgICAgICAgaGFuZGxlcih1cGdyYWRlZE5vdGlmaWNhdGlvbik7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgbmVlZHNWZXJzaW9uQ29udmVydGVyKHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcik6IGJvb2xlYW4ge1xuICAgIC8vIElmIG91ciBwbGF0Zm9ybSBpcyBsZXNzIHRoYW4gZXh0ZXJuYWwgbGlicmFyeSB2ZXJzaW9uLCB0aGVuIHdlIG5lZWQgYSBjb252ZXJ0ZXJcbiAgICByZXR1cm4gVmVyc2lvbkxlc3NUaGFuKHBsYXRmb3JtVmVyc2lvbiwgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTik7XG4gIH1cblxuICBwdWJsaWMgZXhlY3V0ZSh2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogUHJvbWlzZTxFeGVjdXRlUmVzcG9uc2U+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZG93bmdyYWRlUGFyYW1ldGVycyA9IHRoaXMuX3ZlcnNpb25Db252ZXJ0ZXIuZG93bmdyYWRlRXhlY3V0ZUNhbGwodmVyYiwgcGFyYW1ldGVycyk7XG4gICAgICByZXR1cm4gdGhpcy5fYXBpRGVsZWdhdGVEaXNwYXRjaGVyLmV4ZWN1dGUoZG93bmdyYWRlUGFyYW1ldGVycy52ZXJiLCBkb3duZ3JhZGVQYXJhbWV0ZXJzLnBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHVwZ3JhZGVSZXNwb25zZSA9IHRoaXMuX3ZlcnNpb25Db252ZXJ0ZXIudXBncmFkZUV4ZWN1dGVSZXR1cm4ocmVzcG9uc2UsIHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgICAgICByZXR1cm4gdXBncmFkZVJlc3BvbnNlO1xuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KGUpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgdW5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZmlsdGVyKChoKSA9PiBoICE9PSBoYW5kbGVyKTtcbiAgfVxufVxuIiwiZXhwb3J0IHsgZGVmYXVsdCBhcyB2MSB9IGZyb20gJy4vdjEuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2MyB9IGZyb20gJy4vdjMuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2NCB9IGZyb20gJy4vdjQuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2NSB9IGZyb20gJy4vdjUuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBOSUwgfSBmcm9tICcuL25pbC5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHZlcnNpb24gfSBmcm9tICcuL3ZlcnNpb24uanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2YWxpZGF0ZSB9IGZyb20gJy4vdmFsaWRhdGUuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBzdHJpbmdpZnkgfSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5leHBvcnQgeyBkZWZhdWx0IGFzIHBhcnNlIH0gZnJvbSAnLi9wYXJzZS5qcyc7IiwiLypcbiAqIEJyb3dzZXItY29tcGF0aWJsZSBKYXZhU2NyaXB0IE1ENVxuICpcbiAqIE1vZGlmaWNhdGlvbiBvZiBKYXZhU2NyaXB0IE1ENVxuICogaHR0cHM6Ly9naXRodWIuY29tL2JsdWVpbXAvSmF2YVNjcmlwdC1NRDVcbiAqXG4gKiBDb3B5cmlnaHQgMjAxMSwgU2ViYXN0aWFuIFRzY2hhblxuICogaHR0cHM6Ly9ibHVlaW1wLm5ldFxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZTpcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlUXG4gKlxuICogQmFzZWQgb25cbiAqIEEgSmF2YVNjcmlwdCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUlNBIERhdGEgU2VjdXJpdHksIEluYy4gTUQ1IE1lc3NhZ2VcbiAqIERpZ2VzdCBBbGdvcml0aG0sIGFzIGRlZmluZWQgaW4gUkZDIDEzMjEuXG4gKiBWZXJzaW9uIDIuMiBDb3B5cmlnaHQgKEMpIFBhdWwgSm9obnN0b24gMTk5OSAtIDIwMDlcbiAqIE90aGVyIGNvbnRyaWJ1dG9yczogR3JlZyBIb2x0LCBBbmRyZXcgS2VwZXJ0LCBZZG5hciwgTG9zdGluZXRcbiAqIERpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCU0QgTGljZW5zZVxuICogU2VlIGh0dHA6Ly9wYWpob21lLm9yZy51ay9jcnlwdC9tZDUgZm9yIG1vcmUgaW5mby5cbiAqL1xuZnVuY3Rpb24gbWQ1KGJ5dGVzKSB7XG4gIGlmICh0eXBlb2YgYnl0ZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFyIG1zZyA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChieXRlcykpOyAvLyBVVEY4IGVzY2FwZVxuXG4gICAgYnl0ZXMgPSBuZXcgVWludDhBcnJheShtc2cubGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbXNnLmxlbmd0aDsgKytpKSB7XG4gICAgICBieXRlc1tpXSA9IG1zZy5jaGFyQ29kZUF0KGkpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZDVUb0hleEVuY29kZWRBcnJheSh3b3Jkc1RvTWQ1KGJ5dGVzVG9Xb3JkcyhieXRlcyksIGJ5dGVzLmxlbmd0aCAqIDgpKTtcbn1cbi8qXG4gKiBDb252ZXJ0IGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMgdG8gYW4gYXJyYXkgb2YgYnl0ZXNcbiAqL1xuXG5cbmZ1bmN0aW9uIG1kNVRvSGV4RW5jb2RlZEFycmF5KGlucHV0KSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgdmFyIGxlbmd0aDMyID0gaW5wdXQubGVuZ3RoICogMzI7XG4gIHZhciBoZXhUYWIgPSAnMDEyMzQ1Njc4OWFiY2RlZic7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGgzMjsgaSArPSA4KSB7XG4gICAgdmFyIHggPSBpbnB1dFtpID4+IDVdID4+PiBpICUgMzIgJiAweGZmO1xuICAgIHZhciBoZXggPSBwYXJzZUludChoZXhUYWIuY2hhckF0KHggPj4+IDQgJiAweDBmKSArIGhleFRhYi5jaGFyQXQoeCAmIDB4MGYpLCAxNik7XG4gICAgb3V0cHV0LnB1c2goaGV4KTtcbiAgfVxuXG4gIHJldHVybiBvdXRwdXQ7XG59XG4vKipcbiAqIENhbGN1bGF0ZSBvdXRwdXQgbGVuZ3RoIHdpdGggcGFkZGluZyBhbmQgYml0IGxlbmd0aFxuICovXG5cblxuZnVuY3Rpb24gZ2V0T3V0cHV0TGVuZ3RoKGlucHV0TGVuZ3RoOCkge1xuICByZXR1cm4gKGlucHV0TGVuZ3RoOCArIDY0ID4+PiA5IDw8IDQpICsgMTQgKyAxO1xufVxuLypcbiAqIENhbGN1bGF0ZSB0aGUgTUQ1IG9mIGFuIGFycmF5IG9mIGxpdHRsZS1lbmRpYW4gd29yZHMsIGFuZCBhIGJpdCBsZW5ndGguXG4gKi9cblxuXG5mdW5jdGlvbiB3b3Jkc1RvTWQ1KHgsIGxlbikge1xuICAvKiBhcHBlbmQgcGFkZGluZyAqL1xuICB4W2xlbiA+PiA1XSB8PSAweDgwIDw8IGxlbiAlIDMyO1xuICB4W2dldE91dHB1dExlbmd0aChsZW4pIC0gMV0gPSBsZW47XG4gIHZhciBhID0gMTczMjU4NDE5MztcbiAgdmFyIGIgPSAtMjcxNzMzODc5O1xuICB2YXIgYyA9IC0xNzMyNTg0MTk0O1xuICB2YXIgZCA9IDI3MTczMzg3ODtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHgubGVuZ3RoOyBpICs9IDE2KSB7XG4gICAgdmFyIG9sZGEgPSBhO1xuICAgIHZhciBvbGRiID0gYjtcbiAgICB2YXIgb2xkYyA9IGM7XG4gICAgdmFyIG9sZGQgPSBkO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2ldLCA3LCAtNjgwODc2OTM2KTtcbiAgICBkID0gbWQ1ZmYoZCwgYSwgYiwgYywgeFtpICsgMV0sIDEyLCAtMzg5NTY0NTg2KTtcbiAgICBjID0gbWQ1ZmYoYywgZCwgYSwgYiwgeFtpICsgMl0sIDE3LCA2MDYxMDU4MTkpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAzXSwgMjIsIC0xMDQ0NTI1MzMwKTtcbiAgICBhID0gbWQ1ZmYoYSwgYiwgYywgZCwgeFtpICsgNF0sIDcsIC0xNzY0MTg4OTcpO1xuICAgIGQgPSBtZDVmZihkLCBhLCBiLCBjLCB4W2kgKyA1XSwgMTIsIDEyMDAwODA0MjYpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyA2XSwgMTcsIC0xNDczMjMxMzQxKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgN10sIDIyLCAtNDU3MDU5ODMpO1xuICAgIGEgPSBtZDVmZihhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNywgMTc3MDAzNTQxNik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDldLCAxMiwgLTE5NTg0MTQ0MTcpO1xuICAgIGMgPSBtZDVmZihjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE3LCAtNDIwNjMpO1xuICAgIGIgPSBtZDVmZihiLCBjLCBkLCBhLCB4W2kgKyAxMV0sIDIyLCAtMTk5MDQwNDE2Mik7XG4gICAgYSA9IG1kNWZmKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNywgMTgwNDYwMzY4Mik7XG4gICAgZCA9IG1kNWZmKGQsIGEsIGIsIGMsIHhbaSArIDEzXSwgMTIsIC00MDM0MTEwMSk7XG4gICAgYyA9IG1kNWZmKGMsIGQsIGEsIGIsIHhbaSArIDE0XSwgMTcsIC0xNTAyMDAyMjkwKTtcbiAgICBiID0gbWQ1ZmYoYiwgYywgZCwgYSwgeFtpICsgMTVdLCAyMiwgMTIzNjUzNTMyOSk7XG4gICAgYSA9IG1kNWdnKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA1LCAtMTY1Nzk2NTEwKTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgNl0sIDksIC0xMDY5NTAxNjMyKTtcbiAgICBjID0gbWQ1Z2coYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNCwgNjQzNzE3NzEzKTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpXSwgMjAsIC0zNzM4OTczMDIpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyA1XSwgNSwgLTcwMTU1ODY5MSk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDEwXSwgOSwgMzgwMTYwODMpO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE0LCAtNjYwNDc4MzM1KTtcbiAgICBiID0gbWQ1Z2coYiwgYywgZCwgYSwgeFtpICsgNF0sIDIwLCAtNDA1NTM3ODQ4KTtcbiAgICBhID0gbWQ1Z2coYSwgYiwgYywgZCwgeFtpICsgOV0sIDUsIDU2ODQ0NjQzOCk7XG4gICAgZCA9IG1kNWdnKGQsIGEsIGIsIGMsIHhbaSArIDE0XSwgOSwgLTEwMTk4MDM2OTApO1xuICAgIGMgPSBtZDVnZyhjLCBkLCBhLCBiLCB4W2kgKyAzXSwgMTQsIC0xODczNjM5NjEpO1xuICAgIGIgPSBtZDVnZyhiLCBjLCBkLCBhLCB4W2kgKyA4XSwgMjAsIDExNjM1MzE1MDEpO1xuICAgIGEgPSBtZDVnZyhhLCBiLCBjLCBkLCB4W2kgKyAxM10sIDUsIC0xNDQ0NjgxNDY3KTtcbiAgICBkID0gbWQ1Z2coZCwgYSwgYiwgYywgeFtpICsgMl0sIDksIC01MTQwMzc4NCk7XG4gICAgYyA9IG1kNWdnKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNCwgMTczNTMyODQ3Myk7XG4gICAgYiA9IG1kNWdnKGIsIGMsIGQsIGEsIHhbaSArIDEyXSwgMjAsIC0xOTI2NjA3NzM0KTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgNV0sIDQsIC0zNzg1NTgpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2kgKyA4XSwgMTEsIC0yMDIyNTc0NDYzKTtcbiAgICBjID0gbWQ1aGgoYywgZCwgYSwgYiwgeFtpICsgMTFdLCAxNiwgMTgzOTAzMDU2Mik7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDE0XSwgMjMsIC0zNTMwOTU1Nik7XG4gICAgYSA9IG1kNWhoKGEsIGIsIGMsIGQsIHhbaSArIDFdLCA0LCAtMTUzMDk5MjA2MCk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDRdLCAxMSwgMTI3Mjg5MzM1Myk7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDddLCAxNiwgLTE1NTQ5NzYzMik7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDEwXSwgMjMsIC0xMDk0NzMwNjQwKTtcbiAgICBhID0gbWQ1aGgoYSwgYiwgYywgZCwgeFtpICsgMTNdLCA0LCA2ODEyNzkxNzQpO1xuICAgIGQgPSBtZDVoaChkLCBhLCBiLCBjLCB4W2ldLCAxMSwgLTM1ODUzNzIyMik7XG4gICAgYyA9IG1kNWhoKGMsIGQsIGEsIGIsIHhbaSArIDNdLCAxNiwgLTcyMjUyMTk3OSk7XG4gICAgYiA9IG1kNWhoKGIsIGMsIGQsIGEsIHhbaSArIDZdLCAyMywgNzYwMjkxODkpO1xuICAgIGEgPSBtZDVoaChhLCBiLCBjLCBkLCB4W2kgKyA5XSwgNCwgLTY0MDM2NDQ4Nyk7XG4gICAgZCA9IG1kNWhoKGQsIGEsIGIsIGMsIHhbaSArIDEyXSwgMTEsIC00MjE4MTU4MzUpO1xuICAgIGMgPSBtZDVoaChjLCBkLCBhLCBiLCB4W2kgKyAxNV0sIDE2LCA1MzA3NDI1MjApO1xuICAgIGIgPSBtZDVoaChiLCBjLCBkLCBhLCB4W2kgKyAyXSwgMjMsIC05OTUzMzg2NTEpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2ldLCA2LCAtMTk4NjMwODQ0KTtcbiAgICBkID0gbWQ1aWkoZCwgYSwgYiwgYywgeFtpICsgN10sIDEwLCAxMTI2ODkxNDE1KTtcbiAgICBjID0gbWQ1aWkoYywgZCwgYSwgYiwgeFtpICsgMTRdLCAxNSwgLTE0MTYzNTQ5MDUpO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyA1XSwgMjEsIC01NzQzNDA1NSk7XG4gICAgYSA9IG1kNWlpKGEsIGIsIGMsIGQsIHhbaSArIDEyXSwgNiwgMTcwMDQ4NTU3MSk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDNdLCAxMCwgLTE4OTQ5ODY2MDYpO1xuICAgIGMgPSBtZDVpaShjLCBkLCBhLCBiLCB4W2kgKyAxMF0sIDE1LCAtMTA1MTUyMyk7XG4gICAgYiA9IG1kNWlpKGIsIGMsIGQsIGEsIHhbaSArIDFdLCAyMSwgLTIwNTQ5MjI3OTkpO1xuICAgIGEgPSBtZDVpaShhLCBiLCBjLCBkLCB4W2kgKyA4XSwgNiwgMTg3MzMxMzM1OSk7XG4gICAgZCA9IG1kNWlpKGQsIGEsIGIsIGMsIHhbaSArIDE1XSwgMTAsIC0zMDYxMTc0NCk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDZdLCAxNSwgLTE1NjAxOTgzODApO1xuICAgIGIgPSBtZDVpaShiLCBjLCBkLCBhLCB4W2kgKyAxM10sIDIxLCAxMzA5MTUxNjQ5KTtcbiAgICBhID0gbWQ1aWkoYSwgYiwgYywgZCwgeFtpICsgNF0sIDYsIC0xNDU1MjMwNzApO1xuICAgIGQgPSBtZDVpaShkLCBhLCBiLCBjLCB4W2kgKyAxMV0sIDEwLCAtMTEyMDIxMDM3OSk7XG4gICAgYyA9IG1kNWlpKGMsIGQsIGEsIGIsIHhbaSArIDJdLCAxNSwgNzE4Nzg3MjU5KTtcbiAgICBiID0gbWQ1aWkoYiwgYywgZCwgYSwgeFtpICsgOV0sIDIxLCAtMzQzNDg1NTUxKTtcbiAgICBhID0gc2FmZUFkZChhLCBvbGRhKTtcbiAgICBiID0gc2FmZUFkZChiLCBvbGRiKTtcbiAgICBjID0gc2FmZUFkZChjLCBvbGRjKTtcbiAgICBkID0gc2FmZUFkZChkLCBvbGRkKTtcbiAgfVxuXG4gIHJldHVybiBbYSwgYiwgYywgZF07XG59XG4vKlxuICogQ29udmVydCBhbiBhcnJheSBieXRlcyB0byBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzXG4gKiBDaGFyYWN0ZXJzID4yNTUgaGF2ZSB0aGVpciBoaWdoLWJ5dGUgc2lsZW50bHkgaWdub3JlZC5cbiAqL1xuXG5cbmZ1bmN0aW9uIGJ5dGVzVG9Xb3JkcyhpbnB1dCkge1xuICBpZiAoaW5wdXQubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgdmFyIGxlbmd0aDggPSBpbnB1dC5sZW5ndGggKiA4O1xuICB2YXIgb3V0cHV0ID0gbmV3IFVpbnQzMkFycmF5KGdldE91dHB1dExlbmd0aChsZW5ndGg4KSk7XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg4OyBpICs9IDgpIHtcbiAgICBvdXRwdXRbaSA+PiA1XSB8PSAoaW5wdXRbaSAvIDhdICYgMHhmZikgPDwgaSAlIDMyO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn1cbi8qXG4gKiBBZGQgaW50ZWdlcnMsIHdyYXBwaW5nIGF0IDJeMzIuIFRoaXMgdXNlcyAxNi1iaXQgb3BlcmF0aW9ucyBpbnRlcm5hbGx5XG4gKiB0byB3b3JrIGFyb3VuZCBidWdzIGluIHNvbWUgSlMgaW50ZXJwcmV0ZXJzLlxuICovXG5cblxuZnVuY3Rpb24gc2FmZUFkZCh4LCB5KSB7XG4gIHZhciBsc3cgPSAoeCAmIDB4ZmZmZikgKyAoeSAmIDB4ZmZmZik7XG4gIHZhciBtc3cgPSAoeCA+PiAxNikgKyAoeSA+PiAxNikgKyAobHN3ID4+IDE2KTtcbiAgcmV0dXJuIG1zdyA8PCAxNiB8IGxzdyAmIDB4ZmZmZjtcbn1cbi8qXG4gKiBCaXR3aXNlIHJvdGF0ZSBhIDMyLWJpdCBudW1iZXIgdG8gdGhlIGxlZnQuXG4gKi9cblxuXG5mdW5jdGlvbiBiaXRSb3RhdGVMZWZ0KG51bSwgY250KSB7XG4gIHJldHVybiBudW0gPDwgY250IHwgbnVtID4+PiAzMiAtIGNudDtcbn1cbi8qXG4gKiBUaGVzZSBmdW5jdGlvbnMgaW1wbGVtZW50IHRoZSBmb3VyIGJhc2ljIG9wZXJhdGlvbnMgdGhlIGFsZ29yaXRobSB1c2VzLlxuICovXG5cblxuZnVuY3Rpb24gbWQ1Y21uKHEsIGEsIGIsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIHNhZmVBZGQoYml0Um90YXRlTGVmdChzYWZlQWRkKHNhZmVBZGQoYSwgcSksIHNhZmVBZGQoeCwgdCkpLCBzKSwgYik7XG59XG5cbmZ1bmN0aW9uIG1kNWZmKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiICYgYyB8IH5iICYgZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNWdnKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiICYgZCB8IGMgJiB+ZCwgYSwgYiwgeCwgcywgdCk7XG59XG5cbmZ1bmN0aW9uIG1kNWhoKGEsIGIsIGMsIGQsIHgsIHMsIHQpIHtcbiAgcmV0dXJuIG1kNWNtbihiIF4gYyBeIGQsIGEsIGIsIHgsIHMsIHQpO1xufVxuXG5mdW5jdGlvbiBtZDVpaShhLCBiLCBjLCBkLCB4LCBzLCB0KSB7XG4gIHJldHVybiBtZDVjbW4oYyBeIChiIHwgfmQpLCBhLCBiLCB4LCBzLCB0KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgbWQ1OyIsImV4cG9ydCBkZWZhdWx0ICcwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDAnOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gcGFyc2UodXVpZCkge1xuICBpZiAoIXZhbGlkYXRlKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdJbnZhbGlkIFVVSUQnKTtcbiAgfVxuXG4gIHZhciB2O1xuICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMTYpOyAvLyBQYXJzZSAjIyMjIyMjIy0uLi4uLS4uLi4tLi4uLi0uLi4uLi4uLi4uLi5cblxuICBhcnJbMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMCwgOCksIDE2KSkgPj4+IDI0O1xuICBhcnJbMV0gPSB2ID4+PiAxNiAmIDB4ZmY7XG4gIGFyclsyXSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbM10gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tIyMjIy0uLi4uLS4uLi4tLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzRdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDksIDEzKSwgMTYpKSA+Pj4gODtcbiAgYXJyWzVdID0gdiAmIDB4ZmY7IC8vIFBhcnNlIC4uLi4uLi4uLS4uLi4tIyMjIy0uLi4uLS4uLi4uLi4uLi4uLlxuXG4gIGFycls2XSA9ICh2ID0gcGFyc2VJbnQodXVpZC5zbGljZSgxNCwgMTgpLCAxNikpID4+PiA4O1xuICBhcnJbN10gPSB2ICYgMHhmZjsgLy8gUGFyc2UgLi4uLi4uLi4tLi4uLi0uLi4uLSMjIyMtLi4uLi4uLi4uLi4uXG5cbiAgYXJyWzhdID0gKHYgPSBwYXJzZUludCh1dWlkLnNsaWNlKDE5LCAyMyksIDE2KSkgPj4+IDg7XG4gIGFycls5XSA9IHYgJiAweGZmOyAvLyBQYXJzZSAuLi4uLi4uLi0uLi4uLS4uLi4tLi4uLi0jIyMjIyMjIyMjIyNcbiAgLy8gKFVzZSBcIi9cIiB0byBhdm9pZCAzMi1iaXQgdHJ1bmNhdGlvbiB3aGVuIGJpdC1zaGlmdGluZyBoaWdoLW9yZGVyIGJ5dGVzKVxuXG4gIGFyclsxMF0gPSAodiA9IHBhcnNlSW50KHV1aWQuc2xpY2UoMjQsIDM2KSwgMTYpKSAvIDB4MTAwMDAwMDAwMDAgJiAweGZmO1xuICBhcnJbMTFdID0gdiAvIDB4MTAwMDAwMDAwICYgMHhmZjtcbiAgYXJyWzEyXSA9IHYgPj4+IDI0ICYgMHhmZjtcbiAgYXJyWzEzXSA9IHYgPj4+IDE2ICYgMHhmZjtcbiAgYXJyWzE0XSA9IHYgPj4+IDggJiAweGZmO1xuICBhcnJbMTVdID0gdiAmIDB4ZmY7XG4gIHJldHVybiBhcnI7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHBhcnNlOyIsImV4cG9ydCBkZWZhdWx0IC9eKD86WzAtOWEtZl17OH0tWzAtOWEtZl17NH0tWzEtNV1bMC05YS1mXXszfS1bODlhYl1bMC05YS1mXXszfS1bMC05YS1mXXsxMn18MDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwKSQvaTsiLCIvLyBVbmlxdWUgSUQgY3JlYXRpb24gcmVxdWlyZXMgYSBoaWdoIHF1YWxpdHkgcmFuZG9tICMgZ2VuZXJhdG9yLiBJbiB0aGUgYnJvd3NlciB3ZSB0aGVyZWZvcmVcbi8vIHJlcXVpcmUgdGhlIGNyeXB0byBBUEkgYW5kIGRvIG5vdCBzdXBwb3J0IGJ1aWx0LWluIGZhbGxiYWNrIHRvIGxvd2VyIHF1YWxpdHkgcmFuZG9tIG51bWJlclxuLy8gZ2VuZXJhdG9ycyAobGlrZSBNYXRoLnJhbmRvbSgpKS5cbnZhciBnZXRSYW5kb21WYWx1ZXM7XG52YXIgcm5kczggPSBuZXcgVWludDhBcnJheSgxNik7XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBybmcoKSB7XG4gIC8vIGxhenkgbG9hZCBzbyB0aGF0IGVudmlyb25tZW50cyB0aGF0IG5lZWQgdG8gcG9seWZpbGwgaGF2ZSBhIGNoYW5jZSB0byBkbyBzb1xuICBpZiAoIWdldFJhbmRvbVZhbHVlcykge1xuICAgIC8vIGdldFJhbmRvbVZhbHVlcyBuZWVkcyB0byBiZSBpbnZva2VkIGluIGEgY29udGV4dCB3aGVyZSBcInRoaXNcIiBpcyBhIENyeXB0byBpbXBsZW1lbnRhdGlvbi4gQWxzbyxcbiAgICAvLyBmaW5kIHRoZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiBvZiBjcnlwdG8gKG1zQ3J5cHRvKSBvbiBJRTExLlxuICAgIGdldFJhbmRvbVZhbHVlcyA9IHR5cGVvZiBjcnlwdG8gIT09ICd1bmRlZmluZWQnICYmIGNyeXB0by5nZXRSYW5kb21WYWx1ZXMgJiYgY3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKGNyeXB0bykgfHwgdHlwZW9mIG1zQ3J5cHRvICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgbXNDcnlwdG8uZ2V0UmFuZG9tVmFsdWVzID09PSAnZnVuY3Rpb24nICYmIG1zQ3J5cHRvLmdldFJhbmRvbVZhbHVlcy5iaW5kKG1zQ3J5cHRvKTtcblxuICAgIGlmICghZ2V0UmFuZG9tVmFsdWVzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NyeXB0by5nZXRSYW5kb21WYWx1ZXMoKSBub3Qgc3VwcG9ydGVkLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkI2dldHJhbmRvbXZhbHVlcy1ub3Qtc3VwcG9ydGVkJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGdldFJhbmRvbVZhbHVlcyhybmRzOCk7XG59IiwiLy8gQWRhcHRlZCBmcm9tIENocmlzIFZlbmVzcycgU0hBMSBjb2RlIGF0XG4vLyBodHRwOi8vd3d3Lm1vdmFibGUtdHlwZS5jby51ay9zY3JpcHRzL3NoYTEuaHRtbFxuZnVuY3Rpb24gZihzLCB4LCB5LCB6KSB7XG4gIHN3aXRjaCAocykge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiB4ICYgeSBeIH54ICYgejtcblxuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiB4IF4geSBeIHo7XG5cbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4geCAmIHkgXiB4ICYgeiBeIHkgJiB6O1xuXG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIHggXiB5IF4gejtcbiAgfVxufVxuXG5mdW5jdGlvbiBST1RMKHgsIG4pIHtcbiAgcmV0dXJuIHggPDwgbiB8IHggPj4+IDMyIC0gbjtcbn1cblxuZnVuY3Rpb24gc2hhMShieXRlcykge1xuICB2YXIgSyA9IFsweDVhODI3OTk5LCAweDZlZDllYmExLCAweDhmMWJiY2RjLCAweGNhNjJjMWQ2XTtcbiAgdmFyIEggPSBbMHg2NzQ1MjMwMSwgMHhlZmNkYWI4OSwgMHg5OGJhZGNmZSwgMHgxMDMyNTQ3NiwgMHhjM2QyZTFmMF07XG5cbiAgaWYgKHR5cGVvZiBieXRlcyA9PT0gJ3N0cmluZycpIHtcbiAgICB2YXIgbXNnID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KGJ5dGVzKSk7IC8vIFVURjggZXNjYXBlXG5cbiAgICBieXRlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtc2cubGVuZ3RoOyArK2kpIHtcbiAgICAgIGJ5dGVzLnB1c2gobXNnLmNoYXJDb2RlQXQoaSkpO1xuICAgIH1cbiAgfSBlbHNlIGlmICghQXJyYXkuaXNBcnJheShieXRlcykpIHtcbiAgICAvLyBDb252ZXJ0IEFycmF5LWxpa2UgdG8gQXJyYXlcbiAgICBieXRlcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGJ5dGVzKTtcbiAgfVxuXG4gIGJ5dGVzLnB1c2goMHg4MCk7XG4gIHZhciBsID0gYnl0ZXMubGVuZ3RoIC8gNCArIDI7XG4gIHZhciBOID0gTWF0aC5jZWlsKGwgLyAxNik7XG4gIHZhciBNID0gbmV3IEFycmF5KE4pO1xuXG4gIGZvciAodmFyIF9pID0gMDsgX2kgPCBOOyArK19pKSB7XG4gICAgdmFyIGFyciA9IG5ldyBVaW50MzJBcnJheSgxNik7XG5cbiAgICBmb3IgKHZhciBqID0gMDsgaiA8IDE2OyArK2opIHtcbiAgICAgIGFycltqXSA9IGJ5dGVzW19pICogNjQgKyBqICogNF0gPDwgMjQgfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAxXSA8PCAxNiB8IGJ5dGVzW19pICogNjQgKyBqICogNCArIDJdIDw8IDggfCBieXRlc1tfaSAqIDY0ICsgaiAqIDQgKyAzXTtcbiAgICB9XG5cbiAgICBNW19pXSA9IGFycjtcbiAgfVxuXG4gIE1bTiAtIDFdWzE0XSA9IChieXRlcy5sZW5ndGggLSAxKSAqIDggLyBNYXRoLnBvdygyLCAzMik7XG4gIE1bTiAtIDFdWzE0XSA9IE1hdGguZmxvb3IoTVtOIC0gMV1bMTRdKTtcbiAgTVtOIC0gMV1bMTVdID0gKGJ5dGVzLmxlbmd0aCAtIDEpICogOCAmIDB4ZmZmZmZmZmY7XG5cbiAgZm9yICh2YXIgX2kyID0gMDsgX2kyIDwgTjsgKytfaTIpIHtcbiAgICB2YXIgVyA9IG5ldyBVaW50MzJBcnJheSg4MCk7XG5cbiAgICBmb3IgKHZhciB0ID0gMDsgdCA8IDE2OyArK3QpIHtcbiAgICAgIFdbdF0gPSBNW19pMl1bdF07XG4gICAgfVxuXG4gICAgZm9yICh2YXIgX3QgPSAxNjsgX3QgPCA4MDsgKytfdCkge1xuICAgICAgV1tfdF0gPSBST1RMKFdbX3QgLSAzXSBeIFdbX3QgLSA4XSBeIFdbX3QgLSAxNF0gXiBXW190IC0gMTZdLCAxKTtcbiAgICB9XG5cbiAgICB2YXIgYSA9IEhbMF07XG4gICAgdmFyIGIgPSBIWzFdO1xuICAgIHZhciBjID0gSFsyXTtcbiAgICB2YXIgZCA9IEhbM107XG4gICAgdmFyIGUgPSBIWzRdO1xuXG4gICAgZm9yICh2YXIgX3QyID0gMDsgX3QyIDwgODA7ICsrX3QyKSB7XG4gICAgICB2YXIgcyA9IE1hdGguZmxvb3IoX3QyIC8gMjApO1xuICAgICAgdmFyIFQgPSBST1RMKGEsIDUpICsgZihzLCBiLCBjLCBkKSArIGUgKyBLW3NdICsgV1tfdDJdID4+PiAwO1xuICAgICAgZSA9IGQ7XG4gICAgICBkID0gYztcbiAgICAgIGMgPSBST1RMKGIsIDMwKSA+Pj4gMDtcbiAgICAgIGIgPSBhO1xuICAgICAgYSA9IFQ7XG4gICAgfVxuXG4gICAgSFswXSA9IEhbMF0gKyBhID4+PiAwO1xuICAgIEhbMV0gPSBIWzFdICsgYiA+Pj4gMDtcbiAgICBIWzJdID0gSFsyXSArIGMgPj4+IDA7XG4gICAgSFszXSA9IEhbM10gKyBkID4+PiAwO1xuICAgIEhbNF0gPSBIWzRdICsgZSA+Pj4gMDtcbiAgfVxuXG4gIHJldHVybiBbSFswXSA+PiAyNCAmIDB4ZmYsIEhbMF0gPj4gMTYgJiAweGZmLCBIWzBdID4+IDggJiAweGZmLCBIWzBdICYgMHhmZiwgSFsxXSA+PiAyNCAmIDB4ZmYsIEhbMV0gPj4gMTYgJiAweGZmLCBIWzFdID4+IDggJiAweGZmLCBIWzFdICYgMHhmZiwgSFsyXSA+PiAyNCAmIDB4ZmYsIEhbMl0gPj4gMTYgJiAweGZmLCBIWzJdID4+IDggJiAweGZmLCBIWzJdICYgMHhmZiwgSFszXSA+PiAyNCAmIDB4ZmYsIEhbM10gPj4gMTYgJiAweGZmLCBIWzNdID4+IDggJiAweGZmLCBIWzNdICYgMHhmZiwgSFs0XSA+PiAyNCAmIDB4ZmYsIEhbNF0gPj4gMTYgJiAweGZmLCBIWzRdID4+IDggJiAweGZmLCBIWzRdICYgMHhmZl07XG59XG5cbmV4cG9ydCBkZWZhdWx0IHNoYTE7IiwiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuLyoqXG4gKiBDb252ZXJ0IGFycmF5IG9mIDE2IGJ5dGUgdmFsdWVzIHRvIFVVSUQgc3RyaW5nIGZvcm1hdCBvZiB0aGUgZm9ybTpcbiAqIFhYWFhYWFhYLVhYWFgtWFhYWC1YWFhYLVhYWFhYWFhYWFhYWFxuICovXG5cbnZhciBieXRlVG9IZXggPSBbXTtcblxuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICBieXRlVG9IZXgucHVzaCgoaSArIDB4MTAwKS50b1N0cmluZygxNikuc3Vic3RyKDEpKTtcbn1cblxuZnVuY3Rpb24gc3RyaW5naWZ5KGFycikge1xuICB2YXIgb2Zmc2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzWzFdICE9PSB1bmRlZmluZWQgPyBhcmd1bWVudHNbMV0gOiAwO1xuICAvLyBOb3RlOiBCZSBjYXJlZnVsIGVkaXRpbmcgdGhpcyBjb2RlISAgSXQncyBiZWVuIHR1bmVkIGZvciBwZXJmb3JtYW5jZVxuICAvLyBhbmQgd29ya3MgaW4gd2F5cyB5b3UgbWF5IG5vdCBleHBlY3QuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdXVpZGpzL3V1aWQvcHVsbC80MzRcbiAgdmFyIHV1aWQgPSAoYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDFdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgMl1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyAzXV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDRdXSArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgNV1dICsgJy0nICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA2XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDddXSArICctJyArIGJ5dGVUb0hleFthcnJbb2Zmc2V0ICsgOF1dICsgYnl0ZVRvSGV4W2FycltvZmZzZXQgKyA5XV0gKyAnLScgKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEwXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDExXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEyXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDEzXV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE0XV0gKyBieXRlVG9IZXhbYXJyW29mZnNldCArIDE1XV0pLnRvTG93ZXJDYXNlKCk7IC8vIENvbnNpc3RlbmN5IGNoZWNrIGZvciB2YWxpZCBVVUlELiAgSWYgdGhpcyB0aHJvd3MsIGl0J3MgbGlrZWx5IGR1ZSB0byBvbmVcbiAgLy8gb2YgdGhlIGZvbGxvd2luZzpcbiAgLy8gLSBPbmUgb3IgbW9yZSBpbnB1dCBhcnJheSB2YWx1ZXMgZG9uJ3QgbWFwIHRvIGEgaGV4IG9jdGV0IChsZWFkaW5nIHRvXG4gIC8vIFwidW5kZWZpbmVkXCIgaW4gdGhlIHV1aWQpXG4gIC8vIC0gSW52YWxpZCBpbnB1dCB2YWx1ZXMgZm9yIHRoZSBSRkMgYHZlcnNpb25gIG9yIGB2YXJpYW50YCBmaWVsZHNcblxuICBpZiAoIXZhbGlkYXRlKHV1aWQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdTdHJpbmdpZmllZCBVVUlEIGlzIGludmFsaWQnKTtcbiAgfVxuXG4gIHJldHVybiB1dWlkO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzdHJpbmdpZnk7IiwiaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJzsgLy8gKipgdjEoKWAgLSBHZW5lcmF0ZSB0aW1lLWJhc2VkIFVVSUQqKlxuLy9cbi8vIEluc3BpcmVkIGJ5IGh0dHBzOi8vZ2l0aHViLmNvbS9MaW9zSy9VVUlELmpzXG4vLyBhbmQgaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L3V1aWQuaHRtbFxuXG52YXIgX25vZGVJZDtcblxudmFyIF9jbG9ja3NlcTsgLy8gUHJldmlvdXMgdXVpZCBjcmVhdGlvbiB0aW1lXG5cblxudmFyIF9sYXN0TVNlY3MgPSAwO1xudmFyIF9sYXN0TlNlY3MgPSAwOyAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3V1aWRqcy91dWlkIGZvciBBUEkgZGV0YWlsc1xuXG5mdW5jdGlvbiB2MShvcHRpb25zLCBidWYsIG9mZnNldCkge1xuICB2YXIgaSA9IGJ1ZiAmJiBvZmZzZXQgfHwgMDtcbiAgdmFyIGIgPSBidWYgfHwgbmV3IEFycmF5KDE2KTtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBub2RlID0gb3B0aW9ucy5ub2RlIHx8IF9ub2RlSWQ7XG4gIHZhciBjbG9ja3NlcSA9IG9wdGlvbnMuY2xvY2tzZXEgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY2xvY2tzZXEgOiBfY2xvY2tzZXE7IC8vIG5vZGUgYW5kIGNsb2Nrc2VxIG5lZWQgdG8gYmUgaW5pdGlhbGl6ZWQgdG8gcmFuZG9tIHZhbHVlcyBpZiB0aGV5J3JlIG5vdFxuICAvLyBzcGVjaWZpZWQuICBXZSBkbyB0aGlzIGxhemlseSB0byBtaW5pbWl6ZSBpc3N1ZXMgcmVsYXRlZCB0byBpbnN1ZmZpY2llbnRcbiAgLy8gc3lzdGVtIGVudHJvcHkuICBTZWUgIzE4OVxuXG4gIGlmIChub2RlID09IG51bGwgfHwgY2xvY2tzZXEgPT0gbnVsbCkge1xuICAgIHZhciBzZWVkQnl0ZXMgPSBvcHRpb25zLnJhbmRvbSB8fCAob3B0aW9ucy5ybmcgfHwgcm5nKSgpO1xuXG4gICAgaWYgKG5vZGUgPT0gbnVsbCkge1xuICAgICAgLy8gUGVyIDQuNSwgY3JlYXRlIGFuZCA0OC1iaXQgbm9kZSBpZCwgKDQ3IHJhbmRvbSBiaXRzICsgbXVsdGljYXN0IGJpdCA9IDEpXG4gICAgICBub2RlID0gX25vZGVJZCA9IFtzZWVkQnl0ZXNbMF0gfCAweDAxLCBzZWVkQnl0ZXNbMV0sIHNlZWRCeXRlc1syXSwgc2VlZEJ5dGVzWzNdLCBzZWVkQnl0ZXNbNF0sIHNlZWRCeXRlc1s1XV07XG4gICAgfVxuXG4gICAgaWYgKGNsb2Nrc2VxID09IG51bGwpIHtcbiAgICAgIC8vIFBlciA0LjIuMiwgcmFuZG9taXplICgxNCBiaXQpIGNsb2Nrc2VxXG4gICAgICBjbG9ja3NlcSA9IF9jbG9ja3NlcSA9IChzZWVkQnl0ZXNbNl0gPDwgOCB8IHNlZWRCeXRlc1s3XSkgJiAweDNmZmY7XG4gICAgfVxuICB9IC8vIFVVSUQgdGltZXN0YW1wcyBhcmUgMTAwIG5hbm8tc2Vjb25kIHVuaXRzIHNpbmNlIHRoZSBHcmVnb3JpYW4gZXBvY2gsXG4gIC8vICgxNTgyLTEwLTE1IDAwOjAwKS4gIEpTTnVtYmVycyBhcmVuJ3QgcHJlY2lzZSBlbm91Z2ggZm9yIHRoaXMsIHNvXG4gIC8vIHRpbWUgaXMgaGFuZGxlZCBpbnRlcm5hbGx5IGFzICdtc2VjcycgKGludGVnZXIgbWlsbGlzZWNvbmRzKSBhbmQgJ25zZWNzJ1xuICAvLyAoMTAwLW5hbm9zZWNvbmRzIG9mZnNldCBmcm9tIG1zZWNzKSBzaW5jZSB1bml4IGVwb2NoLCAxOTcwLTAxLTAxIDAwOjAwLlxuXG5cbiAgdmFyIG1zZWNzID0gb3B0aW9ucy5tc2VjcyAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5tc2VjcyA6IERhdGUubm93KCk7IC8vIFBlciA0LjIuMS4yLCB1c2UgY291bnQgb2YgdXVpZCdzIGdlbmVyYXRlZCBkdXJpbmcgdGhlIGN1cnJlbnQgY2xvY2tcbiAgLy8gY3ljbGUgdG8gc2ltdWxhdGUgaGlnaGVyIHJlc29sdXRpb24gY2xvY2tcblxuICB2YXIgbnNlY3MgPSBvcHRpb25zLm5zZWNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLm5zZWNzIDogX2xhc3ROU2VjcyArIDE7IC8vIFRpbWUgc2luY2UgbGFzdCB1dWlkIGNyZWF0aW9uIChpbiBtc2VjcylcblxuICB2YXIgZHQgPSBtc2VjcyAtIF9sYXN0TVNlY3MgKyAobnNlY3MgLSBfbGFzdE5TZWNzKSAvIDEwMDAwOyAvLyBQZXIgNC4yLjEuMiwgQnVtcCBjbG9ja3NlcSBvbiBjbG9jayByZWdyZXNzaW9uXG5cbiAgaWYgKGR0IDwgMCAmJiBvcHRpb25zLmNsb2Nrc2VxID09PSB1bmRlZmluZWQpIHtcbiAgICBjbG9ja3NlcSA9IGNsb2Nrc2VxICsgMSAmIDB4M2ZmZjtcbiAgfSAvLyBSZXNldCBuc2VjcyBpZiBjbG9jayByZWdyZXNzZXMgKG5ldyBjbG9ja3NlcSkgb3Igd2UndmUgbW92ZWQgb250byBhIG5ld1xuICAvLyB0aW1lIGludGVydmFsXG5cblxuICBpZiAoKGR0IDwgMCB8fCBtc2VjcyA+IF9sYXN0TVNlY3MpICYmIG9wdGlvbnMubnNlY3MgPT09IHVuZGVmaW5lZCkge1xuICAgIG5zZWNzID0gMDtcbiAgfSAvLyBQZXIgNC4yLjEuMiBUaHJvdyBlcnJvciBpZiB0b28gbWFueSB1dWlkcyBhcmUgcmVxdWVzdGVkXG5cblxuICBpZiAobnNlY3MgPj0gMTAwMDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXCJ1dWlkLnYxKCk6IENhbid0IGNyZWF0ZSBtb3JlIHRoYW4gMTBNIHV1aWRzL3NlY1wiKTtcbiAgfVxuXG4gIF9sYXN0TVNlY3MgPSBtc2VjcztcbiAgX2xhc3ROU2VjcyA9IG5zZWNzO1xuICBfY2xvY2tzZXEgPSBjbG9ja3NlcTsgLy8gUGVyIDQuMS40IC0gQ29udmVydCBmcm9tIHVuaXggZXBvY2ggdG8gR3JlZ29yaWFuIGVwb2NoXG5cbiAgbXNlY3MgKz0gMTIyMTkyOTI4MDAwMDA7IC8vIGB0aW1lX2xvd2BcblxuICB2YXIgdGwgPSAoKG1zZWNzICYgMHhmZmZmZmZmKSAqIDEwMDAwICsgbnNlY3MpICUgMHgxMDAwMDAwMDA7XG4gIGJbaSsrXSA9IHRsID4+PiAyNCAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsID4+PiAxNiAmIDB4ZmY7XG4gIGJbaSsrXSA9IHRsID4+PiA4ICYgMHhmZjtcbiAgYltpKytdID0gdGwgJiAweGZmOyAvLyBgdGltZV9taWRgXG5cbiAgdmFyIHRtaCA9IG1zZWNzIC8gMHgxMDAwMDAwMDAgKiAxMDAwMCAmIDB4ZmZmZmZmZjtcbiAgYltpKytdID0gdG1oID4+PiA4ICYgMHhmZjtcbiAgYltpKytdID0gdG1oICYgMHhmZjsgLy8gYHRpbWVfaGlnaF9hbmRfdmVyc2lvbmBcblxuICBiW2krK10gPSB0bWggPj4+IDI0ICYgMHhmIHwgMHgxMDsgLy8gaW5jbHVkZSB2ZXJzaW9uXG5cbiAgYltpKytdID0gdG1oID4+PiAxNiAmIDB4ZmY7IC8vIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYCAoUGVyIDQuMi4yIC0gaW5jbHVkZSB2YXJpYW50KVxuXG4gIGJbaSsrXSA9IGNsb2Nrc2VxID4+PiA4IHwgMHg4MDsgLy8gYGNsb2NrX3NlcV9sb3dgXG5cbiAgYltpKytdID0gY2xvY2tzZXEgJiAweGZmOyAvLyBgbm9kZWBcblxuICBmb3IgKHZhciBuID0gMDsgbiA8IDY7ICsrbikge1xuICAgIGJbaSArIG5dID0gbm9kZVtuXTtcbiAgfVxuXG4gIHJldHVybiBidWYgfHwgc3RyaW5naWZ5KGIpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2MTsiLCJpbXBvcnQgdjM1IGZyb20gJy4vdjM1LmpzJztcbmltcG9ydCBtZDUgZnJvbSAnLi9tZDUuanMnO1xudmFyIHYzID0gdjM1KCd2MycsIDB4MzAsIG1kNSk7XG5leHBvcnQgZGVmYXVsdCB2MzsiLCJpbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcbmltcG9ydCBwYXJzZSBmcm9tICcuL3BhcnNlLmpzJztcblxuZnVuY3Rpb24gc3RyaW5nVG9CeXRlcyhzdHIpIHtcbiAgc3RyID0gdW5lc2NhcGUoZW5jb2RlVVJJQ29tcG9uZW50KHN0cikpOyAvLyBVVEY4IGVzY2FwZVxuXG4gIHZhciBieXRlcyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgYnl0ZXMucHVzaChzdHIuY2hhckNvZGVBdChpKSk7XG4gIH1cblxuICByZXR1cm4gYnl0ZXM7XG59XG5cbmV4cG9ydCB2YXIgRE5TID0gJzZiYTdiODEwLTlkYWQtMTFkMS04MGI0LTAwYzA0ZmQ0MzBjOCc7XG5leHBvcnQgdmFyIFVSTCA9ICc2YmE3YjgxMS05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gKG5hbWUsIHZlcnNpb24sIGhhc2hmdW5jKSB7XG4gIGZ1bmN0aW9uIGdlbmVyYXRlVVVJRCh2YWx1ZSwgbmFtZXNwYWNlLCBidWYsIG9mZnNldCkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IHN0cmluZ1RvQnl0ZXModmFsdWUpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlID09PSAnc3RyaW5nJykge1xuICAgICAgbmFtZXNwYWNlID0gcGFyc2UobmFtZXNwYWNlKTtcbiAgICB9XG5cbiAgICBpZiAobmFtZXNwYWNlLmxlbmd0aCAhPT0gMTYpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcignTmFtZXNwYWNlIG11c3QgYmUgYXJyYXktbGlrZSAoMTYgaXRlcmFibGUgaW50ZWdlciB2YWx1ZXMsIDAtMjU1KScpO1xuICAgIH0gLy8gQ29tcHV0ZSBoYXNoIG9mIG5hbWVzcGFjZSBhbmQgdmFsdWUsIFBlciA0LjNcbiAgICAvLyBGdXR1cmU6IFVzZSBzcHJlYWQgc3ludGF4IHdoZW4gc3VwcG9ydGVkIG9uIGFsbCBwbGF0Zm9ybXMsIGUuZy4gYGJ5dGVzID1cbiAgICAvLyBoYXNoZnVuYyhbLi4ubmFtZXNwYWNlLCAuLi4gdmFsdWVdKWBcblxuXG4gICAgdmFyIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoMTYgKyB2YWx1ZS5sZW5ndGgpO1xuICAgIGJ5dGVzLnNldChuYW1lc3BhY2UpO1xuICAgIGJ5dGVzLnNldCh2YWx1ZSwgbmFtZXNwYWNlLmxlbmd0aCk7XG4gICAgYnl0ZXMgPSBoYXNoZnVuYyhieXRlcyk7XG4gICAgYnl0ZXNbNl0gPSBieXRlc1s2XSAmIDB4MGYgfCB2ZXJzaW9uO1xuICAgIGJ5dGVzWzhdID0gYnl0ZXNbOF0gJiAweDNmIHwgMHg4MDtcblxuICAgIGlmIChidWYpIHtcbiAgICAgIG9mZnNldCA9IG9mZnNldCB8fCAwO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgICAgYnVmW29mZnNldCArIGldID0gYnl0ZXNbaV07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBidWY7XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmluZ2lmeShieXRlcyk7XG4gIH0gLy8gRnVuY3Rpb24jbmFtZSBpcyBub3Qgc2V0dGFibGUgb24gc29tZSBwbGF0Zm9ybXMgKCMyNzApXG5cblxuICB0cnkge1xuICAgIGdlbmVyYXRlVVVJRC5uYW1lID0gbmFtZTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWVtcHR5XG4gIH0gY2F0Y2ggKGVycikge30gLy8gRm9yIENvbW1vbkpTIGRlZmF1bHQgZXhwb3J0IHN1cHBvcnRcblxuXG4gIGdlbmVyYXRlVVVJRC5ETlMgPSBETlM7XG4gIGdlbmVyYXRlVVVJRC5VUkwgPSBVUkw7XG4gIHJldHVybiBnZW5lcmF0ZVVVSUQ7XG59IiwiaW1wb3J0IHJuZyBmcm9tICcuL3JuZy5qcyc7XG5pbXBvcnQgc3RyaW5naWZ5IGZyb20gJy4vc3RyaW5naWZ5LmpzJztcblxuZnVuY3Rpb24gdjQob3B0aW9ucywgYnVmLCBvZmZzZXQpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIHZhciBybmRzID0gb3B0aW9ucy5yYW5kb20gfHwgKG9wdGlvbnMucm5nIHx8IHJuZykoKTsgLy8gUGVyIDQuNCwgc2V0IGJpdHMgZm9yIHZlcnNpb24gYW5kIGBjbG9ja19zZXFfaGlfYW5kX3Jlc2VydmVkYFxuXG4gIHJuZHNbNl0gPSBybmRzWzZdICYgMHgwZiB8IDB4NDA7XG4gIHJuZHNbOF0gPSBybmRzWzhdICYgMHgzZiB8IDB4ODA7IC8vIENvcHkgYnl0ZXMgdG8gYnVmZmVyLCBpZiBwcm92aWRlZFxuXG4gIGlmIChidWYpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTY7ICsraSkge1xuICAgICAgYnVmW29mZnNldCArIGldID0gcm5kc1tpXTtcbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xuICB9XG5cbiAgcmV0dXJuIHN0cmluZ2lmeShybmRzKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjQ7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgc2hhMSBmcm9tICcuL3NoYTEuanMnO1xudmFyIHY1ID0gdjM1KCd2NScsIDB4NTAsIHNoYTEpO1xuZXhwb3J0IGRlZmF1bHQgdjU7IiwiaW1wb3J0IFJFR0VYIGZyb20gJy4vcmVnZXguanMnO1xuXG5mdW5jdGlvbiB2YWxpZGF0ZSh1dWlkKSB7XG4gIHJldHVybiB0eXBlb2YgdXVpZCA9PT0gJ3N0cmluZycgJiYgUkVHRVgudGVzdCh1dWlkKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdmFsaWRhdGU7IiwiaW1wb3J0IHZhbGlkYXRlIGZyb20gJy4vdmFsaWRhdGUuanMnO1xuXG5mdW5jdGlvbiB2ZXJzaW9uKHV1aWQpIHtcbiAgaWYgKCF2YWxpZGF0ZSh1dWlkKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW52YWxpZCBVVUlEJyk7XG4gIH1cblxuICByZXR1cm4gcGFyc2VJbnQodXVpZC5zdWJzdHIoMTQsIDEpLCAxNik7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZlcnNpb247IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGRlZmluZSBnZXR0ZXIgZnVuY3Rpb25zIGZvciBoYXJtb255IGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uZCA9IChleHBvcnRzLCBkZWZpbml0aW9uKSA9PiB7XG5cdGZvcih2YXIga2V5IGluIGRlZmluaXRpb24pIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZGVmaW5pdGlvbiwga2V5KSAmJiAhX193ZWJwYWNrX3JlcXVpcmVfXy5vKGV4cG9ydHMsIGtleSkpIHtcblx0XHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBrZXksIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBkZWZpbml0aW9uW2tleV0gfSk7XG5cdFx0fVxuXHR9XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ubyA9IChvYmosIHByb3ApID0+IChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSkiLCIvLyBkZWZpbmUgX19lc01vZHVsZSBvbiBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnIgPSAoZXhwb3J0cykgPT4ge1xuXHRpZih0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wudG9TdHJpbmdUYWcpIHtcblx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblx0fVxuXHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xufTsiLCIvKipcbiAqIFRoaXMgaXMgeW91ciBtYWluLiBUaGlzIGlzIHdoZXJlIHlvdSByZS1leHBvcnQgZXZlcnl0aGluZyB5b3Ugd2FudCB0byBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gKlxuICogVGhlIGJ1aWxkIGVuZm9yY2VzIHRoYXQgdGhlIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGlzIGV4cG9ydGVkLlxuICovXG5cbmltcG9ydCB7IEFwaVZlcnNpb24gfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcblxuLy8gRHVlIHRvIHRoZSB3YXkgd2UgY29uZmlndXJlZCB3ZWJwYWNrLCB3ZSBzaG91bGQgYmUgZXhwb3J0aW5nIHRoaW5ncyB3aGljaCB3aWxsIGJlIHVuZGVyXG4vLyBhIGdsb2JhbCB2YXJpYWJsZSBjYWxsZWQgXCJ0YWJsZWF1XCIuIEV4cG9ydCBldmVyeXRoaW5nIHdlIHdhbnQgdG8gYmUgdmlzaWJsZSB1bmRlciB0YWJsZWF1XG4vLyBmcm9tIHRoaXMgZmlsZS5cbmltcG9ydCB7IEV4dGVuc2lvbnNJbXBsIH0gZnJvbSAnLi9FeHRlbnNpb25zQXBpL0ltcGwvRXh0ZW5zaW9uc0ltcGwnO1xuaW1wb3J0IHsgRXh0ZW5zaW9ucyB9IGZyb20gJy4vRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0V4dGVuc2lvbnMnO1xuXG5kZWNsYXJlIGxldCBWRVJTSU9OX0lTX0FMUEhBOiBib29sZWFuO1xuY29uc3QgaXNBbHBoYTogYm9vbGVhbiA9IHR5cGVvZiBWRVJTSU9OX0lTX0FMUEhBICE9PSAndW5kZWZpbmVkJyA/IFZFUlNJT05fSVNfQUxQSEEgOiBmYWxzZTtcblxuZGVjbGFyZSBsZXQgQVBJX1ZFUlNJT05fTlVNQkVSOiBzdHJpbmc7XG5BcGlWZXJzaW9uLlNldFZlcnNpb25OdW1iZXIodHlwZW9mIEFQSV9WRVJTSU9OX05VTUJFUiAhPT0gJ3VuZGVmaW5lZCcgPyBBUElfVkVSU0lPTl9OVU1CRVIgOiAnMC4wLjAnLCBpc0FscGhhKTtcblxuY29uc3QgZXh0ZW5zaW9uSW1wbCA9IG5ldyBFeHRlbnNpb25zSW1wbCgpO1xuZXhwb3J0IGNvbnN0IGV4dGVuc2lvbnMgPSBuZXcgRXh0ZW5zaW9ucyhleHRlbnNpb25JbXBsKTtcblxuLy8gRXhwb3J0IEVudW1zXG4vLyBUaGVzZSBzaG93IHVwIHVuZGVyIHRoZSB0YWJsZWF1IG9iamVjdC4gSS5lLiB0YWJsZWF1LkV4dGVuc2lvbkNvbnRleHQuU2VydmVyXG5leHBvcnQge1xuICBBbmFseXRpY3NPYmplY3RUeXBlLFxuICBBbm5vdGF0aW9uVHlwZSxcbiAgQ2xhc3NOYW1lS2V5LFxuICBDb2x1bW5UeXBlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UsXG4gIERhc2hib2FyZE9iamVjdFR5cGUsXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLFxuICBEYXRhVHlwZSxcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRGlhbG9nU3R5bGUsXG4gIEVuY29kaW5nVHlwZSxcbiAgRXJyb3JDb2RlcyxcbiAgRXh0ZW5zaW9uQ29udGV4dCxcbiAgRXh0ZW5zaW9uTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlckRvbWFpblR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24sXG4gIEZpbHRlclR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBNYXJrVHlwZSxcbiAgUGFyYW1ldGVyVmFsdWVUeXBlLFxuICBQZXJpb2RUeXBlLFxuICBRdWlja1RhYmxlQ2FsY1R5cGUsXG4gIFJlbGF0aXZlRGF0ZUZpbHRlck9wdGlvbnMsXG4gIFJlcGxheVNwZWVkVHlwZSxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2VsZWN0T3B0aW9ucyxcbiAgU2hlZXRUeXBlLFxuICBTb3J0RGlyZWN0aW9uLFxuICBUYWJsZWF1RXZlbnRUeXBlLFxuICBUcmVuZExpbmVNb2RlbFR5cGUsXG4gIFZpekltYWdlRW5jb2RpbmdUeXBlLFxuICBWaXpJbWFnZVBhbGV0dGVUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nQWxpZ25tZW50VHlwZSxcbiAgVml6SW1hZ2VTaXplU2V0dGluZ1R5cGUsXG4gIFZpekltYWdlU29ydERpcmVjdGlvblR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbiJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ== \ No newline at end of file +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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NEIsQ0FBQyxRQUFRLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxRQUFRO0lBQzlFLENBQUMsK0NBQTRCLENBQUMsR0FBRyxDQUFDLEVBQUUsK0NBQTRCLENBQUMsR0FBRztJQUNwRSxDQUFDLCtDQUE0QixDQUFDLEdBQUcsQ0FBQyxFQUFFLCtDQUE0QixDQUFDLEdBQUc7SUFDcEUsQ0FBQywrQ0FBNEIsQ0FBQyxNQUFNLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxNQUFNO0lBQzFFLENBQUMsK0NBQTRCLENBQUMsR0FBRyxDQUFDLEVBQUUsK0NBQTRCLENBQUMsR0FBRztJQUNwRSxDQUFDLCtDQUE0QixDQUFDLE1BQU0sQ0FBQyxFQUFFLCtDQUE0QixDQUFDLE1BQU07SUFDMUUsQ0FBQywrQ0FBNEIsQ0FBQyxTQUFTLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxTQUFTO0lBQ2hGLENBQUMsK0NBQTRCLENBQUMsSUFBSSxDQUFDLEVBQUUsK0NBQTRCLENBQUMsSUFBSTtJQUN0RSxDQUFDLCtDQUE0QixDQUFDLEdBQUcsQ0FBQyxFQUFFLCtDQUE0QixDQUFDLEdBQUc7SUFDcEUsQ0FBQywrQ0FBNEIsQ0FBQyxNQUFNLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxNQUFNO0lBQzFFLENBQUMsK0NBQTRCLENBQUMsTUFBTSxDQUFDLEVBQUUsK0NBQTRCLENBQUMsTUFBTTtJQUMxRSxDQUFDLCtDQUE0QixDQUFDLE1BQU0sQ0FBQyxFQUFFLCtDQUE0QixDQUFDLE1BQU07SUFDMUUsQ0FBQywrQ0FBNEIsQ0FBQyxRQUFRLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxRQUFRO0lBQzlFLENBQUMsK0NBQTRCLENBQUMsS0FBSyxDQUFDLEVBQUUsK0NBQTRCLENBQUMsS0FBSztJQUN4RSxDQUFDLCtDQUE0QixDQUFDLE1BQU0sQ0FBQyxFQUFFLCtDQUE0QixDQUFDLE1BQU07SUFDMUUsQ0FBQywrQ0FBNEIsQ0FBQyxHQUFHLENBQUMsRUFBRSwrQ0FBNEIsQ0FBQyxHQUFHO0lBQ3BFLENBQUMsK0NBQTRCLENBQUMsUUFBUSxDQUFDLEVB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SUFBYTtBQUNiLG1JQUFXO0FBQ1gscUlBQVk7QUFDWixpSUFBVTtBQUNWLCtJQUFpQjtBQUNqQiw2SUFBZ0I7QUFDaEIsdUlBQWE7QUFDYixxSkFBb0I7QUFDcEIsdUlBQWE7QUFDYiw2SUFBZ0I7QUFDaEIsNklBQWdCO0FBQ2hCLGlJQUFVO0FBQ1YsNklBQWdCO0FBQ2hCLDJLQUErQjtBQUMvQiwySkFBdUI7QUFDdkIsNkhBQVE7QUFDUixpSkFBa0I7QUFDbEIsaUlBQVU7QUFDVixpSkFBa0I7QUFFbEIsMklBQWU7QUFDZixtSkFBbUI7QUFDbkIsdUlBQWE7QUFDYiwrSEFBUztBQUNULHVJQUFhO0FBQ2IsNklBQWdCO0FBQ2hCLGlKQUFrQjtBQUNsQixxSkFBb0I7QUFDcEIsbUpBQW1CO0FBQ25CLDZLQUFnQztBQUNoQywySkFBdUI7QUFDdkIsK0pBQXlCO0FBQ3pCLGlKQUFrQiIsInNvdXJjZXMiOlsid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL2d1aWQvZ3VpZC5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvaW5kZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL21kNS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvbmlsLmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci9wYXJzZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvcmVnZXguanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3JuZy5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc2hhMS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvc3RyaW5naWZ5LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92MS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjMuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3YzNS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdjQuanMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi8uLi9ub2RlX21vZHVsZXMvdXVpZC9kaXN0L2VzbS1icm93c2VyL3Y1LmpzIiwid2VicGFjazovL3RhYmxlYXUvLi4vLi4vbm9kZV9tb2R1bGVzL3V1aWQvZGlzdC9lc20tYnJvd3Nlci92YWxpZGF0ZS5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uLy4uL25vZGVfbW9kdWxlcy91dWlkL2Rpc3QvZXNtLWJyb3dzZXIvdmVyc2lvbi5qcyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRW1iZWRkaW5nQXBpRXh0ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZW5zaW9uc0FwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0Fza0RhdGFJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvUHVsc2VJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9UYWJsZWF1RXJyb3IudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1ZpekludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1ZpelFMRGF0YVNlcnZpY2VJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9XZWJDb21wb25lbnRJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvRXZlbnRJbnRlcmZhY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1RhYmxlYXUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9OYW1lc3BhY2VzL1VJLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvUGFyYW1ldGVySW50ZXJmYWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL1RhYmxlYXVFcnJvci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvQW5ub3RhdGlvbkludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0RhdGFTb3VyY2VJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9EYXRhVGFibGVJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9FbnVtcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvRW52aXJvbm1lbnRJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9GaWx0ZXJJbnRlcmZhY2VzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL3NyYy9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL1NlbGVjdGlvbkludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL1NoZWV0SW50ZXJmYWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1leHRlcm5hbC1jb250cmFjdC1qcy9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvVmlzdWFsTW9kZWxJbnRlcmZhY2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL1dvcmtib29rRm9ybWF0dGluZ0ludGVyZmFjZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMvc3JjL1NoYXJlZEFwaUV4dGVybmFsQ29udHJhY3QudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL0pzQXBpSW50ZXJuYWxDb250cmFjdC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvY29udHJhY3QvRGF0YVR5cGVDb252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L0VudW1zLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9jb250cmFjdC9Nb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L05vdGlmaWNhdGlvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L1BhcmFtZXRlcnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL2NvbnRyYWN0L1ZlcmJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9pbnRlcmZhY2UvQXNrRGF0YUludGVyZmFjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL0ludGVybmFsQXBpRGlzcGF0Y2hlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL1B1bHNlSW50ZXJmYWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9pbnRlcmZhY2UvVmVyc2lvbk51bWJlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvaW50ZXJmYWNlL1ZxbEludGVyZmFjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvbWVzc2FnaW5nL0Nyb3NzRnJhbWVNZXNzZW5nZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9Dcm9zc0ZyYW1lUHJlcGFyZWRNZXNzYWdlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvTWVzc2FnZVR5cGVDaGVja3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZUxpc3RlbmVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VUeXBlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzZW5nZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL21lc3NhZ2luZy9pbnRlcmZhY2UvUHJlcGFyZWRNZXNzYWdlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLWludGVybmFsLWNvbnRyYWN0LWpzL3NyYy92ZXJzaW9uaW5nL0lkZW50aXR5VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9TdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvVmVyc2lvbkNvbnZlcnRlckZhY3RvcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktaW50ZXJuYWwtY29udHJhY3QtanMvc3JjL3ZlcnNpb25pbmcvVmVyc2lvblRyYW5zbGF0aW9ucy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlci50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcy9zcmMvdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0FwaVZlcnNpb24udHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ29ubmVjdGlvblN1bW1hcnkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvQ3Jvc3NGcmFtZS9Dcm9zc0ZyYW1lQm9vdHN0cmFwLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0Nyb3NzRnJhbWUvQ3Jvc3NGcmFtZURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRGF0YVNvdXJjZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRXZlbnRMaXN0ZW5lck1hbmFnZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvRmllbGQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9DdXN0b21WaWV3SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9EYXNoYm9hcmRPYmplY3RJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9GaWVsZEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9QYXJhbWV0ZXJJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL0ltcGwvU2hlZXRJbmZvSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvSW1wbC9TdG9yeVBvaW50SW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbmZvSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1dvcmtib29rSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTG9naWNhbFRhYmxlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9BY2Nlc3NpYmlsaXR5TW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL01vZGVscy9GaWx0ZXJNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0dldERhdGFNb2RlbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvTW9kZWxzL0dldERhdGFUYWJsZVJlYWRlck1vZGVscy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9Nb2RlbHMvU2VsZWN0aW9uTW9kZWxzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1BvaW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL1JlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvQW5pbWF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Bbm5vdGF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9DbGllbnRJbmZvU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9EYXRhU291cmNlU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9FeHBvcnRTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0ZpbHRlclNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvR2V0RGF0YVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9Ob3RpZmljYXRpb25TZXJ2aWNlSW1wbEJhc2UudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9QYXJhbWV0ZXJzU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvU2VydmljZXMvaW1wbC9TZWxlY3Rpb25TZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1N0b3J5QWN0aXZhdGlvblNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvVmlzdWFsTW9kZWxTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1ZpelNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvWm9uZVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1RhYmxlU3VtbWFyeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9UYWJsZWF1RXJyb3IudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvRGF0YVZhbHVlRmFjdG9yeS50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9EZWZlcnJlZC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9FbnVtQ29udmVydGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4uL2FwaS1zaGFyZWQtanMvc3JjL0FwaVNoYXJlZC9VdGlscy9FeHBvcnRIZWxwZXJzLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL1BhcmFtLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1V0aWxzL1NoZWV0VXRpbHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9BcGlTaGFyZWQvVXRpbHMvU2hvcnRMaXZlZERlZmVycmVkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi4vYXBpLXNoYXJlZC1qcy9zcmMvQXBpU2hhcmVkL1ZlcnNpb25OdW1iZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uLi9hcGktc2hhcmVkLWpzL3NyYy9WZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9GaWx0ZXJDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9NYXJrc1NlbGVjdGVkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9QYXJhbWV0ZXJDaGFuZ2VkRXZlbnQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0V2ZW50cy9TdW1tYXJ5RGF0YUNoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1RhYmxlYXVFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvRXZlbnRzL1RhYmxlYXVTaGVldEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvVGFibGVhdVdvcmtzaGVldEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9FdmVudHMvV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9CZW50b25TYW5zRm9udE5hbWVDb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvQ29ubmVjdGVkU2VydmVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbldvcmtib29rSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9FeHRlbnNpb25zSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvSW1wbC9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvU2V0dGluZ3NJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9JbXBsL1RhYmxlYXVCb29rRm9udE5hbWVDb25zdGFudHMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL0ltcGwvVUlJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvRGFzaGJvYXJkLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvRGFzaGJvYXJkT2JqZWN0LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvUGFyYW1ldGVyLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9Nb2RlbHMvU2hlZXQudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL01vZGVscy9Xb3JrYm9vay50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTW9kZWxzL1dvcmtzaGVldC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9EYXNoYm9hcmRDb250ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0Vudmlyb25tZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9OYW1lc3BhY2VzL0V4dGVuc2lvbnMudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvU2V0dGluZ3MudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvVUkudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL05hbWVzcGFjZXMvV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9Xb3Jrc2hlZXRDb250ZW50LnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9JbXBsL0luaXRpYWxpemF0aW9uU2VydmljZUltcGwudHMiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpL1NlcnZpY2VzL0ltcGwvU2V0dGluZ3NTZXJ2aWNlSW1wbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvSW1wbC9VSVNlcnZpY2VJbXBsLnRzIiwid2VicGFjazovL3RhYmxlYXUvLi9zcmMvRXh0ZW5zaW9uc0FwaS9TZXJ2aWNlcy9SZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcy50cyIsIndlYnBhY2s6Ly90YWJsZWF1Ly4vc3JjL0V4dGVuc2lvbnNBcGkvU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbC50cyIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svYm9vdHN0cmFwIiwid2VicGFjazovL3RhYmxlYXUvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL3RhYmxlYXUvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly90YWJsZWF1L3dlYnBhY2svcnVudGltZS9tYWtlIG5hbWVzcGFjZSBvYmplY3QiLCJ3ZWJwYWNrOi8vdGFibGVhdS8uL3NyYy9FeHRlbnNpb25zQXBpLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbiAoKSB7XG4gIHZhciB2YWxpZGF0b3IgPSBuZXcgUmVnRXhwKFwiXlthLXowLTldezh9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezR9LVthLXowLTldezEyfSRcIiwgXCJpXCIpO1xuXG4gIGZ1bmN0aW9uIGdlbihjb3VudCkge1xuICAgIHZhciBvdXQgPSBcIlwiO1xuICAgIGZvciAodmFyIGk9MDsgaTxjb3VudDsgaSsrKSB7XG4gICAgICBvdXQgKz0gKCgoMStNYXRoLnJhbmRvbSgpKSoweDEwMDAwKXwwKS50b1N0cmluZygxNikuc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0O1xuICB9XG5cbiAgZnVuY3Rpb24gR3VpZChndWlkKSB7XG4gICAgaWYgKCFndWlkKSB0aHJvdyBuZXcgVHlwZUVycm9yKFwiSW52YWxpZCBhcmd1bWVudDsgYHZhbHVlYCBoYXMgbm8gdmFsdWUuXCIpO1xuICAgICAgXG4gICAgdGhpcy52YWx1ZSA9IEd1aWQuRU1QVFk7XG4gICAgXG4gICAgaWYgKGd1aWQgJiYgZ3VpZCBpbnN0YW5jZW9mIEd1aWQpIHtcbiAgICAgIHRoaXMudmFsdWUgPSBndWlkLnRvU3RyaW5nKCk7XG5cbiAgICB9IGVsc2UgaWYgKGd1aWQgJiYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGd1aWQpID09PSBcIltvYmplY3QgU3RyaW5nXVwiICYmIEd1aWQuaXNHdWlkKGd1aWQpKSB7XG4gICAgICB0aGlzLnZhbHVlID0gZ3VpZDtcbiAgICB9XG4gICAgXG4gICAgdGhpcy5lcXVhbHMgPSBmdW5jdGlvbihvdGhlcikge1xuICAgICAgLy8gQ29tcGFyaW5nIHN0cmluZyBgdmFsdWVgIGFnYWluc3QgcHJvdmlkZWQgYGd1aWRgIHdpbGwgYXV0by1jYWxsXG4gICAgICAvLyB0b1N0cmluZyBvbiBgZ3VpZGAgZm9yIGNvbXBhcmlzb25cbiAgICAgIHJldHVybiBHdWlkLmlzR3VpZChvdGhlcikgJiYgdGhpcy52YWx1ZSA9PSBvdGhlcjtcbiAgICB9O1xuXG4gICAgdGhpcy5pc0VtcHR5ID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdGhpcy52YWx1ZSA9PT0gR3VpZC5FTVBUWTtcbiAgICB9O1xuICAgIFxuICAgIHRoaXMudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gICAgXG4gICAgdGhpcy50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiB0aGlzLnZhbHVlO1xuICAgIH07XG4gIH07XG5cbiAgR3VpZC5FTVBUWSA9IFwiMDAwMDAwMDAtMDAwMC0wMDAwLTAwMDAtMDAwMDAwMDAwMDAwXCI7XG5cbiAgR3VpZC5pc0d1aWQgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZSAmJiAodmFsdWUgaW5zdGFuY2VvZiBHdWlkIHx8IHZhbGlkYXRvci50ZXN0KHZhbHVlLnRvU3RyaW5nKCkpKTtcbiAgfTtcblxuICBHdWlkLmNyZWF0ZSA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBuZXcgR3VpZChbZ2VuKDIpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDEpLCBnZW4oMyldLmpvaW4oXCItXCIpKTtcbiAgfTtcblxuICBHdWlkLnJhdyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBbZ2VuKDIpLCBnZW4oMSksIGdlbigxKSwgZ2VuKDEpLCBnZW4oMyldLmpvaW4oXCItXCIpO1xuICB9O1xuXG4gIGlmKHR5cGVvZiBtb2R1bGUgIT0gJ3VuZGVmaW5lZCcgJiYgbW9kdWxlLmV4cG9ydHMpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IEd1aWQ7XG4gIH1cbiAgZWxzZSBpZiAodHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJykge1xuICAgIHdpbmRvdy5HdWlkID0gR3VpZDtcbiAgfVxufSkoKTtcbiIsImV4cG9ydCB7IGRlZmF1bHQgYXMgdjEgfSBmcm9tICcuL3YxLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjMgfSBmcm9tICcuL3YzLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjQgfSBmcm9tICcuL3Y0LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdjUgfSBmcm9tICcuL3Y1LmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgTklMIH0gZnJvbSAnLi9uaWwuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgdmFsaWRhdGUgfSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcbmV4cG9ydCB7IGRlZmF1bHQgYXMgc3RyaW5naWZ5IH0gZnJvbSAnLi9zdHJpbmdpZnkuanMnO1xuZXhwb3J0IHsgZGVmYXVsdCBhcyBwYXJzZSB9IGZyb20gJy4vcGFyc2UuanMnOyIsIi8qXG4gKiBCcm93c2VyLWNvbXBhdGlibGUgSmF2YVNjcmlwdCBNRDVcbiAqXG4gKiBNb2RpZmljYXRpb24gb2YgSmF2YVNjcmlwdCBNRDVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9ibHVlaW1wL0phdmFTY3JpcHQtTUQ1XG4gKlxuICogQ29weXJpZ2h0IDIwMTEsIFNlYmFzdGlhbiBUc2NoYW5cbiAqIGh0dHBzOi8vYmx1ZWltcC5uZXRcbiAqXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2U6XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVFxuICpcbiAqIEJhc2VkIG9uXG4gKiBBIEphdmFTY3JpcHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuIE1ENSBNZXNzYWdlXG4gKiBEaWdlc3QgQWxnb3JpdGhtLCBhcyBkZWZpbmVkIGluIFJGQyAxMzIxLlxuICogVmVyc2lvbiAyLjIgQ29weXJpZ2h0IChDKSBQYXVsIEpvaG5zdG9uIDE5OTkgLSAyMDA5XG4gKiBPdGhlciBjb250cmlidXRvcnM6IEdyZWcgSG9sdCwgQW5kcmV3IEtlcGVydCwgWWRuYXIsIExvc3RpbmV0XG4gKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQlNEIExpY2Vuc2VcbiAqIFNlZSBodHRwOi8vcGFqaG9tZS5vcmcudWsvY3J5cHQvbWQ1IGZvciBtb3JlIGluZm8uXG4gKi9cbmZ1bmN0aW9uIG1kNShieXRlcykge1xuICBpZiAodHlwZW9mIGJ5dGVzID09PSAnc3RyaW5nJykge1xuICAgIHZhciBtc2cgPSB1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoYnl0ZXMpKTsgLy8gVVRGOCBlc2NhcGVcblxuICAgIGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkobXNnLmxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1zZy5sZW5ndGg7ICsraSkge1xuICAgICAgYnl0ZXNbaV0gPSBtc2cuY2hhckNvZGVBdChpKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWQ1VG9IZXhFbmNvZGVkQXJyYXkod29yZHNUb01kNShieXRlc1RvV29yZHMoYnl0ZXMpLCBieXRlcy5sZW5ndGggKiA4KSk7XG59XG4vKlxuICogQ29udmVydCBhbiBhcnJheSBvZiBsaXR0bGUtZW5kaWFuIHdvcmRzIHRvIGFuIGFycmF5IG9mIGJ5dGVzXG4gKi9cblxuXG5mdW5jdGlvbiBtZDVUb0hleEVuY29kZWRBcnJheShpbnB1dCkge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIHZhciBsZW5ndGgzMiA9IGlucHV0Lmxlbmd0aCAqIDMyO1xuICB2YXIgaGV4VGFiID0gJzAxMjM0NTY3ODlhYmNkZWYnO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoMzI7IGkgKz0gOCkge1xuICAgIHZhciB4ID0gaW5wdXRbaSA+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+Pj4gOCB8IDB4ODA7IC8vIGBjbG9ja19zZXFfbG93YFxuXG4gIGJbaSsrXSA9IGNsb2Nrc2VxICYgMHhmZjsgLy8gYG5vZGVgXG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCA2OyArK24pIHtcbiAgICBiW2kgKyBuXSA9IG5vZGVbbl07XG4gIH1cblxuICByZXR1cm4gYnVmIHx8IHN0cmluZ2lmeShiKTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdjE7IiwiaW1wb3J0IHYzNSBmcm9tICcuL3YzNS5qcyc7XG5pbXBvcnQgbWQ1IGZyb20gJy4vbWQ1LmpzJztcbnZhciB2MyA9IHYzNSgndjMnLCAweDMwLCBtZDUpO1xuZXhwb3J0IGRlZmF1bHQgdjM7IiwiaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5pbXBvcnQgcGFyc2UgZnJvbSAnLi9wYXJzZS5qcyc7XG5cbmZ1bmN0aW9uIHN0cmluZ1RvQnl0ZXMoc3RyKSB7XG4gIHN0ciA9IHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChzdHIpKTsgLy8gVVRGOCBlc2NhcGVcblxuICB2YXIgYnl0ZXMgPSBbXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGJ5dGVzLnB1c2goc3RyLmNoYXJDb2RlQXQoaSkpO1xuICB9XG5cbiAgcmV0dXJuIGJ5dGVzO1xufVxuXG5leHBvcnQgdmFyIEROUyA9ICc2YmE3YjgxMC05ZGFkLTExZDEtODBiNC0wMGMwNGZkNDMwYzgnO1xuZXhwb3J0IHZhciBVUkwgPSAnNmJhN2I4MTEtOWRhZC0xMWQxLTgwYjQtMDBjMDRmZDQzMGM4JztcbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIChuYW1lLCB2ZXJzaW9uLCBoYXNoZnVuYykge1xuICBmdW5jdGlvbiBnZW5lcmF0ZVVVSUQodmFsdWUsIG5hbWVzcGFjZSwgYnVmLCBvZmZzZXQpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgdmFsdWUgPSBzdHJpbmdUb0J5dGVzKHZhbHVlKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG5hbWVzcGFjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIG5hbWVzcGFjZSA9IHBhcnNlKG5hbWVzcGFjZSk7XG4gICAgfVxuXG4gICAgaWYgKG5hbWVzcGFjZS5sZW5ndGggIT09IDE2KSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ05hbWVzcGFjZSBtdXN0IGJlIGFycmF5LWxpa2UgKDE2IGl0ZXJhYmxlIGludGVnZXIgdmFsdWVzLCAwLTI1NSknKTtcbiAgICB9IC8vIENvbXB1dGUgaGFzaCBvZiBuYW1lc3BhY2UgYW5kIHZhbHVlLCBQZXIgNC4zXG4gICAgLy8gRnV0dXJlOiBVc2Ugc3ByZWFkIHN5bnRheCB3aGVuIHN1cHBvcnRlZCBvbiBhbGwgcGxhdGZvcm1zLCBlLmcuIGBieXRlcyA9XG4gICAgLy8gaGFzaGZ1bmMoWy4uLm5hbWVzcGFjZSwgLi4uIHZhbHVlXSlgXG5cblxuICAgIHZhciBieXRlcyA9IG5ldyBVaW50OEFycmF5KDE2ICsgdmFsdWUubGVuZ3RoKTtcbiAgICBieXRlcy5zZXQobmFtZXNwYWNlKTtcbiAgICBieXRlcy5zZXQodmFsdWUsIG5hbWVzcGFjZS5sZW5ndGgpO1xuICAgIGJ5dGVzID0gaGFzaGZ1bmMoYnl0ZXMpO1xuICAgIGJ5dGVzWzZdID0gYnl0ZXNbNl0gJiAweDBmIHwgdmVyc2lvbjtcbiAgICBieXRlc1s4XSA9IGJ5dGVzWzhdICYgMHgzZiB8IDB4ODA7XG5cbiAgICBpZiAoYnVmKSB7XG4gICAgICBvZmZzZXQgPSBvZmZzZXQgfHwgMDtcblxuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxNjsgKytpKSB7XG4gICAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IGJ5dGVzW2ldO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYnVmO1xuICAgIH1cblxuICAgIHJldHVybiBzdHJpbmdpZnkoYnl0ZXMpO1xuICB9IC8vIEZ1bmN0aW9uI25hbWUgaXMgbm90IHNldHRhYmxlIG9uIHNvbWUgcGxhdGZvcm1zICgjMjcwKVxuXG5cbiAgdHJ5IHtcbiAgICBnZW5lcmF0ZVVVSUQubmFtZSA9IG5hbWU7IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1lbXB0eVxuICB9IGNhdGNoIChlcnIpIHt9IC8vIEZvciBDb21tb25KUyBkZWZhdWx0IGV4cG9ydCBzdXBwb3J0XG5cblxuICBnZW5lcmF0ZVVVSUQuRE5TID0gRE5TO1xuICBnZW5lcmF0ZVVVSUQuVVJMID0gVVJMO1xuICByZXR1cm4gZ2VuZXJhdGVVVUlEO1xufSIsImltcG9ydCBybmcgZnJvbSAnLi9ybmcuanMnO1xuaW1wb3J0IHN0cmluZ2lmeSBmcm9tICcuL3N0cmluZ2lmeS5qcyc7XG5cbmZ1bmN0aW9uIHY0KG9wdGlvbnMsIGJ1Ziwgb2Zmc2V0KSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICB2YXIgcm5kcyA9IG9wdGlvbnMucmFuZG9tIHx8IChvcHRpb25zLnJuZyB8fCBybmcpKCk7IC8vIFBlciA0LjQsIHNldCBiaXRzIGZvciB2ZXJzaW9uIGFuZCBgY2xvY2tfc2VxX2hpX2FuZF9yZXNlcnZlZGBcblxuICBybmRzWzZdID0gcm5kc1s2XSAmIDB4MGYgfCAweDQwO1xuICBybmRzWzhdID0gcm5kc1s4XSAmIDB4M2YgfCAweDgwOyAvLyBDb3B5IGJ5dGVzIHRvIGJ1ZmZlciwgaWYgcHJvdmlkZWRcblxuICBpZiAoYnVmKSB7XG4gICAgb2Zmc2V0ID0gb2Zmc2V0IHx8IDA7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE2OyArK2kpIHtcbiAgICAgIGJ1ZltvZmZzZXQgKyBpXSA9IHJuZHNbaV07XG4gICAgfVxuXG4gICAgcmV0dXJuIGJ1ZjtcbiAgfVxuXG4gIHJldHVybiBzdHJpbmdpZnkocm5kcyk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHY0OyIsImltcG9ydCB2MzUgZnJvbSAnLi92MzUuanMnO1xuaW1wb3J0IHNoYTEgZnJvbSAnLi9zaGExLmpzJztcbnZhciB2NSA9IHYzNSgndjUnLCAweDUwLCBzaGExKTtcbmV4cG9ydCBkZWZhdWx0IHY1OyIsImltcG9ydCBSRUdFWCBmcm9tICcuL3JlZ2V4LmpzJztcblxuZnVuY3Rpb24gdmFsaWRhdGUodXVpZCkge1xuICByZXR1cm4gdHlwZW9mIHV1aWQgPT09ICdzdHJpbmcnICYmIFJFR0VYLnRlc3QodXVpZCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHZhbGlkYXRlOyIsImltcG9ydCB2YWxpZGF0ZSBmcm9tICcuL3ZhbGlkYXRlLmpzJztcblxuZnVuY3Rpb24gdmVyc2lvbih1dWlkKSB7XG4gIGlmICghdmFsaWRhdGUodXVpZCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ0ludmFsaWQgVVVJRCcpO1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlSW50KHV1aWQuc3Vic3RyKDE0LCAxKSwgMTYpO1xufVxuXG5leHBvcnQgZGVmYXVsdCB2ZXJzaW9uOyIsIi8vIFRoaXMgZmlsZSByZS1leHBvcnRzIGV2ZXJ5dGhpbmcgd2hpY2ggaXMgcGFydCBvZiB0aGUgZXh0ZW5zaW9ucyBhcGkgcHVibGljIGludGVyZmFjZVxuXG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL0Fza0RhdGFJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIEFwaU1lbnVUeXBlLFxuICBDcm9zc3RhYkZpbGVGb3JtYXQsXG4gIERldmljZVR5cGUsXG4gIEVtYmVkZGluZ0Vycm9yQ29kZXMsXG4gIFRhYmxlYXVFdmVudFR5cGUgYXMgRW1iZWRkaW5nVGFibGVhdUV2ZW50VHlwZSxcbiAgUHJpbnRPcmllbnRhdGlvbixcbiAgUHJpbnRQYWdlU2l6ZSxcbiAgUHJpbnRTY2FsaW5nLFxuICBQdWxzZUVycm9yTWVzc2FnZVZpc2liaWxpdHksXG4gIFB1bHNlTGF5b3V0LFxuICBQdWxzZVRpbWVEaW1lbnNpb24sXG4gIFNoZWV0U2l6ZUJlaGF2aW9yLFxuICBUYWJsZWF1RGlhbG9nVHlwZSxcbiAgVG9vbGJhcixcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9FbnVtcyc7XG5leHBvcnQge1xuICBDdXN0b21WaWV3RXZlbnQsXG4gIEN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50IGFzIEVtYmVkZGluZ0N1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50LFxuICBGaWx0ZXJDaGFuZ2VkRXZlbnQgYXMgRW1iZWRkaW5nRmlsdGVyQ2hhbmdlZEV2ZW50LFxuICBNYXJrc1NlbGVjdGVkRXZlbnQgYXMgRW1iZWRkaW5nTWFya1NlbGVjdGVkRXZlbnQsXG4gIFBhcmFtZXRlckNoYW5nZWRFdmVudCBhcyBFbWJlZGRpbmdQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQsXG4gIFN1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50IGFzIEVtYmVkZGluZ1N1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50LFxuICBUYWJsZWF1U2hlZXRFdmVudCBhcyBFbWJlZGRpbmdUYWJsZWF1U2hlZXRFdmVudCxcbiAgVGFibGVhdVdvcmtzaGVldEV2ZW50IGFzIEVtYmVkZGluZ1RhYmxlYXVXb3Jrc2hlZXRFdmVudCxcbiAgVG9vbGJhclN0YXRlQ2hhbmdlZEV2ZW50IGFzIEVtYmVkZGluZ1Rvb2xiYXJTdGF0ZUNoYW5nZWRFdmVudCxcbiAgRmlyc3RQdWxzZU1ldHJpY1NpemVLbm93bkV2ZW50LFxuICBGaXJzdFZpelNpemVLbm93bkV2ZW50LFxuICBQdWxzZUVycm9yRXZlbnQsXG4gIFB1bHNlRmlsdGVyc0NoYW5nZWRFdmVudCxcbiAgUHVsc2VJbnNpZ2h0RGlzY292ZXJlZEV2ZW50LFxuICBQdWxzZU1ldHJpY1NpemVDaGFuZ2VkRXZlbnQsXG4gIFB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWRFdmVudCxcbiAgUHVsc2VVcmxDaGFuZ2VkRXZlbnQsXG4gIFN0b3J5UG9pbnRTd2l0Y2hlZEV2ZW50LFxuICBUYWJTd2l0Y2hlZEV2ZW50LFxuICBVcmxBY3Rpb25FdmVudCxcbiAgVml6TG9hZEVycm9yRXZlbnQsXG4gIFdvcmtib29rUHVibGlzaGVkQXNFdmVudCxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0VtYmVkZGluZy9FdmVudEludGVyZmFjZXMnO1xuZXhwb3J0IHsgUGFyYW1ldGVyIGFzIEVtYmVkZGluZ1BhcmFtZXRlciB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvUGFyYW1ldGVySW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1B1bHNlSW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBDb250ZXh0TWVudU9wdGlvbnMsXG4gIEVtYmVkZGluZ0Fic3RyYWN0UXVlcnksXG4gIEF1dGhvcmluZ1dvcmtzaGVldCBhcyBFbWJlZGRpbmdBdXRob3JpbmdXb3Jrc2hlZXQsXG4gIERhc2hib2FyZCBhcyBFbWJlZGRpbmdEYXNoYm9hcmQsXG4gIERhc2hib2FyZE9iamVjdCBhcyBFbWJlZGRpbmdEYXNoYm9hcmRPYmplY3QsXG4gIFNoZWV0IGFzIEVtYmVkZGluZ1NoZWV0LFxuICBFbWJlZGRpbmdWaXpTdGF0ZVdpdGhEYXRhTW9kZWwsXG4gIFdvcmtzaGVldCBhcyBFbWJlZGRpbmdXb3Jrc2hlZXQsXG4gIEhpZXJhcmNoaWNhbExldmVscyxcbiAgU2hlZXRJbmZvLFxuICBTaGVldFNpemUsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvU2hlZXRJbnRlcmZhY2VzJztcbmV4cG9ydCB7IFN0b3J5LCBTdG9yeVBvaW50LCBTdG9yeVBvaW50SW5mbyB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvU3RvcnlJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvVGFibGVhdUVycm9yJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvVml6SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRW1iZWRkaW5nL1ZpelFMRGF0YVNlcnZpY2VJbnRlcmZhY2VzJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvV2ViQ29tcG9uZW50SW50ZXJmYWNlcyc7XG5leHBvcnQge1xuICBDdXN0b21WaWV3LFxuICBBdXRob3JpbmdXb3JrYm9vayBhcyBFbWJlZGRpbmdBdXRob3JpbmdXb3JrYm9vayxcbiAgV29ya2Jvb2sgYXMgRW1iZWRkaW5nV29ya2Jvb2ssXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FbWJlZGRpbmcvV29ya2Jvb2tJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9TaGFyZWRBcGlFeHRlcm5hbENvbnRyYWN0JztcbiIsIi8vIFRoaXMgZmlsZSByZS1leHBvcnRzIGV2ZXJ5dGhpbmcgd2hpY2ggaXMgcGFydCBvZiB0aGUgZXh0ZW5zaW9ucyBhcGkgcHVibGljIGludGVyZmFjZVxuXG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9FdmVudEludGVyZmFjZSc7XG5leHBvcnQgeyBEYXNoYm9hcmRDb250ZW50IH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9EYXNoYm9hcmRDb250ZW50JztcbmV4cG9ydCB7IEVudmlyb25tZW50IH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9FbnZpcm9ubWVudCc7XG5leHBvcnQgeyBFeHRlbnNpb25zIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9FeHRlbnNpb25zJztcbmV4cG9ydCB7IFNldHRpbmdzIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9TZXR0aW5ncyc7XG5leHBvcnQge1xuICBFcnJvckNvZGVzLFxuICBFeHBvcnRlZE1lZGlhVHlwZSxcbiAgRXh0ZW5zaW9uQ29udGV4dCxcbiAgRXh0ZW5zaW9uTW9kZSxcbiAgVGFibGVhdUV2ZW50VHlwZSxcbiAgVml6SW1hZ2VFbmNvZGluZ1R5cGUsXG4gIFZpekltYWdlUGFsZXR0ZVR5cGUsXG4gIFZpekltYWdlU2l6ZVNldHRpbmdBbGlnbm1lbnRUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nVHlwZSxcbiAgVml6SW1hZ2VTb3J0RGlyZWN0aW9uVHlwZSxcbn0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L0V4dGVuc2lvbnMvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvVUknO1xuZXhwb3J0IHsgV29ya3NoZWV0Q29udGVudCB9IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL05hbWVzcGFjZXMvV29ya3NoZWV0Q29udGVudCc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9QYXJhbWV0ZXJJbnRlcmZhY2VzJztcbmV4cG9ydCB7XG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSxcbiAgRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXksXG4gIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlNYXAsXG4gIERhc2hib2FyZCBhcyBFeHRlbnNpb25EYXNoYm9hcmQsXG4gIERhc2hib2FyZE9iamVjdCBhcyBFeHRlbnNpb25EYXNoYm9hcmRPYmplY3QsXG4gIFNoZWV0IGFzIEV4dGVuc2lvblNoZWV0LFxuICBXb3Jrc2hlZXQgYXMgRXh0ZW5zaW9uV29ya3NoZWV0LFxuICBQb2ludCxcbiAgWm9uZVZpc2liaWxpdHlNYXAsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9FeHRlbnNpb25zL1NoZWV0SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9UYWJsZWF1RXJyb3InO1xuZXhwb3J0IHsgV29ya2Jvb2sgYXMgRXh0ZW5zaW9uV29ya2Jvb2sgfSBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvRXh0ZW5zaW9ucy9Xb3JrYm9va0ludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9TaGFyZWRBcGlFeHRlcm5hbENvbnRyYWN0JztcbiIsIi8qKlxuICogVGhpcyBpcyB5b3VyIG1haW4uIFRoaXMgaXMgd2hlcmUgeW91IHJlLWV4cG9ydCBldmVyeXRoaW5nIHlvdSB3YW50IHRvIGJlIHB1YmxpY2x5IGF2YWlsYWJsZS5cbiAqXG4gKiBUaGUgYnVpbGQgZW5mb3JjZXMgdGhhdCB0aGUgZmlsZSBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHRoYXQgaXMgZXhwb3J0ZWQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9FbWJlZGRpbmdBcGlFeHRlcm5hbENvbnRyYWN0JztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZW5zaW9uc0FwaUV4dGVybmFsQ29udHJhY3QnO1xuIiwiaW1wb3J0IHsgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncywgV2ViQ29tcG9uZW50U2V0dGluZ3NTaGFyZWQgfSBmcm9tICcuL1dlYkNvbXBvbmVudEludGVyZmFjZXMnO1xuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS1hc2stZGF0YT4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBlbnVtIEFza0RhdGFBdHRyaWJ1dGVzIHtcbiAgT3JpZ2luID0gJ29yaWdpbicsXG4gIFNob3dFbWJlZCA9ICdzaG93LWVtYmVkJyxcbiAgU2hvd1BpbiA9ICdzaG93LXBpbicsXG4gIFNob3dTYXZlID0gJ3Nob3ctc2F2ZScsXG4gIFNob3dTaGFyZSA9ICdzaG93LXNoYXJlJyxcbn1cblxuLyoqXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFza0RhdGFTZXR0aW5ncyBleHRlbmRzIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkLCBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBlbWJlZCBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgc2hvdy1lbWJlZD5cbiAgICogYGBgXG4gICAqL1xuICBzaG93RW1iZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgcGluIGJ1dHRvbiBpcyBoaWRkZW4gb3IgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBzaG93LXBpbj5cbiAgICogYGBgXG4gICAqL1xuICBzaG93UGluPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHNhdmUgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHNob3ctc2F2ZT5cbiAgICogYGBgXG4gICAqL1xuICBzaG93U2F2ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBzaGFyZSBidXR0b24gaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgc2hvdy1zaGFyZT5cbiAgICogYGBgXG4gICAqL1xuICBzaG93U2hhcmU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiAgVXNlZCBmb3IgdGVsZW1ldHJ5XG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hc2stZGF0YSBpZD1cInRhYmxlYXVBc2tEYXRhXCIgb3JpZ2luPVwiZW1iZWRkaW5nU2l0ZVwiPlxuICAgKiBgYGBcbiAgICovXG4gIG9yaWdpbj86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wIGxldmVsIEFza0RhdGEgb2JqZWN0LlxuICogQGRlcHJlY2F0ZWRcbiAqKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXNrRGF0YSBleHRlbmRzIEFza0RhdGFTZXR0aW5ncyB7fVxuIiwiLy8gQWxsIGVudW0gdmFsdWVzIG1hZGUgYXZhaWxhYmxlIHRvIEVtYmVkZGluZyBkZXZlbG9wZXJzLlxuLy8gRW51bXMgc2hvdWxkIGJlIGtlcHQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLlxuLy8gTW9zdCBvZiB0aGVtIHNob3VsZCBtYXRjaCBhbiBlbnVtIG9uIHRoZSBzZXJ2ZXIgZGVmaW5lZCBhdFxuLy8gd29ya2dyb3VwL3ZxbHdlYi9zY3JpcHRzaGFycC9zcmMvQXBpU2hhcmVkL1B1YmxpY0VudW1zLmNzI0wzOTg6MTdcblxuLyoqXG4gKiBDcm9zc3RhYiBmaWxlIGZvcm1hdHMgYXZhaWxhYmxlIHRvIHVzZSB3aXRoIHtAbGluayBWaXouZXhwb3J0Q3Jvc3N0YWJBc3luY31cbiAqL1xuZXhwb3J0IGVudW0gQ3Jvc3N0YWJGaWxlRm9ybWF0IHtcbiAgQ1NWID0gJ2NzdicsXG4gIEV4Y2VsID0gJ3hsc3gnLFxufVxuXG4vKipcbiAqIERldmljZSB0eXBlcyBhdmFpbGFibGUgdG8gdXNlIHdpdGgge0BsaW5rIFZpei5kZXZpY2V9XG4gKi9cbmV4cG9ydCBlbnVtIERldmljZVR5cGUge1xuICBEZWZhdWx0ID0gJ2RlZmF1bHQnLFxuICBEZXNrdG9wID0gJ2Rlc2t0b3AnLFxuICBUYWJsZXQgPSAndGFibGV0JyxcbiAgUGhvbmUgPSAncGhvbmUnLFxufVxuXG4vKipcbiAqIEFsbCBlcnJvciBjb2RlcyB1c2VkIGJ5IHRoZSBFbWJlZGRpbmcgQVBJLlxuICovXG5leHBvcnQgZW51bSBFbWJlZGRpbmdFcnJvckNvZGVzIHtcbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgcmVxdWVzdCB0byB0aGUgYXV0aCBlbmRwb2ludCBmYWlscy5cbiAgICovXG4gIEF1dGhGYWlsZWQgPSAnYXV0aC1mYWlsZWQnLFxuICAvKipcbiAgICogVGhlIGJyb3dzZXIgaXMgbm90IGNhcGFibGUgb2Ygc3VwcG9ydGluZyB0aGUgVGFibGVhdSBFbWJlZGRpbmcgQVBJXG4gICAqL1xuICBCcm93c2VyTm90Q2FwYWJsZSA9ICdicm93c2VyLW5vdC1jYXBhYmxlJyxcbiAgLyoqXG4gICAqIFRoZSBwZXJtaXNzaW9ucyBvbiBhIHdvcmtib29rIG9yIGEgdmlldyBkbyBub3QgYWxsb3cgZG93bmxvYWRpbmcgdGhlIHdvcmtib29rLlxuICAgKi9cbiAgRG93bmxvYWRXb3JrYm9va05vdEFsbG93ZWQgPSAnZG93bmxvYWQtd29ya2Jvb2stbm90LWFsbG93ZWQnLFxuICAvKipcbiAgICogVGhyb3duIHdoZW4gYW4gZXJyb3Igb2NjdXJzIHdoaWxlIGF0dGVtcHRpbmcgdG8gcGVyZm9ybSBhIGZpbHRlciBvcGVyYXRpb24uXG4gICAqL1xuICBGaWx0ZXJDYW5ub3RCZVBlcmZvcm1lZCA9ICdmaWx0ZXItY2Fubm90LWJlLXBlcmZvcm1lZCcsXG4gIC8qKlxuICAgKiBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHN3aXRjaCB0byBhIHNoZWV0IGJ5IGluZGV4IHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHdvcmtib29rLlxuICAgKi9cbiAgSW5kZXhPdXRPZlJhbmdlID0gJ2luZGV4LW91dC1vZi1yYW5nZScsXG4gIC8qKlxuICAgKiBUaHJvd24gd2hlbiBhbiBlcnJvciBvY2N1cnMgd2l0aGluIHRoZSBUYWJsZWF1IEVtYmVkZGluZyBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBbiBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGN1c3RvbSB2aWV3IHRoYXQgZG9lcyBub3QgZXhpc3QuXG4gICAqL1xuICBJbnZhbGlkQ3VzdG9tVmlld05hbWUgPSAnaW52YWxpZC1jdXN0b20tdmlldy1uYW1lJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgZGF0ZSB3YXMgc3BlY2lmaWVkIGluIGEgbWV0aG9kIHRoYXQgcmVxdWlyZWQgYSBkYXRlIHBhcmFtZXRlci5cbiAgICovXG4gIEludmFsaWREYXRlUGFyYW1ldGVyID0gJ2ludmFsaWQtZGF0ZS1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogRWl0aGVyIGEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgZmllbGQgdGhhdCBkb2VzIG5vdCBleGlzdCBpbiB0aGUgZGF0YSBzb3VyY2UsIG9yIHRoZSB2YWx1ZSBzdXBwbGllZFxuICAgKiBpbiB0aGUgZmlsdGVyIG9wZXJhdGlvbiBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIGludmFsaWRGaWx0ZXJGaWVsZE5hbWVPclZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkLW5hbWUnLFxuICAvKipcbiAgICogQSBwYXJhbWV0ZXIgaXMgbm90IHRoZSBjb3JyZWN0IGRhdGEgdHlwZSBvciBmb3JtYXQuIFRoZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkIGluIHRoZSBFcnJvci5tZXNzYWdlXG4gICAqIGZpZWxkLlxuICAgKi9cbiAgSW52YWxpZFBhcmFtZXRlciA9ICdpbnZhbGlkLXBhcmFtZXRlcicsXG4gIC8qKlxuICAgKiBUaGUgY3VycmVudGx5IGFwcGxpZWQgdGltZSBkaW1lbnNpb24gY291bGQgbm90IGJlIGRldGVybWluZWQgb3IgaXMgaW52YWxpZC5cbiAgICovXG4gIEludmFsaWRUaW1lRGltZW5zaW9uID0gJ2ludmFsaWQtdGltZS1kaW1lbnNpb24nLFxuICAvKipcbiAgICogQSBuZWdhdGl2ZSBzaXplIHdhcyBzcGVjaWZpZWQgb3IgdGhlIG1heFNpemUgdmFsdWUgaXMgbGVzcyB0aGFuIG1pblNpemUgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkuXG4gICAqL1xuICBJbnZhbGlkU2l6ZSA9ICdpbnZhbGlkLXNpemUnLFxuICAvKipcbiAgICogQXR0ZW1wdGVkIHRvIGdldCBhbiBhdXRob3Jpbmcgd29ya3NoZWV0IHdoZW4gdGhlIGN1cnJlbnQgc2hlZXQgaXMgbm90IGEgd29ya3NoZWV0LlxuICAgKiBAaWdub3JlXG4gICAqL1xuICBJbnZhbGlkU2hlZXRUeXBlID0gJ2ludmFsaWQtc2hlZXQtdHlwZScsXG4gIC8qKlxuICAgKiBBIGJlaGF2aW9yIHZhbHVlIHdhcyBmb3VuZCB0aGF0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgU2hlZXRTaXplQmVoYXZpb3IgZW51bS5cbiAgICovXG4gIEludmFsaWRTaXplQmVoYXZpb3IgPSAnaW52YWxpZC1zaXplLWJlaGF2aW9yJyxcbiAgLyoqXG4gICAqIEEgYmVoYXZpb3Igb3RoZXIgdGhhbiBTaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWMgd2FzIHNwZWNpZmllZCBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHRoZSBzaGVldCBpcyBhXG4gICAqIFdvcmtzaGVldCBpbnN0YW5jZS5cbiAgICovXG4gIEludmFsaWRTaXplQmVoYXZpb3JPbldvcmtzaGVldCA9ICdpbnZhbGlkLXNpemUtYmVoYXZpb3Itb24td29ya3NoZWV0JyxcbiAgLyoqXG4gICAqIFRoZSBVUkwgc3BlY2lmaWVkIGluIHRoZSBWaXogY2xhc3MgY29uc3RydWN0b3IgaXMgbm90IHZhbGlkLlxuICAgKi9cbiAgSW52YWxpZFVybCA9ICdpbnZhbGlkLXVybCcsXG4gIC8qKlxuICAgKiBUaGUgbWF4U2l6ZSBmaWVsZCBpcyBtaXNzaW5nIGluIFNoZWV0LmNoYW5nZVNpemVBc3luYygpIHdoZW4gc3BlY2lmeWluZyBTaGVldFNpemVCZWhhdmlvci5BdE1vc3QuXG4gICAqL1xuICBNaXNzaW5nTWF4U2l6ZSA9ICdtaXNzaW5nLW1heC1zaXplJyxcbiAgLyoqXG4gICAqIFRoZSBtaW5TaXplIGZpZWxkIGlzIG1pc3NpbmcgaW4gU2hlZXQuY2hhbmdlU2l6ZUFzeW5jKCkgd2hlbiBzcGVjaWZ5aW5nIFNoZWV0U2l6ZUJlaGF2aW9yLkF0TGVhc3QuXG4gICAqL1xuICBNaXNzaW5nTWluU2l6ZSA9ICdtaXNzaW5nLW1pbi1zaXplJyxcbiAgLyoqXG4gICAqIFRoZSBtaW5TaXplIG9yIG1heFNpemUgZmllbGQgaXMgbWlzc2luZyBpbiBTaGVldC5jaGFuZ2VTaXplQXN5bmMoKSB3aGVuIHNwZWNpZnlpbmcgU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UuXG4gICAqL1xuICBNaXNzaW5nTWluTWF4U2l6ZSA9ICdtaXNzaW5nLW1pbi1tYXgtc2l6ZScsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgaWYgdGhlIGVtYmVkZGluZyBhcHAgaW50ZXJhY3RzIHdpdGggYSBwYXJhbWV0ZXIgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHdvcmtzaGVldC5cbiAgICovXG4gIE1pc3NpbmdQYXJhbWV0ZXIgPSAnbWlzc2luZy1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogVGhlIHJhbmdlTiBmaWVsZCBpcyBtaXNzaW5nIGZvciBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyIG9mIHR5cGUgTEFTVE4gb3IgTkVYVE4uXG4gICAqL1xuICBNaXNzaW5nUmFuZ2VORm9yUmVsYXRpdmVEYXRlRmlsdGVycyA9ICdtaXNzaW5nLXJhbmdlLW4tZm9yLXJlbGF0aXZlLWRhdGUtZmlsdGVycycsXG4gIC8qKlxuICAgKiBBbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGFjY2VzcyBTaGVldC5nZXRVcmwoKSBvbiBhIGhpZGRlbiBzaGVldC4gSGlkZGVuIHNoZWV0cyBkbyBub3QgaGF2ZSBVUkxzLlxuICAgKi9cbiAgTm9VcmxGb3JIaWRkZW5Xb3Jrc2hlZXQgPSAnbm8tdXJsLWZvci1oaWRkZW4td29ya3NoZWV0JyxcbiAgLyoqXG4gICAqIE9uZSBvciBib3RoIG9mIHRoZSBwYXJlbnRFbGVtZW50IG9yIHRoZSBVUkwgcGFyYW1ldGVycyBpcyBub3Qgc3BlY2lmaWVkIGluIHRoZSBWaXogY29uc3RydWN0b3IuXG4gICAqL1xuICBOb1VybE9yUGFyZW50RWxlbWVudE5vdEZvdW5kID0gJ25vLXVybC1vci1wYXJlbnQtZWxlbWVudC1ub3QtZm91bmQnLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBzaGVldCB0aGF0IGlzIG5vdCBhY3RpdmUgb3IgZW1iZWRkZWQgd2l0aGluIHRoZSBhY3RpdmUgZGFzaGJvYXJkLlxuICAgKi9cbiAgTm90QWN0aXZlU2hlZXQgPSAnbm90LWFjdGl2ZS1zaGVldCcsXG4gIC8qKlxuICAgKiBBIHJlcXVpcmVkIHBhcmFtZXRlciB3YXMgbm90IHNwZWNpZmllZCwgbnVsbCwgb3IgYW4gZW1wdHkgc3RyaW5nL2FycmF5LlxuICAgKi9cbiAgTnVsbE9yRW1wdHlQYXJhbWV0ZXIgPSAnbnVsbC1vci1lbXB0eS1wYXJhbWV0ZXInLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIHdhcyBhdHRlbXB0ZWQgb24gYSBzaGVldCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSB3b3JrYm9vay5cbiAgICovXG4gIFNoZWV0Tm90SW5Xb3JrYm9vayA9ICdzaGVldC1ub3QtaW4td29ya2Jvb2snLFxuICAvKipcbiAgICogQW4gb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBvbiBhIEN1c3RvbVZpZXcgb2JqZWN0IHRoYXQgaXMgbm8gbG9uZ2VyIHZhbGlkIChpdCBoYXMgYmVlbiByZW1vdmVkKS5cbiAgICovXG4gIFN0YWxlRGF0YVJlZmVyZW5jZSA9ICdzdGFsZS1kYXRhLXJlZmVyZW5jZScsXG4gIC8qKlxuICAgKiBVbmtub3duIGVycm9yIHRyaWdnZXJlZCBkdXJpbmcgdGhlIGF1dGggZmxvdy5cbiAgICovXG4gIFVua25vd25BdXRoRXJyb3IgPSAndW5rbm93bi1hdXRoLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIFZpei5hZGRFdmVudExpc3RlbmVyIG9yIFZpei5yZW1vdmVFdmVudExpc3RlbmVyLlxuICAgKi9cbiAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gIC8qKlxuICAgKiBBIFZpeiBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkIGFzIGEgY2hpbGQgb2YgdGhlIHBhcmVudEVsZW1lbnQgc3BlY2lmaWVkIGluIHRoZSBWaXogY29uc3RydWN0b3IuXG4gICAqL1xuICBWaXpBbHJlYWR5SW5NYW5hZ2VyID0gJ3Zpei1hbHJlYWR5LWluLW1hbmFnZXInLFxuICAvKipcbiAgICogRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBpbiB0aGUgZW1iZWRkaW5nIGFwaS5cbiAgICovXG4gIEltcGxlbWVudGF0aW9uRXJyb3IgPSAnd3JvbmctaW1wbGVtZW50YXRpb24nLFxuICAvKipcbiAgICogQGhpZGRlbiAobm90IGltcGxlbWVudGVkKVxuICAgKi9cbiAgTm90SW1wbGVtZW50ZWQgPSAnbm90LWltcGxlbWVudGVkJyxcbiAgLyoqXG4gICAqIFVua25vd24gZXJyb3IgZHVyaW5nIGV2ZW50IGluaXRpYWxpemF0aW9uXG4gICAqL1xuICBFdmVudEluaXRpYWxpemF0aW9uRXJyb3IgPSAnZXZlbnQtaW5pdGlhbGl6YXRpb24tZXJyb3InLFxuICAvKipcbiAgICogVmVyc2lvbiBvZiB0aGUgZW1iZWRkaW5nIGFwaSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSB2ZXJzaW9uIG9mIHRhYmxlYXVcbiAgICovXG4gIEluY29tcGF0aWJsZVZlcnNpb25FcnJvciA9ICdpbmNvbXBhdGlibGUtdmVyc2lvbi1lcnJvcicsXG5cbiAgLyoqXG4gICAqIFVua25vd24ge0BsaW5rIFRhYmxlYXVEaWFsb2dUeXBlfSBwYXNzZWQgaW4gdG8gVml6LmRpc3BsYXlEaWFsb2dBc3luYy5cbiAgICovXG4gIFVua25vd25EaWFsb2dUeXBlID0gJ3Vua25vd24tZGlhbG9nLXR5cGUnLFxuXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgaWYgdGhlIEFQSSBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgKiBDYW4gYWxzbyBvY2N1cnMgaWYgYSB7QGxpbmsgRmlsdGVyVHlwZX0gaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkLlxuICAgKi9cbiAgRmlsdGVyTWlzc2luZ09yTm90SW1wbGVtZW50ZWQgPSAnZmlsdGVyLW1pc3Npbmctbm90LWltcGxlbWVudGVkJyxcblxuICAvKipcbiAgICogQ2FuIG9jY3VyIGlmIHN0b3J5IHBvaW50IGlkcyBubyBsb25nZXIgbWF0Y2guXG4gICAqL1xuICBTdG9yeVBvaW50SWRNaXNtYXRjaCA9ICdzdG9yeXBvaW50LWlkLW1pc21hdGNoJyxcbn1cblxuZXhwb3J0IGVudW0gUHJpbnRPcmllbnRhdGlvbiB7XG4gIFBvcnRyYWl0ID0gJ3BvcnRyYWl0JyxcbiAgTGFuZHNjYXBlID0gJ2xhbmRzY2FwZScsXG59XG5cbmV4cG9ydCBlbnVtIFByaW50UGFnZVNpemUge1xuICBMZXR0ZXIgPSAnbGV0dGVyJyxcbiAgTGVnYWwgPSAnbGVnYWwnLFxuICBOb3RlID0gJ25vdGUnLFxuICBGb2xpbyA9ICdmb2xpbycsXG4gIFRhYmxvaWQgPSAndGFibG9pZCcsXG4gIExlZGdlciA9ICdsZWRnZXInLFxuICBTdGF0ZW1lbnQgPSAnc3RhdGVtZW50JyxcbiAgRXhlY3V0aXZlID0gJ2V4ZWN1dGl2ZScsXG4gIEEzID0gJ0EzJyxcbiAgQTQgPSAnQTQnLFxuICBBNSA9ICdBNScsXG4gIEI0ID0gJ0I0JyxcbiAgQjUgPSAnQjUnLFxuICBRdWFydG8gPSAncXVhcnRvJyxcbiAgVW5zcGVjaWZpZWQgPSAndW5zcGVjaWZpZWQnLFxufVxuXG5leHBvcnQgZW51bSBQcmludFNjYWxpbmcge1xuICBBdXRvbWF0aWMgPSAnYXV0b21hdGljJyxcbiAgUGVyYzI1ID0gJzI1JScsXG4gIFBlcmM1MCA9ICc1MCUnLFxuICBQZXJjNjAgPSAnNjAlJyxcbiAgUGVyYzc1ID0gJzc1JScsXG4gIFBlcmM4MCA9ICc4MCUnLFxuICBQZXJjOTAgPSAnOTAlJyxcbiAgUGVyYzEwMCA9ICcxMDAlJyxcbiAgUGVyYzIwMCA9ICcyMDAlJyxcbiAgUGVyYzQwMCA9ICc0MDAlJyxcbiAgQXRNb3N0MVBhZ2VIaWdoID0gJ2F0LW1vc3QtMS1wYWdlLWhpZ2gnLFxuICBBdE1vc3QyUGFnZXNIaWdoID0gJ2F0LW1vc3QtMi1wYWdlcy1oaWdoJyxcbiAgQXRNb3N0MVBhZ2VXaWRlID0gJ2F0LW1vc3QtMS1wYWdlLXdpZGUnLFxuICBBdE1vc3QyUGFnZXNXaWRlID0gJ2F0LW1vc3QtMi1wYWdlcy13aWRlJyxcbn1cblxuZXhwb3J0IGVudW0gUmV2ZXJ0Vml6U2VsZWN0aW9uIHtcbiAgQWxsID0gJ2FsbCcsXG4gIEF4ZXMgPSAnYXhlcycsXG4gIEZpbHRlcnMgPSAnZmlsdGVycycsXG4gIFNvcnRzID0gJ3NvcnRzJyxcbiAgU2hlbHZlcyA9ICdzaGVsdmVzJyxcbn1cblxuZXhwb3J0IGVudW0gVG9vbGJhckJ1dHRvbnMge1xuICBBbGVydHMgPSAnYWxlcnRzJyxcbiAgQXNrRGF0YSA9ICdhc2tEYXRhJyxcbiAgQ3VzdG9tVmlld3MgPSAnY3VzdG9tVmlld3MnLFxuICBEYXRhRGV0YWlscyA9ICdkYXRhRGV0YWlscycsXG4gIFNoYXJlID0gJ3NoYXJlJyxcbiAgU3Vic2NyaWJlID0gJ3N1YnNjcmliZScsXG59XG5cbmV4cG9ydCBlbnVtIFRvb2xiYXIge1xuICBUb3AgPSAndG9wJyxcbiAgQm90dG9tID0gJ2JvdHRvbScsXG4gIEhpZGRlbiA9ICdoaWRkZW4nLFxufVxuXG5leHBvcnQgZW51bSBTaGVldFNpemVCZWhhdmlvciB7XG4gIEF1dG9tYXRpYyA9ICdhdXRvbWF0aWMnLFxuICBFeGFjdGx5ID0gJ2V4YWN0bHknLFxuICBSYW5nZSA9ICdyYW5nZScsXG4gIEF0TGVhc3QgPSAnYXRsZWFzdCcsXG4gIEF0TW9zdCA9ICdhdG1vc3QnLFxufVxuXG5leHBvcnQgZW51bSBQdWxzZUxheW91dCB7XG4gIERlZmF1bHQgPSAnZGVmYXVsdCcsXG4gIENhcmQgPSAnY2FyZCcsXG4gIEJhbiA9ICdiYW4nLFxufVxuXG5leHBvcnQgZW51bSBQdWxzZVRpbWVEaW1lbnNpb24ge1xuICBUb2RheSA9ICdUb2RheScsXG4gIFllc3RlcmRheSA9ICdZZXN0ZXJkYXknLFxuICBXZWVrVG9EYXRlID0gJ1dlZWtUb0RhdGUnLFxuICBMYXN0V2VlayA9ICdMYXN0V2VlaycsXG4gIE1vbnRoVG9EYXRlID0gJ01vbnRoVG9EYXRlJyxcbiAgTGFzdE1vbnRoID0gJ0xhc3RNb250aCcsXG4gIFF1YXJ0ZXJUb0RhdGUgPSAnUXVhcnRlclRvRGF0ZScsXG4gIExhc3RRdWFydGVyID0gJ0xhc3RRdWFydGVyJyxcbiAgWWVhclRvRGF0ZSA9ICdZZWFyVG9EYXRlJyxcbiAgTGFzdFllYXIgPSAnTGFzdFllYXInLFxufVxuXG5leHBvcnQgZW51bSBQdWxzZUVycm9yTWVzc2FnZVZpc2liaWxpdHkge1xuICBWaXNpYmxlID0gJ3Zpc2libGUnLFxuICBIaWRkZW4gPSAnaGlkZGVuJyxcbiAgU3VwcHJlc3NlZCA9ICdzdXBwcmVzc2VkJyxcbn1cblxuLyoqXG4gKiBCZSBjYXJlZnVsIHdoZW4gYWRkaW5nIG5ldyBldmVudCB0eXBlcy4gRXh0ZW5zaW9ucyBhbmQgZW1iZWRkaW5nIGZvbGxvdyB0d28gZGlmZmVyZW50IHBhdHRlcm5zIG9uIGhvdyBldmVudHMgYXJlIG5hbWVkLlxuICogRXZlbnRzIHNob3VsZCBiZSBhbGwgbG93ZXIgY2FzZSBhbmQgd2l0aG91dCBoeXBoZW5zIG9yIHVuZGVyc2NvcmVzLlxuICovXG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgdHlwZSBvZiB0YWJsZWF1IGVtYmVkZGluZyBldmVudCB0aGF0IGNhbiBiZSBsaXN0ZW5lZCBmb3IuXG4gKi9cbmV4cG9ydCBlbnVtIFRhYmxlYXVFdmVudFR5cGUge1xuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgZmluaXNoZWQgbG9hZGluZy4gVGhpcyBldmVudCBpcyByYWlzZWQgYWZ0ZXIgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciB7QGxpbmsgRmlyc3RJbnRlcmFjdGl2ZX0gKGlmIGFueSkgaGFzIGJlZW4gY2FsbGVkLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tVmlld0xvYWRlZCA9ICdjdXN0b212aWV3bG9hZGVkJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiByZW1vdmVkLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tVmlld1JlbW92ZWQgPSAnY3VzdG9tdmlld3JlbW92ZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNhdmVkIChuZXdseSBjcmVhdGVkIG9yIHVwZGF0ZWQpLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tVmlld1NhdmVkID0gJ2N1c3RvbXZpZXdzYXZlZCcsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCB3aGVuIGEgY3VzdG9tIHZpZXcgaGFzIGJlZW4gc2V0IGFzIHRoZSBkZWZhdWx0IHZpZXcgZm9yIGEgd29ya2Jvb2suXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBDdXN0b21WaWV3U2V0RGVmYXVsdCA9ICdjdXN0b212aWV3c2V0ZGVmYXVsdCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgRWRpdCBCdXR0b24uXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBFZGl0QnV0dG9uQ2xpY2tlZCA9ICdlZGl0YnV0dG9uY2xpY2tlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIHRoZSB1c2VyIGNsaWNrcyBvbiB0aGUgRWRpdCBJbiBEZXNrdG9wIEJ1dHRvbi5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZ1xuICAgKi9cbiAgRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQgPSAnZWRpdGluZGVza3RvcGJ1dHRvbmNsaWNrZWQnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiBhbnkgZmlsdGVyIGhhcyBjaGFuZ2VkIHN0YXRlLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlcmNoYW5nZWQnLFxuXG4gIC8qKiBGaXJlZCB3aGVuIHZpeiBzaXplIGlzIGtub3duXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmdcbiAgICovXG4gIEZpcnN0Vml6U2l6ZUtub3duID0gJ2ZpcnN0dml6c2l6ZWtub3duJyxcblxuICAvKiogRmlyZWQgd2hlbiBhIHZpeiBmaXJzdCBiZWNvbWVzIGludGVyYWN0aXZlXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmcsIFZpZXdpbmcsIFB1bHNlXG4gICAqL1xuICBGaXJzdEludGVyYWN0aXZlID0gJ2ZpcnN0aW50ZXJhY3RpdmUnLFxuXG4gIC8qKiBSYWlzZWQgd2hlbiBhIGN1c3RvbSBtYXJrIGNvbnRleHQgbWVudSBpcyBjbGlja2VkLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQgPSAnY3VzdG9tbWFya2NvbnRleHRtZW51JyxcblxuICAvKiogVGhlIHNlbGVjdGVkIG1hcmtzIG9uIGEgdmlzdWFsaXphdGlvbiBoYXZlIGNoYW5nZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFRhYmxlYXVWaXogb2JqZWN0cy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIE1hcmtTZWxlY3Rpb25DaGFuZ2VkID0gJ21hcmtzZWxlY3Rpb25jaGFuZ2VkJyxcblxuICAvKiogQSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtbUGFyYW1ldGVyXV0gb2JqZWN0cy5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFBhcmFtZXRlckNoYW5nZWQgPSAncGFyYW1ldGVyY2hhbmdlZCcsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIGEgdG9vbGJhciBidXR0b24gb3IgY29udHJvbCBiZWNvbWVzIGF2YWlsYWJsZSBvciBiZWNvbWVzIHVuYXZhaWxhYmxlLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgVG9vbGJhclN0YXRlQ2hhbmdlZCA9ICd0b29sYmFyc3RhdGVjaGFuZ2VkJyxcblxuICAvKiogUmFpc2VkIHdoZW4gdGhlIHdvcmtib29rIGlzIHJlYWR5IHRvIGNsb3NlLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nXG4gICAqL1xuICBXb3JrYm9va1JlYWR5VG9DbG9zZSA9ICd3b3JrYm9va3JlYWR5dG9jbG9zZScsXG5cbiAgLyoqIFJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vayBoYXMgYmVlbiBwdWJsaXNoZWQuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBBdXRob3JpbmdcbiAgICovXG4gIFdvcmtib29rUHVibGlzaGVkID0gJ3dvcmtib29rcHVibGlzaGVkJyxcblxuICAvKiogUmFpc2VkIHdoZW4gXCJwdWJsaXNoIGFzXCIgaXMgc3VjY2Vzc2Z1bC4gVGhpcyBub3RpZmljYXRpb24gaXMgc2VudCB3aGVuIHVzaW5nIGVtYmVkZGVkIHdlYiBhdXRob3JpbmcgZnVuY3Rpb25hbGl0eS5cbiAgICpcbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZ1xuICAgKi9cbiAgV29ya2Jvb2tQdWJsaXNoZWRBcyA9ICd3b3JrYm9va3B1Ymxpc2hlZGFzJyxcblxuICAvKipcbiAgICogUmFpc2VkIHdoZW4gYSBVUkwgYWN0aW9uIG9jY3Vycy4gU2VlIHRoZSB7QGxpbmsgVXJsQWN0aW9uRXZlbnR9IGNsYXNzLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgVmlld2luZ1xuICAgKi9cbiAgVXJsQWN0aW9uID0gJ3VybGFjdGlvbicsXG5cbiAgLyoqXG4gICAqIFJhaXNlZCBhZnRlciBhIHRhYiBzd2l0Y2ggb2NjdXJzICh0aGUgYWN0aXZlIHNoZWV0IGhhcyBjaGFuZ2VkKS4gR3VhcmFudGVlcyB0aGUgdml6IG9iamVjdCB3aWxsIGJlIGludGVyYWN0aXZlIGFmdGVyIHRoaXMuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBUYWJTd2l0Y2hlZCA9ICd0YWJzd2l0Y2hlZCcsXG4gIC8qKlxuICAgKlxuICAgKiBSYWlzZWQgYWZ0ZXIgYSBuZXcgc3RvcnkgcG9pbnQgYmVjb21lcyBhY3RpdmUuXG4gICAqXG4gICAqIEBjYXRlZ29yeSBWaWV3aW5nXG4gICAqL1xuICBTdG9yeVBvaW50U3dpdGNoZWQgPSAnc3Rvcnlwb2ludHN3aXRjaGVkJyxcbiAgLyoqXG4gICAqXG4gICAqIFJhaXNlZCB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBsb2FkaW5nIHRoZSBjb250ZW50cyBvZiB0aGUgd2ViY29tcG9uZW50LlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nLCBBc2tEYXRhXG4gICAqL1xuICBWaXpMb2FkRXJyb3IgPSAndml6bG9hZGVycm9yJyxcbiAgLyoqXG4gICAqIFJhaXNlZCBhZnRlciB0aGUgaWZyYW1lIHNyYyBhdHRyaWJ1dGUgaGFzIGJlZW4gdXBkYXRlZFxuICAgKlxuICAgKiBAY2F0ZWdvcnkgQXV0aG9yaW5nLCBWaWV3aW5nLCBBc2tEYXRhXG4gICAqL1xuICBJZnJhbWVTcmNVcGRhdGVkID0gJ2lmcmFtZXNyY3VwZGF0ZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiBjaGFuZ2VzIGFyZSBtYWRlIHRvIHN1bW1hcnkgZGF0YS5cbiAgICpcbiAgICogQGNhdGVnb3J5IFZpZXdpbmdcbiAgICovXG4gIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5ZGF0YWNoYW5nZWQnLFxuXG4gIC8qKlxuICAgKiBSYWlzZWQgd2hlbiB0YWJsZWF1ICh2aXotY2xpZW50KSBpcyByZWFkeSB0byByZWNlaXZlIGFuIGF1dGggdG9rZW4uXG4gICAqIFVzZWQgZm9yIGF1dGhlbnRpY2F0aW9uIGluIHNhbGVzZm9yY2UgbmF0aXZlIG1vZGUuXG4gICAqXG4gICAqIEBoaWRkZW5cbiAgICogQGNhdGVnb3J5IEF1dGhvcmluZywgVmlld2luZyxcbiAgICovXG4gIFJlYWR5VG9SZWNlaXZlQXV0aFRva2VuID0gJ3JlYWR5dG9yZWNlaXZlYXV0aHRva2VuJyxcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiB0aGUgUHVsc2UgbWV0cmljIHNpemUgaXMga25vd25cbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBGaXJzdFB1bHNlTWV0cmljU2l6ZUtub3duID0gJ2ZpcnN0cHVsc2VtZXRyaWNzaXpla25vd24nLFxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIGFuIGludGVybmFsIFB1bHNlIGVycm9yIGlzIGVuY291bnRlcmVkLlxuICAgKlxuICAgKiBAY2F0ZWdvcnkgUHVsc2VcbiAgICovXG4gIFB1bHNlRXJyb3IgPSAncHVsc2VlcnJvcicsXG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIFB1bHNlIGZpbHRlcnMgY2hhbmdlXG4gICAqXG4gICAqIEBjYXRlZ29yeSBQdWxzZVxuICAgKi9cbiAgUHVsc2VGaWx0ZXJzQ2hhbmdlZCA9ICdwdWxzZWZpbHRlcnNjaGFuZ2VkJyxcblxuICAvKipcbiAgICogRmlyZWQgd2hlbiBhIFB1bHNlIGluc2lnaHQgaXMgZGlzY292ZXJlZFxuICAgKlxuICAgKiBAY2F0ZWdvcnkgUHVsc2VcbiAgICovXG4gIFB1bHNlSW5zaWdodERpc2NvdmVyZWQgPSAncHVsc2VpbnNpZ2h0ZGlzY292ZXJlZCcsXG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIFB1bHNlIG1ldHJpYyBzaXplIGNoYW5nZXNcbiAgICpcbiAgICogQGNhdGVnb3J5IFB1bHNlXG4gICAqL1xuICBQdWxzZU1ldHJpY1NpemVDaGFuZ2VkID0gJ3B1bHNlbWV0cmljc2l6ZWNoYW5nZWQnLFxuXG4gIC8qKlxuICAgKiBGaXJlZCB3aGVuIHRoZSBQdWxzZSBtZXRyaWMgdGltZSBkaW1lbnNpb24gY2hhbmdlc1xuICAgKlxuICAgKiBAY2F0ZWdvcnkgUHVsc2VcbiAgICovXG4gIFB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWQgPSAncHVsc2V0aW1lZGltZW5zaW9uY2hhbmdlZCcsXG5cbiAgLyoqXG4gICAqIEZpcmVkIHdoZW4gdGhlIFB1bHNlIFVSTCBjaGFuZ2VzXG4gICAqXG4gICAqIEBjYXRlZ29yeSBQdWxzZVxuICAgKi9cbiAgUHVsc2VVcmxDaGFuZ2VkID0gJ3B1bHNldXJsY2hhbmdlZCcsXG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgbG9jYXRpb24gb2YgYSBjb250ZXh0IG1lbnUgd2hlcmUgdXNlcnMgY2FuIGFkZCBleHRlcm5hbCBtZW51IGl0ZW1zLlxuICovXG5leHBvcnQgZW51bSBBcGlNZW51VHlwZSB7XG4gIC8qKiBFeHRlcm5hbCBtZW51IGl0ZW0gd2lsbCBiZSBpbmplY3RlZCBpbiB1YmVydGlwIGRpYWxvZyAqL1xuICBVYmVydGlwID0gJ3ViZXJ0aXAnLFxufVxuXG4vKiogWW91IGNhbiB1c2UgdGhpcyB0eXBlIHdpdGggYSB7QGxpbmsgVml6fSBvYmplY3QuICovXG5leHBvcnQgZW51bSBUYWJsZWF1RGlhbG9nVHlwZSB7XG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIFBERiBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnRQREYgPSAnZXhwb3J0LXBkZicsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIFBvd2VyUG9pbnQgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0UG93ZXJQb2ludCA9ICdleHBvcnQtcG93ZXJwb2ludCcsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIERhdGEgZGlhbG9nLlxuICAgKi9cbiAgRXhwb3J0RGF0YSA9ICdleHBvcnQtZGF0YScsXG4gIC8qKlxuICAgKiBVc2VkIHRvIGRpc3BsYXkgdGhlIGRvd25sb2FkIENyb3NzVGFiIGRpYWxvZy5cbiAgICovXG4gIEV4cG9ydENyb3NzVGFiID0gJ2V4cG9ydC1jcm9zcy10YWInLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBkb3dubG9hZCBXb3JrYm9vayBkaWFsb2cuXG4gICAqL1xuICBFeHBvcnRXb3JrYm9vayA9ICdleHBvcnQtd29ya2Jvb2snLFxuICAvKipcbiAgICogVXNlZCB0byBkaXNwbGF5IHRoZSBTaGFyZSBkaWFsb2cuXG4gICAqL1xuICBTaGFyZSA9ICdzaGFyZScsXG59XG4iLCJpbXBvcnQgeyBGaWx0ZXJPcHRpb25zIH0gZnJvbSAnLi4vU2hhcmVkL0ZpbHRlckludGVyZmFjZXMnO1xuaW1wb3J0IHsgRmlsdGVyRG9tYWluVHlwZSwgRmlsdGVyVHlwZSwgRmlsdGVyVXBkYXRlVHlwZSB9IGZyb20gJy4uL1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuaW1wb3J0IHsgUHVsc2VMYXlvdXQsIFB1bHNlVGltZURpbWVuc2lvbiB9IGZyb20gJy4vRW51bXMnO1xuaW1wb3J0IHsgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB9IGZyb20gJy4vV2ViQ29tcG9uZW50SW50ZXJmYWNlcyc7XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIDx0YWJsZWF1LXB1bHNlPiB3ZWIgY29tcG9uZW50LlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBQdWxzZUF0dHJpYnV0ZXMge1xuICBEaXNhYmxlRXhwbG9yZUZpbHRlciA9ICdkaXNhYmxlLWV4cGxvcmUtZmlsdGVyJyxcbiAgTGF5b3V0ID0gJ2xheW91dCcsXG4gIE9uRmlyc3RJbnRlcmFjdGl2ZSA9ICdvbkZpcnN0SW50ZXJhY3RpdmUnLFxuICBPbkZpcnN0UHVsc2VNZXRyaWNTaXplS25vd24gPSAnb25GaXJzdFB1bHNlTWV0cmljU2l6ZUtub3duJyxcbiAgT25QdWxzZVVybEVycm9yID0gJ29uUHVsc2VFcnJvcicsXG4gIE9uUHVsc2VGaWx0ZXJzQ2hhbmdlZCA9ICdvblB1bHNlRmlsdGVyc0NoYW5nZWQnLFxuICBPblB1bHNlSW5zaWdodERpc2NvdmVyZWQgPSAnb25QdWxzZUluc2lnaHREaXNjb3ZlcmVkJyxcbiAgT25QdWxzZU1ldHJpY1NpemVDaGFuZ2VkID0gJ29uUHVsc2VNZXRyaWNTaXplQ2hhbmdlZCcsXG4gIE9uUHVsc2VUaW1lRGltZW5zaW9uQ2hhbmdlZCA9ICdvblB1bHNlVGltZURpbWVuc2lvbkNoYW5nZWQnLFxuICBPblB1bHNlVXJsQ2hhbmdlZCA9ICdvblB1bHNlVXJsQ2hhbmdlZCcsXG4gIFRpbWVEaW1lbnNpb24gPSAndGltZS1kaW1lbnNpb24nLFxuICBUb2tlbk9wdGlvbmFsID0gJ3Rva2VuLW9wdGlvbmFsJyxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZVNldHRpbmdzIGV4dGVuZHMgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncyB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgZXhwbG9yZSBmaWx0ZXIgaXMgaGlkZGVuIG9yIHZpc2libGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1wdWxzZSBpZD1cInRhYmxlYXVQdWxzZVwiIGRpc2FibGUtZXhwbG9yZS1maWx0ZXI+XG4gICAqIGBgYFxuICAgKi9cbiAgZGlzYWJsZUV4cGxvcmVGaWx0ZXI/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIGRlc2lyZWQgY3VzdG9tIGxheW91dCBvZiB0aGUgUHVsc2UgbWV0cmljLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBsYXlvdXQ9XCJjYXJkXCI+XG4gICAqIGBgYFxuICAgKi9cbiAgbGF5b3V0PzogUHVsc2VMYXlvdXQ7XG5cbiAgLyoqXG4gICAqIFRoZSB0b2tlbiB1c2VkIGZvciBhdXRob3JpemF0aW9uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiB0b2tlbj1cInNvbWUtdG9rZW4tY29udGFpbmluZy1jbGllbnRJZFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG9rZW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgJ2xvYWRpbmcnIGF0dHJpYnV0ZSBvZiB0aGUgZW1iZWRkZWQgaWZyYW1lLlxuICAgKiBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudC9pZnJhbWUjbG9hZGluZ1xuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLWxvYWRpbmc9XCJsYXp5XCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1sb2FkaW5nPVwibGF6eVwiIC8+XG4gICAqIDx0YWJsZWF1LXB1bHNlIGlkPVwidGFibGVhdVB1bHNlXCIgaWZyYW1lLWF0dHItbG9hZGluZz1cImxhenlcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIGlmcmFtZUF0dHJpYnV0ZUxvYWRpbmc/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgJ3N0eWxlJyBhdHRyaWJ1dGUgb2YgdGhlIGVtYmVkZGVkIGlmcmFtZS5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1zdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkIHJlZFwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCByZWRcIiAvPlxuICAgKiA8dGFibGVhdS1wdWxzZSBpZD1cInRhYmxlYXVQdWxzZVwiIGlmcmFtZS1hdHRyLXN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgcmVkXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdHRyaWJ1dGVTdHlsZT86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIHZhbHVlIG9mIHRoZSAnY2xhc3MnIGF0dHJpYnV0ZSBvZiB0aGUgZW1iZWRkZWQgaWZyYW1lIHByb3ZpZGluZyBhY2Nlc3MgdG8gYW55XG4gICAqIGN1c3RvbSBzZWxlY3RvcnMgZGVmaW5lZCBpbiB0aGUgYDxpZnJhbWUtc3R5bGU+YCBjaGlsZCB0YWcuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1wdWxzZSBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1jbGFzcz1cInJlZC1ib3JkZXJcIj5cbiAgICogICA8aWZyYW1lLXN0eWxlPlxuICAgKiAgICAgLnJlZC1ib3JkZXIge1xuICAgKiAgICAgICBib3JkZXI6IDFweCBzb2xpZCByZWQ7XG4gICAqICAgICB9XG4gICAqICAgPC9pZnJhbWUtc3R5bGU+XG4gICAqIDwvdGFibGVhdS1wdWxzZT5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdHRyaWJ1dGVDbGFzcz86IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIEJhc2U2NC1lbmNvZGVkIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgUHVsc2UgdGhlbWUgb2JqZWN0LlxuICAgKlxuICAgKi9cbiAgdGhlbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgZGVzaXJlZCB0aW1lIGRpbWVuc2lvbiB0byBhcHBseSB0byB0aGUgUHVsc2UgbWV0cmljIGJ5IGRlZmF1bHQuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1wdWxzZSBpZD1cInRhYmxlYXVQdWxzZVwiIHRpbWUtZGltZW5zaW9uPVwiTW9udGhUb0RhdGVcIj5cbiAgICogYGBgXG4gICAqL1xuICB0aW1lRGltZW5zaW9uPzogUHVsc2VUaW1lRGltZW5zaW9uO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgdG9rZW4gaXMgb3B0aW9uYWwuXG4gICAqIFdoZW4gdHJ1ZSwgdGhlIG1ldHJpYyB3aWxsIGF0dGVtcHQgdG8gbG9hZCBldmVuIHdpdGhvdXQgc3BlY2lmeWluZyBhIHRva2VuLlxuICAgKiBUaGlzIHdhcyBhZGRlZCBzcGVjaWZpY2FsbHkgZm9yIHRoZSBNb2JpbGUgdGVhbSB3aG8gdXNlcyBQS0NFIGZsb3cgdG8gaW5pdGlhdGUgdGhlIHNlc3Npb25cbiAgICogYW5kIHNob3VsZCBub3QgYmUgYWR2ZXJ0aXNlZCB0byAzcmQgcGFydGllcy5cbiAgICpcbiAgICogQGlnbm9yZVxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiB0b2tlbi1vcHRpb25hbD5cbiAgICogYGBgXG4gICAqL1xuICBpc1Rva2VuT3B0aW9uYWw/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBjaGlsZCB0YWdzIGZvciBUYWJsZWF1UHVsc2UgY3VzdG9tIGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBlbnVtIFB1bHNlQ2hpbGRFbGVtZW50cyB7XG4gIC8qKlxuICAgKiBDdXN0b20gc3R5bGVzIGFwcGxpY2FibGUgdG8gdGhlIGVtYmVkZGVkIGlmcmFtZSBlbGVtZW50IGl0c2VsZiAobm90IGluc2lkZSBpdCkuXG4gICAqL1xuICBJZnJhbWVTdHlsZSA9ICdpZnJhbWUtc3R5bGUnLFxuXG4gIC8qKlxuICAgKiBBIHBhcmFtZXRlciB0byBiZSB1c2VkIGluIHRoZSBQdWxzZSB0aGVtZS5cbiAgICovXG4gIFRoZW1lUGFyYW1ldGVyID0gJ3RoZW1lLXBhcmFtZXRlcicsXG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBmaWx0ZXIgcGFyYW1ldGVycy5cbiAgICovXG4gIFB1bHNlRmlsdGVyID0gJ3B1bHNlLWZpbHRlcicsXG59XG5cbi8qKlxuICogVGhlIGF0dHJpYnV0ZXMgb2YgdGhlIDx0aGVtZS1wYXJhbWV0ZXI+IGNoaWxkIGVsZW1lbnRzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlVGhlbWVQcm9wZXJ0eSB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSB0aGVtZSBwYXJhbWV0ZXIgdG8gYmUgc2V0LlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWYWx1ZSBmb3IgdGhlIHRoZW1lIHBhcmFtZXRlciBiZWluZyBzZXQuXG4gICAqL1xuICB2YWx1ZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbCB0eXBlIG9mIHRoZW1lIHBhcmFtZXRlciBiZWluZyBzZXQuXG4gICAqL1xuICB0eXBlOiBzdHJpbmcgfCBudWxsO1xufVxuXG4vKipcbiAqIFRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBjaGlsZCBlbGVtZW50cyBvZiA8dGFibGVhdS1wdWxzZT4uXG4gKi9cbmV4cG9ydCBlbnVtIFB1bHNlQ2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIE5hbWUgPSAnbmFtZScsXG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBUeXBlID0gJ3R5cGUnLFxufVxuXG4vKipcbiAqIFRoZSBQdWxzZSB0aGVtZSBkYXRhIHN0cnVjdHVyZS5cbiAqL1xuZXhwb3J0IHR5cGUgUHVsc2VUaGVtZSA9IFJlY29yZDxzdHJpbmcsIHN0cmluZyB8IFJlY29yZDxzdHJpbmcsIHN0cmluZz4+O1xuXG4vKipcbiAqIEFjdGlvbnMgcmVsYXRlZCB0byBldmVudHMgYW5kIHN0YXRlIG9mIHRoZSBQdWxzZSBtZXRyaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZUFjdGlvbnMge1xuICAvKipcbiAgICogQXBwbGllcyB0aGUgbGlzdCBvZiBwcm92aWRlZCBjYXRlZ29yaWNhbCBmaWx0ZXIgdmFsdWVzIHRvIHRoZSBQdWxzZSBtZXRyaWMuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgICAgICBUaGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gZmlsdGVyIG9uLlxuICAgKiBAcGFyYW0gdmFsdWVzICAgICAgICAgVGhlIGxpc3Qgb2YgdmFsdWVzIHRvIGZpbHRlciBvbi5cbiAgICogQHBhcmFtIHVwZGF0ZVR5cGUgICAgIFRoZSB1cGRhdGUgdHlwZSBvZiB0aGlzIGZpbHRlciAoYWRkLCBhbGwsIHJlbW92ZSwgcmVwbGFjZSkuXG4gICAqIEBwYXJhbSBmaWx0ZXJPcHRpb25zICBBZHZhbmNlZCBmaWx0ZXIgb3B0aW9ucyAoaXNFeGNsdWRlTW9kZSkuXG4gICAqIEByZXR1cm5zIFRoZSBmaWVsZCBuYW1lIHRoYXQgdGhlIGZpbHRlciBpcyBhcHBsaWVkIG9uLlxuICAgKi9cbiAgYXBwbHlGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZywgdmFsdWVzOiBQdWxzZUZpZWxkVmFsdWVBcnJheSwgdXBkYXRlVHlwZTogRmlsdGVyVXBkYXRlVHlwZSwgb3B0aW9uczogRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPjtcblxuICAvKipcbiAgICogQXBwbGllcyBhdCBsZWFzdCBvbmUgY2F0ZWdvcmljYWwgZmlsdGVyIHZhbHVlIHRvIHRoZSBQdWxzZSBtZXRyaWMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8e1xuICAgKiAgICAgICBmaWVsZE5hbWU6IHN0cmluZztcbiAgICogICAgICAgdmFsdWVzOiBQdWxzZUZpZWxkVmFsdWVBcnJheTtcbiAgICogICAgICAgdXBkYXRlVHlwZTogRmlsdGVyVXBkYXRlVHlwZTtcbiAgICogICAgICAgb3B0aW9uczogRmlsdGVyT3B0aW9ucztcbiAgICogICAgIH0+fSBmaWx0ZXJzIFRoZSBzZXQgb2YgZmlsdGVycyB0byBhcHBseS5cbiAgICogQHJldHVybnMgVGhlIGZpZWxkIG5hbWVzIHRoYXQgdGhlIGZpbHRlciB3YXMgYXBwbGllZCBvbi5cbiAgICovXG4gIGFwcGx5RmlsdGVyc0FzeW5jKFxuICAgIGZpbHRlcnM6IEFycmF5PHtcbiAgICAgIGZpZWxkTmFtZTogc3RyaW5nO1xuICAgICAgdmFsdWVzOiBQdWxzZUZpZWxkVmFsdWVBcnJheTtcbiAgICAgIHVwZGF0ZVR5cGU6IEZpbHRlclVwZGF0ZVR5cGU7XG4gICAgICBvcHRpb25zOiBGaWx0ZXJPcHRpb25zO1xuICAgIH0+LFxuICApOiBQcm9taXNlPEFycmF5PHN0cmluZz4+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHRpbWUgZGltZW5zaW9uIGFwcGxpZWQgdG8gdGhlIFB1bHNlIG1ldHJpYy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGN1cnJlbnQgdGltZSBkaW1lbnNpb24uXG4gICAqL1xuICBnZXRUaW1lRGltZW5zaW9uQXN5bmMoKTogUHJvbWlzZTxQdWxzZVRpbWVEaW1lbnNpb24+O1xuXG4gIC8qKlxuICAgKiBBcHBsaWVzIHRoZSB0aW1lIGRpbWVuc2lvbiB0byB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0ge1B1bHNlVGltZURpbWVuc2lvbn0gdGltZURpbWVuc2lvbiBUaGUgdGltZSBkaW1lbnNpb24gdG8gYXBwbHlcbiAgICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gICAqL1xuICBhcHBseVRpbWVEaW1lbnNpb25Bc3luYyh0aW1lRGltZW5zaW9uOiBQdWxzZVRpbWVEaW1lbnNpb24pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBHZXRzIGEgbGlzdCBvZiBmaWx0ZXJzIGZvciB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxBcnJheTxQdWxzZUZpbHRlcj4+fSBUaGUgbGlzdCBvZiBmaWx0ZXJzLlxuICAgKi9cbiAgZ2V0RmlsdGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8UHVsc2VGaWx0ZXI+PjtcblxuICAvKipcbiAgICogUmVzZXRzIHRoZSBleGlzdGluZyBmaWx0ZXIgZm9yIHRoZSBnaXZlbiBmaWVsZCBvbiB0aGUgUHVsc2UgbWV0cmljLlxuICAgKlxuICAgKiBAcGFyYW0gZmllbGROYW1lICBUaGUgbmFtZSBvZiB0aGUgZmllbGQgdG8gY2xlYXIgZmlsdGVyIG9uLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgZmllbGQgdG8gY2xlYXIgZmlsdGVyIG9uLlxuICAgKi9cbiAgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWVzOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFJlc2V0cyB0aGUgZXhpc3RpbmcgZmlsdGVyIGZvciB0aGUgZ2l2ZW4gZmllbGRzIG9uIHRoZSBQdWxzZSBtZXRyaWMuXG4gICAqXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gZmllbGROYW1lcyBUaGUgbmFtZSBvZiB0aGUgZmllbGRzIHRvIGNsZWFyIGZpbHRlciBvbi5cbiAgICogQHJldHVybnMgVGhlIGZpZWxkcyB0byBjbGVhciBmaWx0ZXIgb24uXG4gICAqL1xuICBjbGVhckZpbHRlcnNBc3luYyhmaWVsZE5hbWVzOiBBcnJheTxzdHJpbmc+KTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PjtcblxuICAvKipcbiAgICogUmVzZXRzIGFsbCB0aGUgZXhpc3RpbmcgZmlsdGVycyBvbiB0aGUgUHVsc2UgbWV0cmljLlxuICAgKi9cbiAgY2xlYXJBbGxGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGZpbHRlciB0aGUgUHVsc2UgbWV0cmljIGJlZm9yZSBpbml0aWFsaXphdGlvbi4gSWYgdXNlZCBhZnRlciBpbml0aWFsaXphdGlvbiwgaXQgd2lsbCByZS1yZW5kZXIgdGhlIG1ldHJpYy5cbiAgICogRm9yIGZpbHRlcmluZyBhZnRlciBpbml0aWFsaXphdGlvbiwgdXNlIHRoZSBvdGhlciBmaWx0ZXJpbmcgbWV0aG9kcywgc3VjaCBhcyBgYXBwbHlGaWx0ZXJBc3luY2AuXG4gICAqXG4gICAqIElmIHlvdSBhZGQgdGhlIHNhbWUgZmlsdGVyIGZpZWxkcyB1c2luZyB0aGUgYGFkZEZpbHRlcigpYCBtZXRob2QgYW5kIGJ5IHVzaW5nIHRoZSBgPHB1bHNlLWZpbHRlcj5gIGVsZW1lbnQgaW4gdGhlIGA8dGFibGVhdS1wdWxzZT5gIHdlYiBjb21wb25lbnQsXG4gICAqIHlvdSBtaWdodCBleHBlcmllbmNlIHVuZXhwZWN0ZWQgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGZpbHRlciBvbi5cbiAgICogQHBhcmFtIHZhbHVlIFNpbmdsZSB2YWx1ZSBvciBhIGxpc3Qgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcyB0byBmaWx0ZXIgb24uXG4gICAqXG4gICAqIGBgYFxuICAgKiBwdWxzZS5hZGRGaWx0ZXIoJ1JlZ2lvbicsICdDZW50cmFsLFdlc3QnKTtcbiAgICogYGBgXG4gICAqL1xuICBhZGRGaWx0ZXIoZmllbGROYW1lOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkO1xuXG4gIC8qKlxuICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gcmVhZGp1c3QgdGhlIGRpbWVuc2lvbnMgb2YgdGhlIGVtYmVkZGVkIFB1bHNlIG1ldHJpYyBpbiByZXNwb25zZSB0byB0aGluZ3MgbGlrZSBhIHdpbmRvdyByZXNpemUsIGRldmljZSBvcmllbnRhdGlvbiBjaGFuZ2UsIG9yXG4gICAqIHBhcmVudCBjb250YWluZXIgcmVzaXplLlxuICAgKlxuICAgKiBgYGBcbiAgICogd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsICgpID0+IHB1bHNlLnJlc2l6ZSgpKTtcbiAgICpcbiAgICogbmV3IFJlc2l6ZU9ic2VydmVyKCgpID0+IHB1bHNlLnJlc2l6ZSgpKS5vYnNlcnZlKHB1bHNlLnBhcmVudEVsZW1lbnQpO1xuICAgKiBgYGBcbiAgICovXG4gIHJlc2l6ZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSB0b3AtbGV2ZWwgUHVsc2Ugb2JqZWN0LlxuICoqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZSBleHRlbmRzIFB1bHNlU2V0dGluZ3MsIFB1bHNlQWN0aW9ucyB7fVxuXG4vKipcbiAqIEEgUHVsc2VGaWVsZFZhbHVlQXJyYXkgaXMgYW4gYXJyYXkgdGhhdCBjYW4gY29udGFpbiBzdHJpbmdzLCBib29sZWFucywgb3IgbnVsbHMsIGJ1dCB3aWxsIG5ldmVyIGNvbnRhaW4gYm90aCBzdHJpbmdzIGFuZCBib29sZWFucyBhdCB0aGUgc2FtZSB0aW1lLlxuICovXG5leHBvcnQgdHlwZSBQdWxzZUZpZWxkVmFsdWVBcnJheSA9IEFycmF5PGJvb2xlYW4gfCBudWxsPiB8IEFycmF5PHN0cmluZyB8IG51bGw+O1xuXG4vKipcbiAqXG4gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgb2YgdGhlIFB1bHNlIGZpbHRlciB0eXBlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQdWxzZUZpbHRlciB7XG4gIC8qKlxuICAgKiBUaGUgbmFtZSBvZiB0aGUgZmllbGQgYmVpbmcgZmlsdGVyZWQuICBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgY2FwdGlvblxuICAgKiBhcyBzaG93biBpbiB0aGUgVUksIGFuZCBub3QgdGhlIGFjdHVhbCBkYXRhYmFzZSBmaWVsZCBuYW1lLlxuICAgKi9cbiAgZmllbGROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB0eXBlIG9mIHRoZSBmaWx0ZXIuXG4gICAqL1xuICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlO1xuXG4gIC8qKlxuICAgKiBUaGUgUHVsc2UgbWV0cmljIElELlxuICAgKi9cbiAgbWV0cmljSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBBIFB1bHNlIENhdGVnb3JpY2FsIEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpY2FsUHVsc2VGaWx0ZXIgZXh0ZW5kcyBQdWxzZUZpbHRlciB7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgdmFsdWVzIGFwcGxpZWQgdG8gdGhpcyBjYXRlZ29yaWNhbCBmaWx0ZXIuIE5vdGljZSB0aGF0IGlmIHRoZSBQdWxzZSBtZXRyaWNcbiAgICogaGFzIGEgZGVmaW5pdGlvbiBmaWx0ZXIsIHRoZSBjdXJyZW50IHJlbGV2YW50IHZhbHVlcyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nXG4gICAqIGBnZXREb21haW5Bc3luYyhGaWx0ZXJEb21haW5UeXBlLlJlbGV2YW50KWAuXG4gICAqL1xuICByZWFkb25seSBhcHBsaWVkVmFsdWVzOiBQdWxzZUZpZWxkVmFsdWVBcnJheTtcblxuICAvKipcbiAgICogVHJ1ZSBpZiB0aGlzIGZpbHRlciBpcyBhbiBleGNsdWRlIGZpbHRlciwgZmFsc2UgaWYgYW4gaW5jbHVkZSBmaWx0ZXIuXG4gICAqL1xuICByZWFkb25seSBpc0V4Y2x1ZGVNb2RlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUcnVlIGlmIGFsbCB0aGUgdmFsdWVzIGFyZSBzZWxlY3RlZCBmb3IgdGhpcyBmaWx0ZXIuIFdoZW4gJ0FsbCcgaXMgc2VsZWN0ZWQsXG4gICAqIGFwcGxpZWRWYWx1ZXMgcmV0dXJucyBhbiBlbXB0eSBsaXN0LlxuICAgKi9cbiAgcmVhZG9ubHkgaXNBbGxTZWxlY3RlZD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGRvbWFpbiBvZiBhIGNhdGVnb3JpY2FsIGZpbHRlci5cbiAgICpcbiAgICogQHBhcmFtIHsoc3RyaW5nIHwgdW5kZWZpbmVkKX0gc2VhcmNoVGVybSBUaGUgdGVybSB0byBzZWFyY2ggZm9yIGluIHRoZSBkb21haW4uXG4gICAqIEBwYXJhbSB7KG51bWJlciB8IHVuZGVmaW5lZCl9IHBhZ2VTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiB2YWx1ZXMgdG8gcmV0dXJuLiBJZ25vcmVkIHdoZW4gbmV4dFBhZ2VUb2tlbiBpcyBub3QgcHJvdmlkZWQuXG4gICAqIEBwYXJhbSB7KHN0cmluZyB8IHVuZGVmaW5lZCl9IG5leHRQYWdlVG9rZW4gVGhlIG5leHQgcGFnZSB0b2tlbiByZXR1cm5lZCBieSBQdWxzZSB3aGVuIGFkZGl0aW9uYWwgdmFsdWVzIGFyZSBhdmFpbGFibGUuXG4gICAqIEBwYXJhbSB7KEZpbHRlckRvbWFpblR5cGUgfCB1bmRlZmluZWQpfSBkb21haW5UeXBlIFRoZSBkb21haW4gdHlwZSBvZiB0aGUgZmlsdGVyLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxQdWxzZUNhdGVnb3JpY2FsRG9tYWluPn0gQSBwcm9taXNlIGNvbnRhaW5pbmcgdGhlIGNhdGVnb3JpY2FsIGRvbWFpbiBmb3IgdGhlIGZpbHRlci5cbiAgICovXG4gIGdldERvbWFpbkFzeW5jOiAoXG4gICAgc2VhcmNoVGVybT86IHN0cmluZyxcbiAgICBwYWdlU2l6ZT86IG51bWJlcixcbiAgICBuZXh0UGFnZVRva2VuPzogc3RyaW5nLFxuICAgIGRvbWFpblR5cGU/OiBGaWx0ZXJEb21haW5UeXBlLFxuICApID0+IFByb21pc2U8UHVsc2VDYXRlZ29yaWNhbERvbWFpbj47XG59XG5cbi8qKlxuICogVGhlIGRvbWFpbiBvZiBhIFB1bHNlIGNhdGVnb3JpY2FsIGZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlQ2F0ZWdvcmljYWxEb21haW4ge1xuICAvKipcbiAgICogVGhlIGRvbWFpbiB0eXBlIChyZWxldmFudCwgZGF0YWJhc2UpXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBGaWx0ZXJEb21haW5UeXBlO1xuICAvKipcbiAgICogVGhlIGxpc3Qgb2YgdmFsdWVzIGluIHRoZSBkb21haW4gb2YgdGhlIGZpbHRlclxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWVzOiBQdWxzZUZpZWxkVmFsdWVBcnJheTtcbiAgLyoqXG4gICAqIFRoZSB0b3RhbCBhdmFpbGFibGUgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgZG9tYWluIG9mIHRoZSBmaWx0ZXIuXG4gICAqL1xuICByZWFkb25seSB0b3RhbEF2YWlsYWJsZTogbnVtYmVyO1xuICAvKipcbiAgICogVGhlIG5leHQgcGFnZSB0b2tlbiByZXR1cm5lZCBieSBQdWxzZSB3aGVuIGFkZGl0aW9uYWwgdmFsdWVzIGFyZSBhdmFpbGFibGUuXG4gICAqIFByb3ZpZGUgdGhpcyB0b2tlbiB0byBnZXREb21haW5Bc3luYyB0byBnZXQgdGhlIG5leHQgcGFnZSBvZiB2YWx1ZXMuXG4gICAqL1xuICByZWFkb25seSBuZXh0UGFnZVRva2VuOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG4iLCJpbXBvcnQgeyBFbWJlZGRpbmdFcnJvckNvZGVzIH0gZnJvbSAnLi9FbnVtcyc7XG5cbi8qKlxuICogQ3VzdG9tIGVycm9yIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IEVycm9yIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZWF1RW1iZWRkaW5nRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUYWJsZWF1IHNwZWNpZmljIEVycm9yQ29kZVxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3JDb2RlOiBFbWJlZGRpbmdFcnJvckNvZGVzO1xufVxuIiwiaW1wb3J0IHtcbiAgQ3Jvc3N0YWJGaWxlRm9ybWF0LFxuICBEZXZpY2VUeXBlLFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFRhYmxlYXVEaWFsb2dUeXBlLFxuICBUYWJsZWF1RXZlbnRUeXBlLFxuICBUb29sYmFyLFxufSBmcm9tICcuL0VudW1zJztcbmltcG9ydCB7IFNoZWV0U2l6ZSB9IGZyb20gJy4vU2hlZXRJbnRlcmZhY2VzJztcbmltcG9ydCB7IFZpelFMRGF0YVNlcnZpY2VTZXNzaW9uSW5mbyB9IGZyb20gJy4vVml6UUxEYXRhU2VydmljZUludGVyZmFjZXMnO1xuaW1wb3J0IHsgV2ViQ29tcG9uZW50TG9jYWxTZXR0aW5ncywgV2ViQ29tcG9uZW50U2V0dGluZ3NTaGFyZWQgfSBmcm9tICcuL1dlYkNvbXBvbmVudEludGVyZmFjZXMnO1xuaW1wb3J0IHsgV29ya2Jvb2sgfSBmcm9tICcuL1dvcmtib29rSW50ZXJmYWNlJztcblxuLyoqXG4gKiBUaGUgc2hhcmVkIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgPHRhYmxlYXUtdml6PiBhbmQgPHRhYmxlYXUtYXV0aG9yaW5nLXZpej4gd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gVml6U2hhcmVkQXR0cmlidXRlcyB7XG4gIFRvdWNoT3B0aW1pemUgPSAndG91Y2gtb3B0aW1pemUnLFxuICBIaWRlRWRpdEluRGVza3RvcEJ1dHRvbiA9ICdoaWRlLWVkaXQtaW4tZGVza3RvcC1idXR0b24nLFxuICBTdXBwcmVzc0RlZmF1bHRFZGl0QmVoYXZpb3IgPSAnc3VwcHJlc3MtZGVmYXVsdC1lZGl0LWJlaGF2aW9yJyxcbiAgRGlzYWJsZVZlcnNpb25DaGVjayA9ICdkaXNhYmxlLXZlcnNpb24tY2hlY2snLFxuICBPbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkID0gJ29uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQnLFxuICBPbkZpcnN0Vml6U2l6ZUtub3duID0gJ29uRmlyc3RWaXpTaXplS25vd24nLFxuICBPbkZpcnN0SW50ZXJhY3RpdmUgPSAnb25GaXJzdEludGVyYWN0aXZlJyxcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIHN0cmluZyBjb25zdGFudHMgeW91IGNhbiB1c2UgYXMgSFRNTCBhdHRyaWJ1dGVzIGZvciB0aGUgPHRhYmxlYXUtdml6PiB3ZWIgY29tcG9uZW50LlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBWaXpBdHRyaWJ1dGVzIHtcbiAgRGlzYWJsZVVybEFjdGlvbnNQb3B1cHMgPSAnZGlzYWJsZS11cmwtYWN0aW9ucycsXG4gIEhpZGVUYWJzID0gJ2hpZGUtdGFicycsXG4gIFRvb2xiYXIgPSAndG9vbGJhcicsXG4gIEluc3RhbmNlSWRUb0Nsb25lID0gJ2luc3RhbmNlLWlkLXRvLWNsb25lJyxcbiAgRGV2aWNlID0gJ2RldmljZScsXG4gIEhpZGVFZGl0QnV0dG9uID0gJ2hpZGUtZWRpdC1idXR0b24nLFxuICBPbkVkaXRCdXR0b25DbGlja2VkID0gJ29uRWRpdEJ1dHRvbkNsaWNrZWQnLFxuICBPbkZpbHRlckNoYW5nZWQgPSAnb25GaWx0ZXJDaGFuZ2VkJyxcbiAgT25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudCA9ICdvbkN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50JyxcbiAgT25NYXJrU2VsZWN0aW9uQ2hhbmdlZCA9ICdvbk1hcmtTZWxlY3Rpb25DaGFuZ2VkJyxcbiAgT25QYXJhbWV0ZXJDaGFuZ2VkID0gJ29uUGFyYW1ldGVyQ2hhbmdlZCcsXG4gIE9uVG9vbGJhclN0YXRlQ2hhbmdlZCA9ICdvblRvb2xiYXJTdGF0ZUNoYW5nZWQnLFxuICBPblVybEFjdGlvbiA9ICdvblVybEFjdGlvbicsXG4gIE9uVGFiU3dpdGNoZWQgPSAnb25UYWJTd2l0Y2hlZCcsXG4gIE9uQ3VzdG9tVmlld0xvYWRlZCA9ICdvbkN1c3RvbVZpZXdMb2FkZWQnLFxuICBPbkN1c3RvbVZpZXdSZW1vdmVkID0gJ29uQ3VzdG9tVmlld1JlbW92ZWQnLFxuICBPbkN1c3RvbVZpZXdTYXZlZCA9ICdvbkN1c3RvbVZpZXdTYXZlZCcsXG4gIE9uQ3VzdG9tVmlld1NldERlZmF1bHQgPSAnb25DdXN0b21WaWV3U2V0RGVmYXVsdCcsXG4gIE9uU3RvcnlQb2ludFN3aXRjaGVkID0gJ29uU3RvcnlQb2ludFN3aXRjaGVkJyxcbiAgT25TdW1tYXJ5RGF0YUNoYW5nZWQgPSAnb25TdW1tYXJ5RGF0YUNoYW5nZWQnLFxuICBPblJlYWR5VG9SZWNlaXZlQXV0aFRva2VuID0gJ29uUmVhZHlUb1JlY2VpdmVBdXRoVG9rZW4nLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBIVE1MIGF0dHJpYnV0ZXMgZm9yIHRoZSA8dGFibGVhdS1hdXRob3Jpbmctdml6PiB3ZWIgY29tcG9uZW50LlxuICogQGlnbm9yZVxuICovXG5leHBvcnQgZW51bSBWaXpBdXRob3JpbmdBdHRyaWJ1dGVzIHtcbiAgT25Xb3JrYm9va1B1Ymxpc2hlZCA9ICdvbldvcmtib29rUHVibGlzaGVkJyxcbiAgT25Xb3JrYm9va1B1Ymxpc2hlZEFzID0gJ29uV29ya2Jvb2tQdWJsaXNoZWRBcycsXG4gIE9uV29ya2Jvb2tSZWFkeVRvQ2xvc2UgPSAnb25Xb3JrYm9va1JlYWR5VG9DbG9zZScsXG4gIEhpZGVDbG9zZUJ1dHRvbiA9ICdoaWRlLWNsb3NlLWJ1dHRvbicsXG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIGNoaWxkIHRhZ3MgZm9yIFRhYmxlYXVWaXogYW5kIFRhYmxlYXVBdXRob3JpbmdWaXogY3VzdG9tIGVsZW1lbnRzLlxuICovXG5leHBvcnQgZW51bSBWaXpDaGlsZEVsZW1lbnRzIHtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgbGlzdCBvZiBmaWx0ZXIgcGFyYW1ldGVycy4gQXZhaWxhYmxlIG9ubHkgaW4gdmlld2luZyBtb2RlLlxuICAgKi9cbiAgVml6RmlsdGVyID0gJ3Zpei1maWx0ZXInLFxuXG4gIC8qKlxuICAgKiBDb250YWlucyBhIG5hbWUgYW5kIHZhbHVlIGZvciBhIHBhcmFtZXRlci4gQXZhaWxhYmxlIG9ubHkgaW4gdmlld2luZyBtb2RlLlxuICAgKi9cbiAgVml6UGFyYW1ldGVyID0gJ3Zpei1wYXJhbWV0ZXInLFxuXG4gIC8qKlxuICAgKiBDb250YWlucyBhIGxpc3Qgb2YgY3VzdG9tIHBhcmFtZXRlcnMuICBBdmFpbGFibGUgaW4gYm90aCB2aWV3aW5nIGFuZCBhdXRob3JpbmcgbW9kZXMuXG4gICAqL1xuICBDdXN0b21QYXJhbWV0ZXIgPSAnY3VzdG9tLXBhcmFtZXRlcicsXG5cbiAgLyoqXG4gICAqIEN1c3RvbSBzdHlsZXMgYXBwbGljYWJsZSB0byB0aGUgZW1iZWRkZWQgaWZyYW1lIGVsZW1lbnQgaXRzZWxmIChub3QgaW5zaWRlIGl0KS4gQXZhaWxhYmxlIGluIGJvdGggdmlld2luZyBhbmQgYXV0aG9yaW5nIG1vZGVzLlxuICAgKi9cbiAgSWZyYW1lU3R5bGUgPSAnaWZyYW1lLXN0eWxlJyxcbn1cblxuZXhwb3J0IGVudW0gVml6Q2hpbGRFbGVtZW50QXR0cmlidXRlcyB7XG4gIEZpZWxkID0gJ2ZpZWxkJyxcbiAgVmFsdWUgPSAndmFsdWUnLFxuICBOYW1lID0gJ25hbWUnLFxufVxuXG4vKipcbiAqIFRoZSBpbnRlcmZhY2UgZm9yIHRoZSB0b3AgbGV2ZWwgVml6IG9iamVjdC5cbiAqKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6IGV4dGVuZHMgVml6U2V0dGluZ3MsIFdlYkNvbXBvbmVudExvY2FsU2V0dGluZ3MsIFZpekFjdGlvbnMge1xuICAvKipcbiAgICogT25lIFdvcmtib29rIGlzIHN1cHBvcnRlZCBwZXIgdmlzdWFsaXphdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtib29rPzogV29ya2Jvb2s7XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYW4gYXV0aCB0b2tlbiBmb3Igc2FsZXNmb3JjZSBuYXRpdmUgbW9kZVxuICAgKiBAcGFyYW0gdG9rZW5cbiAgICovXG4gIHNldEF1dGhUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZDtcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIGZvciB0aGUgdG9wIGxldmVsIEF1dGhvcmluZyBWaXogb2JqZWN0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhvcmluZ1ZpeiBleHRlbmRzIFZpekF1dGhvcmluZ1NldHRpbmdzLCBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHZpc3VhbGl6YXRpb24ncyBjdXJyZW50IFVSTC5cbiAgICovXG4gIGdldEN1cnJlbnRTcmNBc3luYygpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFByb3ZpZGUgYW4gYXV0aCB0b2tlbiBmb3Igc2FsZXNmb3JjZSBuYXRpdmUgbW9kZVxuICAgKiBAcGFyYW0gdG9rZW5cbiAgICovXG4gIHNldEF1dGhUb2tlbih0b2tlbjogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHJlYWRqdXN0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbWJlZGRlZCB2aXogaW4gcmVzcG9uc2UgdG8gdGhpbmdzIGxpa2UgYSB3aW5kb3cgcmVzaXplLCBkZXZpY2Ugb3JpZW50YXRpb24gY2hhbmdlLCBvclxuICAgKiBwYXJlbnQgY29udGFpbmVyIHJlc2l6ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB2aXoucmVzaXplKCkpO1xuICAgKlxuICAgKiBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdml6LnJlc2l6ZSgpKS5vYnNlcnZlKHZpei5wYXJlbnRFbGVtZW50KTtcbiAgICogYGBgXG4gICAqL1xuICByZXNpemUoKTogdm9pZDtcblxuICAvKipcbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGxhdW5jaCB0aGUgQW5hbHl0aWNzIEFzc2lzdGFudCBzaWRlIHBhbmUuXG4gICAqIFlvdSBjYW4gdXNlIHRoZSBgaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGVBc3luYygpYCBtZXRob2QgdG8gY2hlY2sgaWYgdGhlIEFuYWx5dGljcyBBc3Npc3RhbnQgaXMgYXZhaWxhYmxlIGZvciB1c2UuXG4gICAqXG4gICAqIGBgYFxuICAgKiBjb25zdCBpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZSA9IGF3YWl0IHZpei5pc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZUFzeW5jKCk7XG4gICAqIGlmIChpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZSkge1xuICAgKiAgIGF3YWl0IHZpei5sYXVuY2hBbmFseXRpY3NBc3Npc3RhbnRBc3luYygpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgbGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50QXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIEFuYWx5dGljcyBBc3Npc3RhbnQgc2lkZSBwYW5lIGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIGlzQW5hbHl0aWNzQXNzaXN0YW50QXZhaWxhYmxlQXN5bmMoKTogUHJvbWlzZTxib29sZWFuPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc2VydmVyIHNlc3Npb24gaW5mb3JtYXRpb24gZm9yIHVzZSB3aXRoIFZpelFMIERhdGEgU2VydmljZS5cbiAgICogVGhlIHNlcnZlciBzZXNzaW9uIGluZm9ybWF0aW9uIGNvbnRhaW5zIHRoZSBWaXpRTCBTZXJ2ZXIgU2Vzc2lvbiBJRCBhbmQgdGhlIEdsb2JhbCBTZXNzaW9uIEhlYWRlci5cbiAgICovXG4gIGdldFZpelFMRGF0YVNlcnZpY2VTZXNzaW9uSW5mbygpOiBWaXpRTERhdGFTZXJ2aWNlU2Vzc2lvbkluZm87XG59XG5cbi8qKlxuICogUGFydGlhbGx5IGltcGxlbWVudGVkIC0gQWN0aW9ucyByZWxhdGVkIHRvIGV2ZW50cyBhbmQgc3RhdGUgb2YgdGhlIHZpelxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpekFjdGlvbnMge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgYXV0b21hdGljIHVwZGF0ZXMgYXJlIGN1cnJlbnRseSBwYXVzZWQuXG4gICAqL1xuICByZWFkb25seSBhdXRvbWF0aWNVcGRhdGVzQXJlUGF1c2VkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBQYXVzZSBsYXlvdXQgdXBkYXRlcy4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGFyZSByZXNpemluZyB0aGUgdmlzdWFsaXphdGlvbiBvciBwZXJmb3JtaW5nIG11bHRpcGxlIGNhbGxzIHRoYXQgY291bGQgYWZmZWN0IHRoZSBsYXlvdXQuXG4gICAqL1xuICBwYXVzZUF1dG9tYXRpY1VwZGF0ZXNBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBSZXN1bWUgbGF5b3V0IHVwZGF0ZXMuXG4gICAqL1xuICByZXN1bWVBdXRvbWF0aWNVcGRhdGVzQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVG9nZ2xlIGxheW91dCB1cGRhdGVzLlxuICAgKi9cbiAgdG9nZ2xlQXV0b21hdGljVXBkYXRlc0FzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gdGhlIFJldmVydCBBbGwgdG9vbGJhciBidXR0b24sIHdoaWNoIHJlc3RvcmVzIHRoZSB3b3JrYm9vayB0byBpdHMgc3RhcnRpbmcgc3RhdGUuXG4gICAqL1xuICByZXZlcnRBbGxBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFcXVpdmFsZW50IHRvIGNsaWNraW5nIG9uIHRoZSBSZWZyZXNoIERhdGEgdG9vbGJhciBidXR0b24uXG4gICAqL1xuICByZWZyZXNoRGF0YUFzeW5jKCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEVxdWl2YWxlbnQgdG8gY2xpY2tpbmcgb24gRG93bmxvYWQgPiBJbWFnZSBmcm9tIHRoZSB0b29sYmFyLCB3aGljaCBjcmVhdGVzIGEgUE5HIGZpbGUgb2YgdGhlIGN1cnJlbnQgdmlzdWFsaXphdGlvbi5cbiAgICovXG4gIGV4cG9ydEltYWdlQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXhwb3J0cyB0aGUgY3Jvc3N0YWIgb2YgYW55IGdpdmVuIHdvcmtzaGVldCB3aXRoaW4gdGhlIGN1cnJlbnQgdmlldyB0byBhXG4gICAqIHNwZWNpZmllZCBmb3JtYXQgKENyb3NzdGFiRmlsZUZvcm1hdC5FeGNlbCwgQ3Jvc3N0YWJGaWxlRm9ybWF0LkNTVikuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgc2hlZXQgbmFtZSBkb2VzIG5vdCBtYXRjaCBhbnkgd29ya3NoZWV0cyB3aXRoaW4gdGhlIGFjdGl2ZSBzaGVldC5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBjcm9zc3RhYiBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkLlxuICAgKiA+WyFOb3RlXSBgZXhwb3J0Q3Jvc3N0YWJBc3luY2AgcmVzb2x2ZXMgd2hlbiBhIGRvd25sb2FkIGlzIGluaXRpYXRlZC4gSXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGlmIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogdml6LmV4cG9ydENyb3NzdGFiQXN5bmMoJ1NhbGVzIGJ5IFNlZ21lbnQnLCBDcm9zc3RhYkZpbGVGb3JtYXQuQ1NWKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRDcm9zc3RhYkFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCBmb3JtYXQ6IENyb3NzdGFiRmlsZUZvcm1hdCk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEV4cG9ydHMgdGhlIHN1bW1hcnkgZGF0YSBzaG93biBpbiB0aGUgVmlldyBEYXRhIHdpbmRvd1xuICAgKiAoc2hvd24gd2hlbiB5b3UgY2xpY2sgRG93bmxvYWQgPiBEYXRhIGZyb20gdGhlIHRvb2xiYXIgZm9yIGFueSBnaXZlbiB3b3Jrc2hlZXQgd2l0aGluIHRoZSBjdXJyZW50IHZpZXcpLlxuICAgKiBUaGUgY3VycmVudCBmaWxlIGZvcm1hdCBpcyBDU1YuIFRoZXJlIGlzIG5vIGxpbWl0YXRpb24gb24gdGhlIGFtb3VudCBvZiBzdW1tYXJ5IGRhdGEgeW91IGNhbiBleHBvcnQuXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgc2hlZXQgbmFtZSBkb2VzIG5vdCBtYXRjaCBhbnkgd29ya3NoZWV0cyB3aXRoaW4gdGhlIGFjdGl2ZSBzaGVldC5cbiAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZC5cbiAgICogPlshTm90ZV0gYGV4cG9ydERhdGFBc3luY2AgcmVzb2x2ZXMgd2hlbiBhIGRvd25sb2FkIGlzIGluaXRpYXRlZC4gSXQgZG9lcyBub3QgaW5kaWNhdGUgdGhhdCBhIGRvd25sb2FkIHdhcyBzdWNjZXNzZnVsIG9yIGlmIHRoZSBkb3dubG9hZCB3YXMgY29tcGxldGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBsZXQgdml6ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmxlYXVWaXonKTtcbiAgICogY29uc3QgYWN0aXZlU2hlZXQgPSB2aXoud29ya2Jvb2suYWN0aXZlU2hlZXQ7XG4gICAqIGlmIChhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5Xb3Jrc2hlZXQpIHtcbiAgICogICBjb25zdCBjb2x1bW5zID0gYXdhaXQgYWN0aXZlU2hlZXQuZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTtcbiAgICogICAvLyBHZXR0aW5nIGZpZWxkSWQncyBmb3IgTGF0aXR1ZGUgYW5kIExvbmdpdHVkZSBjb2x1bW5zXG4gICAqICAgY29uc3QgY29sdW1uc1RvSW5jbHVkZUJ5SWQgPSBjb2x1bW5zLm1hcCgoY29sdW1uKSA9PiB7XG4gICAqICAgICBpZiAoY29sdW1uLmZpZWxkTmFtZSA9PT0gJ0xhdGl0dWRlJyB8fCBjb2x1bW4uZmllbGROYW1lID09PSAnTG9uZ2l0dWRlJykge1xuICAgKiAgICAgICByZXR1cm4gY29sdW1uLmZpZWxkSWQ7XG4gICAqICAgICB9XG4gICAqICAgfSk7XG4gICAqICAgYXdhaXQgdml6LmV4cG9ydERhdGFBc3luYyhhY3RpdmVTaGVldC5uYW1lLCB7IGNvbHVtbnNUb0luY2x1ZGVCeUlkIH0pO1xuICAgKiB9XG4gICAqIGVsc2UgaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLkRhc2hib2FyZCkge1xuICAgKiAgIC8vIEV4cG9ydGluZyB0aGUgc3VtbWFyeSBkYXRhIGZvciBlYWNoIHdvcmtzaGVldCBpbiB0aGUgZGFzaGJvYXJkIHdoaWxlIGFsc28gaWdub3JpbmcgYWxpYXNlc1xuICAgKiAgIGZvciAoY29uc3Qgd29ya3NoZWV0IG9mIGFjdGl2ZVNoZWV0LndvcmtzaGVldHMpIHtcbiAgICogICAgIGF3YWl0IHZpei5leHBvcnREYXRhQXN5bmMod29ya3NoZWV0Lm5hbWUsIHsgaWdub3JlQWxpYXNlczogdHJ1ZSB9KTtcbiAgICogICB9XG4gICAqIH1cbiAgICogZWxzZVxuICAgKiB7XG4gICAqICAgLy8gYWN0aXZlU2hlZXQgaXMgYSBTdG9yeSBhbmQgd2Ugd2FudCB0byBleHBvcnQgd29ya3NoZWV0cyB3aXRoaW4gdGhlIGN1cnJlbnQgdmlld1xuICAgKiAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0ID0gYWN0aXZlU2hlZXQuYWN0aXZlU3RvcnlQb2ludC5jb250YWluZWRTaGVldDtcbiAgICogICBpZiAoY29udGFpbmVkU2hlZXQgIT09IHVuZGVmaW5lZCAmJiBjb250YWluZWRTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5Xb3Jrc2hlZXQpIHtcbiAgICogICAgIC8vIEV4cG9ydGluZyBzdW1tYXJ5IGRhdGEgb2YgYSB3b3Jrc2hlZXQgd2l0aGluIHRoZSBhY3RpdmUgc3RvcnkgcG9pbnRcbiAgICogICAgIGF3YWl0IHZpei5leHBvcnREYXRhQXN5bmMoY29udGFpbmVkU2hlZXQubmFtZSk7XG4gICAqICAgfSBlbHNlIGlmIChjb250YWluZWRTaGVldCAhPT0gdW5kZWZpbmVkICYmIGNvbnRhaW5lZFNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLkRhc2hib2FyZCkge1xuICAgKiAgICAgLy8gRXhwb3J0aW5nIHRoZSBzdW1tYXJ5IGRhdGEgZm9yIGVhY2ggd29ya3NoZWV0IHdpdGhpbiB0aGUgYWN0aXZlIHN0b3J5IHBvaW50XG4gICAqICAgICBmb3IgKGNvbnN0IHdvcmtzaGVldCBvZiBjb250YWluZWRTaGVldC53b3Jrc2hlZXRzKSB7XG4gICAqICAgICAgIGF3YWl0IHZpei5leHBvcnREYXRhQXN5bmMod29ya3NoZWV0Lm5hbWUpO1xuICAgKiAgICAgfVxuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIGV4cG9ydERhdGFBc3luYyhzaGVldE5hbWU6IHN0cmluZywgb3B0aW9ucz86IEV4cG9ydERhdGFPcHRpb25zKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogRXhwb3J0cyB0aGUgbGlzdCBvZiBzaGVldHMgdG8gYSBQb3dlclBvaW50IGZpbGUuIElmIG5vIHNoZWV0cyBhcmUgc3BlY2lmaWVkLCB0aGUgY3VycmVudCBzaGVldCBpcyBleHBvcnRlZC5cbiAgICogVGhlIG9yZGVyIHRoZSBzaGVldHMgYXBwZWFyIGluIHRoZSBsaXN0IGlzIHRoZSBvcmRlciB0aGUgc2hlZXRzIGFwcGVhciBpbiB0aGUgUG93ZXJQb2ludCBmaWxlLlxuICAgKiBUaGUgbGlzdCBvZiBzaGVldHMgY2FuIGVpdGhlciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBvciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSBwdWJsaXNoZWQgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGxpc3Qgb2Ygc2hlZXRzIGNvbnRhaW5zIGJvdGggd29ya3NoZWV0cyB3aXRoaW4gYSBkYXNoYm9hcmQgYW5kIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgUG93ZXJQb2ludCBmaWxlIGZhaWxzIHRvIGJlIGNyZWF0ZWQuXG4gICAqXG4gICAqID5bIU5vdGVdIGBleHBvcnRQb3dlclBvaW50QXN5bmNgIHJlc29sdmVzIHdoZW4gYSBkb3dubG9hZCBpcyBpbml0aWF0ZWQuIEl0IGRvZXMgbm90IGluZGljYXRlIHRoYXQgYSBkb3dubG9hZCB3YXMgc3VjY2Vzc2Z1bCBvciBpZiB0aGUgZG93bmxvYWQgd2FzIGNvbXBsZXRlLlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIGNvbnN0IHdvcmtib29rID0gdml6Lndvcmtib29rO1xuICAgKiBjb25zdCBhY3RpdmVTaGVldCA9IHdvcmtib29rLmFjdGl2ZVNoZWV0O1xuICAgKiBpZiAoYWN0aXZlU2hlZXQuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuV29ya3NoZWV0IHx8IGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLlN0b3J5KSB7XG4gICAqICAgYXdhaXQgdml6LmV4cG9ydFBvd2VyUG9pbnRBc3luYygpO1xuICAgKiB9IGVsc2UgaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gIFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICBjb25zdCB3b3Jrc2hlZXROYW1lcyA9IGFjdGl2ZVNoZWV0LndvcmtzaGVldHMubWFwKCh3b3Jrc2hlZXQpID0+IHdvcmtzaGVldC5uYW1lKTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKHdvcmtzaGVldE5hbWVzKTtcbiAgICogfVxuICAgKiAvLyBleHBvcnRpbmcgYWxsIHNoZWV0cyB3aXRoaW4gdGhlIHdvcmtib29rIHRvIFBvd2VyUG9pbnRcbiAgICogY29uc3QgcHVibGlzaGVkU2hlZXROYW1lcyA9IHdvcmtib29rLnB1Ymxpc2hlZFNoZWV0c0luZm8ubWFwKChwdWJsaXNoZWRTaGVldEluZm8pID0+IHB1Ymxpc2hlZFNoZWV0SW5mby5uYW1lKTtcbiAgICogYXdhaXQgdml6LmV4cG9ydFBvd2VyUG9pbnRBc3luYyhwdWJsaXNoZWRTaGVldE5hbWVzKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRQb3dlclBvaW50QXN5bmMoc2hlZXROYW1lcz86IEFycmF5PHN0cmluZz4pOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBFeHBvcnRzIHRoZSBsaXN0IG9mIHNoZWV0cyB3aXRoIHRoZSBnaXZlbiB7QGxpbmsgRXhwb3J0UERGT3B0aW9uc30gb3B0aW9ucy4gSWYgbm8gc2hlZXRzIGFyZSBzcGVjaWZpZWQsIHRoZSBjdXJyZW50IHNoZWV0IGlzIGV4cG9ydGVkLlxuICAgKiBUaGUgbGlzdCBvZiBzaGVldHMgY2FuIGVpdGhlciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSB3b3Jrc2hlZXRzIHdpdGhpbiBhIGRhc2hib2FyZCBvciBleGNsdXNpdmVseSBpbmNsdWRlIHRoZSBwdWJsaXNoZWQgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKiBJZiBubyBFeHBvcnRQREZPcHRpb25zIGFyZSBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IHNldHRpbmdzIGFyZTogU2NhbGluZyA9IEF1dG9tYXRpYywgUGFnZVNpemUgPSBMZXR0ZXIsIGFuZCBPcmllbnRhdGlvbiA9IFBvcnRyYWl0LlxuICAgKlxuICAgKiBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIGxpc3Qgb2Ygc2hlZXRzIGNvbnRhaW5zIGJvdGggd29ya3NoZWV0cyB3aXRoaW4gYSBkYXNoYm9hcmQgYW5kIHB1Ymxpc2hlZCBzaGVldHMgZnJvbSB0aGUgd29ya2Jvb2suXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiB0aGUgUERGIGZpbGUgZmFpbHMgdG8gYmUgY3JlYXRlZC5cbiAgICpcbiAgICogPlshTm90ZV0gYGV4cG9ydFBERkFzeW5jYCByZXNvbHZlcyB3aGVuIGEgZG93bmxvYWQgaXMgaW5pdGlhdGVkLiBJdCBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IGEgZG93bmxvYWQgd2FzIHN1Y2Nlc3NmdWwgb3IgaWYgdGhlIGRvd25sb2FkIHdhcyBjb21wbGV0ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIGxldCB2aXogPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndGFibGVhdVZpeicpO1xuICAgKiBjb25zdCB3b3JrYm9vayA9IHZpei53b3JrYm9vaztcbiAgICogY29uc3QgYWN0aXZlU2hlZXQgPSB3b3JrYm9vay5hY3RpdmVTaGVldDtcbiAgICogaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gU2hlZXRUeXBlLldvcmtzaGVldCB8fCBhY3RpdmVTaGVldC5zaGVldFR5cGUgPT09IFNoZWV0VHlwZS5TdG9yeSkge1xuICAgKiAgIGF3YWl0IHZpei5leHBvcnRQREZBc3luYygpO1xuICAgKiB9IGVsc2UgaWYgKGFjdGl2ZVNoZWV0LnNoZWV0VHlwZSA9PT0gIFNoZWV0VHlwZS5EYXNoYm9hcmQpIHtcbiAgICogICBjb25zdCB3b3Jrc2hlZXROYW1lcyA9IGFjdGl2ZVNoZWV0LndvcmtzaGVldHMubWFwKCh3b3Jrc2hlZXQpID0+IHdvcmtzaGVldC5uYW1lKTtcbiAgICogICBhd2FpdCB2aXouZXhwb3J0UERGQXN5bmMod29ya3NoZWV0TmFtZXMpO1xuICAgKiB9XG4gICAqIC8vIGV4cG9ydGluZyBhbGwgc2hlZXRzIHdpdGhpbiB0aGUgd29ya2Jvb2sgdG8gUERGXG4gICAqIGNvbnN0IHB1Ymxpc2hlZFNoZWV0TmFtZXMgPSB3b3JrYm9vay5wdWJsaXNoZWRTaGVldHNJbmZvLm1hcCgocHVibGlzaGVkU2hlZXRJbmZvKSA9PiBwdWJsaXNoZWRTaGVldEluZm8ubmFtZSk7XG4gICAqIGF3YWl0IHZpei5leHBvcnRQREZBc3luYyhwdWJsaXNoZWRTaGVldE5hbWVzKTtcbiAgICogYGBgXG4gICAqL1xuICBleHBvcnRQREZBc3luYyhzaGVldE5hbWVzPzogQXJyYXk8c3RyaW5nPiwgb3B0aW9ucz86IEV4cG9ydFBERk9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBEaXNwbGF5IG9uZSBvZiB0aGUgZXhwb3J0IGRpYWxvZ3MgYmFzZWQgb24gdGhlIGRpYWxvZ1R5cGUgcGFyYW1ldGVyXG4gICAqXG4gICAqIFRocm93cyBhbiBlcnJvciBpZiBkaWFsb2dUeXBlIGlzIGludmFsaWRcbiAgICovXG4gIGRpc3BsYXlEaWFsb2dBc3luYyhkaWFsb2dUeXBlOiBUYWJsZWF1RGlhbG9nVHlwZSk6IFByb21pc2U8dm9pZD47XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHZpc3VhbGl6YXRpb24ncyBjdXJyZW50IFVSTC5cbiAgICovXG4gIGdldEN1cnJlbnRTcmNBc3luYygpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFJlZG9lcyB0aGUgbGFzdCBhY3Rpb24gcGVyZm9ybWVkIG9uIGEgc2hlZXQuXG4gICAqL1xuICByZWRvQXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogVW5kb2VzIHRoZSBsYXN0IGFjdGlvbiBwZXJmb3JtZWQgb24gYSBzaGVldC5cbiAgICovXG4gIHVuZG9Bc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBBZGRzIGFuIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBzcGVjaWZpZWQgZXZlbnQuXG4gICAqXG4gICAqIGBgYFxuICAgKiBhc3luYyBmdW5jdGlvbiBnZXRTZWxlY3RlZE1hcmtzKGV2ZW50KSB7XG4gICAqICAgICBjb25zdCBtYXJrc1NlbGVjdGVkID0gYXdhaXQgZXZlbnQuZGV0YWlsLmdldE1hcmtzQXN5bmMoKTtcbiAgICogICAgIGNvbnN0IG51bU1hcmtzID0gbWFya3NTZWxlY3RlZC5kYXRhWzBdLmRhdGEubGVuZ3RoO1xuICAgKiAgICAgY29uc29sZS5sb2coYCR7bnVtTWFya3N9IG1hcmtzIFNlbGVjdGVkYCk7XG4gICAqIH1cbiAgICpcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5hZGRFdmVudExpc3RlbmVyKFwibWFya3NlbGVjdGlvbmNoYW5nZWRcIiwgZ2V0U2VsZWN0ZWRNYXJrcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRXZlbnRMaXN0ZW5lcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCwgb3B0aW9ucz86IGJvb2xlYW4gfCBBZGRFdmVudExpc3RlbmVyT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSB0aGUgc3BlY2lmaWVkIGV2ZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogbGV0IHZpeiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJsZWF1Vml6Jyk7XG4gICAqIHZpei5yZW1vdmVFdmVudExpc3RlbmVyKFwibWFya3NlbGVjdGlvbmNoYW5nZWRcIiwgZ2V0U2VsZWN0ZWRNYXJrcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlLCBsaXN0ZW5lcjogRXZlbnRMaXN0ZW5lck9yRXZlbnRMaXN0ZW5lck9iamVjdCwgb3B0aW9ucz86IGJvb2xlYW4gfCBFdmVudExpc3RlbmVyT3B0aW9ucyk6IHZvaWQ7XG5cbiAgLyoqXG4gICAqIFVzZSB0aGlzIG1ldGhvZCB0byBmaWx0ZXIgdGhlIHZpeiBiZWZvcmUgaW5pdGlhbGl6YXRpb24uIElmIHVzZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIGl0IHdpbGwgcmUtcmVuZGVyIHRoZSB2aXouXG4gICAqIEZvciBmaWx0ZXJpbmcgYWZ0ZXIgaW5pdGlhbGl6YXRpb24sIHVzZSB0aGUgb3RoZXIgZmlsdGVyaW5nIG1ldGhvZHMsIHN1Y2ggYXMgYGFwcGx5RmlsdGVyQXN5bmNgLlxuICAgKlxuICAgKiBJZiB5b3UgYWRkIHRoZSBzYW1lIGZpbHRlciBmaWVsZHMgdXNpbmcgdGhlIGBhZGRGaWx0ZXIoKWAgbWV0aG9kIGFuZCBieSB1c2luZyB0aGUgYDx2aXotZmlsdGVyPmAgZWxlbWVudCBpbiB0aGUgYDx0YWJsZWF1LXZpej5gIHdlYiBjb21wb25lbnQsXG4gICAqIHlvdSBtaWdodCBleHBlcmllbmNlIHVuZXhwZWN0ZWQgYmVoYXZpb3IuXG4gICAqXG4gICAqIEBwYXJhbSBmaWVsZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIGZpbHRlciBvbi5cbiAgICogQHBhcmFtIHZhbHVlIFNpbmdsZSB2YWx1ZSBvciBhIGxpc3Qgb2YgY29tbWEgc2VwYXJhdGVkIHZhbHVlcyB0byBmaWx0ZXIgb24uXG4gICAqXG4gICAqIGBgYFxuICAgKiB2aXouYWRkRmlsdGVyKCdSZWdpb24nLCAnQ2VudHJhbCxXZXN0Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgYWRkRmlsdGVyKGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogdm9pZDtcblxuICAvKipcbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIHJlYWRqdXN0IHRoZSBkaW1lbnNpb25zIG9mIHRoZSBlbWJlZGRlZCB2aXogaW4gcmVzcG9uc2UgdG8gdGhpbmdzIGxpa2UgYSB3aW5kb3cgcmVzaXplLCBkZXZpY2Ugb3JpZW50YXRpb24gY2hhbmdlLCBvclxuICAgKiBwYXJlbnQgY29udGFpbmVyIHJlc2l6ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCAoKSA9PiB2aXoucmVzaXplKCkpO1xuICAgKlxuICAgKiBuZXcgUmVzaXplT2JzZXJ2ZXIoKCkgPT4gdml6LnJlc2l6ZSgpKS5vYnNlcnZlKHZpei5wYXJlbnRFbGVtZW50KTtcbiAgICogYGBgXG4gICAqL1xuICByZXNpemUoKTogdm9pZDtcblxuICAvKipcbiAgICogVXNlIHRoaXMgbWV0aG9kIHRvIGxhdW5jaCB0aGUgQW5hbHl0aWNzIEFzc2lzdGFudCBzaWRlIHBhbmUuXG4gICAqIFlvdSBjYW4gdXNlIHRoZSBgaXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGVBc3luYygpYCBtZXRob2QgdG8gY2hlY2sgaWYgdGhlIEFuYWx5dGljcyBBc3Npc3RhbnQgaXMgYXZhaWxhYmxlIGZvciB1c2UuXG4gICAqXG4gICAqIGBgYFxuICAgKiBjb25zdCBpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZSA9IGF3YWl0IHZpei5pc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZUFzeW5jKCk7XG4gICAqIGlmIChpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZSkge1xuICAgKiAgIGF3YWl0IHZpei5sYXVuY2hBbmFseXRpY3NBc3Npc3RhbnRBc3luYygpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgbGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50QXN5bmMoKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIEFuYWx5dGljcyBBc3Npc3RhbnQgc2lkZSBwYW5lIGlzIGF2YWlsYWJsZS5cbiAgICovXG4gIGlzQW5hbHl0aWNzQXNzaXN0YW50QXZhaWxhYmxlQXN5bmMoKTogUHJvbWlzZTxib29sZWFuPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWaXpTaXplIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHNoZWV0U2l6ZSByZWNvcmQgZm9yIHRoZSBjdXJyZW50IHNoZWV0XG4gICAqL1xuICByZWFkb25seSBzaGVldFNpemU6IFNoZWV0U2l6ZTtcblxuICAvKipcbiAgICogR2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBUYWJsZWF1IFVJIGVsZW1lbnRzICh0aGUgY2hyb21lKSBzdXJyb3VuZGluZyB0aGUgdmlldy5cbiAgICovXG4gIHJlYWRvbmx5IGNocm9tZUhlaWdodDogbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIG9mIHRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHZpeiB0aGF0IGFyZSBjb21tb24gYmV0d2VlblxuICogdmlld2luZyBhbmQgYXV0aG9yaW5nIG1vZGUuXG4gKi9cbmludGVyZmFjZSBWaXpTZXR0aW5nc1NoYXJlZCBleHRlbmRzIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIHRvdWNoIG9wdGltaXplIHZpeiBjb250cm9scy5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiB0b3VjaC1vcHRpbWl6ZSAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIHRvdWNoLW9wdGltaXplIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG91Y2hPcHRpbWl6ZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBFZGl0IGluIERlc2t0b3AgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyB0aGF0IHRoZSBFZGl0IGluIERlc2t0b3AgYnV0dG9uIGlzIHZpc2libGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaGlkZS1lZGl0LWluLWRlc2t0b3AtYnV0dG9uPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtZWRpdC1pbi1kZXNrdG9wLWJ1dHRvbj5cbiAgICogYGBgXG4gICAqL1xuICBoaWRlRWRpdEluRGVza3RvcEJ1dHRvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRoZSBkZWZhdWx0IGVkaXQgYmVoYXZpb3IgaXMgc3VwcHJlc3NlZC5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gZmFsc2UsIG1lYW5pbmcgdGhhdCB0aGUgZGVmYXVsdCBlZGl0IGJlaGF2aW9yIGlzIG5vdCBzdXBwcmVzc2VkLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIHN1cHByZXNzLWRlZmF1bHQtZWRpdC1iZWhhdmlvcj5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBzdXBwcmVzcy1kZWZhdWx0LWVkaXQtYmVoYXZpb3I+XG4gICAqIGBgYFxuICAgKi9cbiAgc3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHVzZXIgY2xpY2tzIG9uIHRoZSBFZGl0IEluIERlc2t0b3AgQnV0dG9uLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZD1cIm9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWRIYW5kbGVyXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkVkaXRJbkRlc2t0b3BCdXR0b25DbGlja2VkPVwib25FZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBzaXplIG9mIHRoZSB2aXogaXMga25vd24uIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdG8gcGVyZm9ybSB0YXNrcyBzdWNoIGFzIHJlc2l6aW5nXG4gICAqIHRoZSBlbGVtZW50cyBzdXJyb3VuZGluZyB0aGUgVml6IG9iamVjdCBvbmNlIHRoZSBvYmplY3QncyBzaXplIGhhcyBiZWVuIGVzdGFibGlzaGVkLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIFwib25GaXJzdFZpelNpemVLbm93blwiPVwib25GaXJzdFZpelNpemVLbm93bkhhbmRsZXJcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uRmlyc3RWaXpTaXplS25vd249XCJvbkZpcnN0Vml6U2l6ZUtub3duSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25GaXJzdFZpelNpemVLbm93bj86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIFZpeiBvYmplY3QgZmlyc3QgYmVjb21lcyBpbnRlcmFjdGl2ZS4gVGhpcyBpcyBvbmx5IHJhaXNlZCBvbmNlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIFwib25GaXJzdEludGVyYWN0aXZlXCI9XCJvbkZpcnN0SW50ZXJhY3RpdmVIYW5kbGVyXCIgLz5cbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkZpcnN0SW50ZXJhY3RpdmU9XCJvbkZpcnN0SW50ZXJhY3RpdmVIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkZpcnN0SW50ZXJhY3RpdmU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogVGhlIG9wdGlvbnMgZm9yIGNvbmZpZ3VyaW5nIGEgdml6IGluIHZpZXcgbW9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBWaXpTZXR0aW5ncyBleHRlbmRzIFZpelNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRvIHN1cHByZXNzIHRoZSBleGVjdXRpb24gb2YgVVJMIGFjdGlvbnMuIFRoaXMgb3B0aW9uIGRvZXMgbm90IHByZXZlbnQgdGhlIFVSTCBhY3Rpb25cbiAgICogZXZlbnQgZnJvbSBiZWluZyByYWlzZWQuIFlvdSBjYW4gdXNlIHRoaXMgb3B0aW9uIHRvIGNoYW5nZSB3aGF0IGhhcHBlbnMgd2hlbiBhIFVSTCBhY3Rpb24gb2NjdXJzLiBJZiBzZXRcbiAgICogdG8gdHJ1ZSBhbmQgeW91IGNyZWF0ZSBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIFVSTF9BQ1RJT04gZXZlbnQsIHlvdSBjYW4gdXNlIGFuIGV2ZW50IGxpc3RlbmVyXG4gICAqIGhhbmRsZXIgdG8gY3VzdG9taXplIHRoZSBhY3Rpb25zLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGRpc2FibGUtdXJsLWFjdGlvbnMgLz5cbiAgICogYGBgXG4gICAqL1xuICBkaXNhYmxlVXJsQWN0aW9uc1BvcHVwcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRhYnMgYXJlIGhpZGRlbiBvciBzaG93bi5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgaGlkZS10YWJzIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZVRhYnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSB0b29sYmFyLCBpZiBpdCBpcyBzaG93bi4gVGhlIHZhbHVlcyBjYW4gYmUgVG9vbGJhci5Ub3AsXG4gICAqIFRvb2xiYXIuQm90dG9tIG9yIFRvb2xiYXIuSGlkZGVuLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkLCBkZWZhdWx0cyB0byBUb29sYmFyLkJvdHRvbS5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiAgdG9vbGJhcj1cImhpZGRlblwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgdG9vbGJhcj86IFRvb2xiYXI7XG5cbiAgLyoqXG4gICAqIFNwZWNpZmllcyBhIGRldmljZSBsYXlvdXQgZm9yIGEgZGFzaGJvYXJkLCBpZiBpdCBleGlzdHMuXG4gICAqIFZhbHVlcyBjYW4gYmUgZGVmYXVsdCwgZGVza3RvcCwgdGFibGV0LCBvciBwaG9uZS5cbiAgICogSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gbG9hZGluZyBhIGxheW91dCBiYXNlZCBvbiB0aGVcbiAgICogc21hbGxlc3QgZGltZW5zaW9uIG9mIHRoZSBob3N0aW5nIGlmcmFtZSBlbGVtZW50LlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiICBkZXZpY2U9XCJkZXNrdG9wXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBkZXZpY2U/OiBEZXZpY2VUeXBlO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZpZXMgdGhlIElEIG9mIGFuIGV4aXN0aW5nIGluc3RhbmNlIHRvIG1ha2UgYSBjb3B5IChjbG9uZSkgb2YuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSB1c2VyIHdhbnRzIHRvIGNvbnRpbnVlIGFuYWx5c2lzIG9mIGFuIGV4aXN0aW5nIHZpc3VhbGl6YXRpb25cbiAgICogd2l0aG91dCBsb3NpbmcgdGhlIHN0YXRlIG9mIHRoZSBvcmlnaW5hbC4gSWYgdGhlIElEIGRvZXMgbm90IHJlZmVyIHRvIGFuIGV4aXN0aW5nIHZpc3VhbGl6YXRpb24sXG4gICAqIHRoZSBjbG9uZWQgdmVyc2lvbiBpcyBkZXJpdmVkIGZyb20gdGhlIG9yaWdpbmFsIHZpc3VhbGl6YXRpb24uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgIGluc3RhbmNlLWlkLXRvLWNsb25lPVwiaWQxXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBpbnN0YW5jZUlkVG9DbG9uZT86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIEVkaXQgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyB0aGF0IHRoZSBFZGl0IGJ1dHRvbiBpcyB2aXNpYmxlLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGhpZGUtZWRpdC1idXR0b24+XG4gICAqIGBgYFxuICAgKi9cbiAgaGlkZUVkaXRCdXR0b24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgdXNlciBjbGlja3Mgb24gdGhlIEVkaXQgQnV0dG9uLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uRWRpdEJ1dHRvbkNsaWNrZWQ9XCJvbkVkaXRCdXR0b25DbGlja2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25FZGl0QnV0dG9uQ2xpY2tlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYW55IGZpbHRlciBoYXMgY2hhbmdlZCBzdGF0ZS4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uRmlsdGVyQ2hhbmdlZD1cIm9uRmlsdGVyQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uRmlsdGVyQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gbWFyayBjb250ZXh0IG1lbnUgaXMgY2xpY2tlZC5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbU1hcmtDb250ZXh0TWVudUV2ZW50PVwib25DdXN0b21NYXJrQ29udGV4dE1lbnVFdmVudEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tTWFya0NvbnRleHRNZW51RXZlbnQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBzZWxlY3RlZCBtYXJrcyBvbiBhIHZpc3VhbGl6YXRpb24gaGF2ZSBjaGFuZ2VkLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCBUYWJsZWF1Vml6IG9iamVjdHMuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25NYXJrU2VsZWN0aW9uQ2hhbmdlZD1cIm9uTWFya1NlbGVjdGlvbkNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbk1hcmtTZWxlY3Rpb25DaGFuZ2VkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIHBhcmFtZXRlciBoYXMgaGFkIGl0cyB2YWx1ZSBtb2RpZmllZC4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1tQYXJhbWV0ZXJdXSBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uUGFyYW1ldGVyQ2hhbmdlZD1cIm9uUGFyYW1ldGVyQ2hhbmdlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uUGFyYW1ldGVyQ2hhbmdlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSB0b29sYmFyIGJ1dHRvbiBvciBjb250cm9sIGJlY29tZXMgYXZhaWxhYmxlIG9yIGJlY29tZXMgdW5hdmFpbGFibGUuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25Ub29sYmFyU3RhdGVDaGFuZ2VkPVwib25Ub29sYmFyU3RhdGVDaGFuZ2VkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25Ub29sYmFyU3RhdGVDaGFuZ2VkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIFVSTCBhY3Rpb24gb2NjdXJzLiBTZWUgdGhlIHtAbGluayBVcmxBY3Rpb25FdmVudH0gY2xhc3MuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25VcmxBY3Rpb249XCJvblVybEFjdGlvbkhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uVXJsQWN0aW9uPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgYWZ0ZXIgYSB0YWIgc3dpdGNoIG9jY3VycyAodGhlIGFjdGl2ZSBzaGVldCBoYXMgY2hhbmdlZCkuIEd1YXJhbnRlZXMgdGhlIHZpeiBvYmplY3Qgd2lsbCBiZSBpbnRlcmFjdGl2ZSBhZnRlciB0aGlzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uVGFiU3dpdGNoZWQ9XCJvblRhYlN3aXRjaGVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25UYWJTd2l0Y2hlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgZmluaXNoZWQgbG9hZGluZy4gVGhpcyBldmVudCBpcyByYWlzZWQgYWZ0ZXIgdGhlIGNhbGxiYWNrXG4gICAqIGZ1bmN0aW9uIGZvciB7QGxpbmsgVGFibGVhdUV2ZW50VHlwZS5GaXJzdEludGVyYWN0aXZlfSAoaWYgYW55KSBoYXMgYmVlbiBjYWxsZWQuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21WaWV3TG9hZGVkPVwib25DdXN0b21WaWV3TG9hZGVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25DdXN0b21WaWV3TG9hZGVkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHJlbW92ZWQuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgb25DdXN0b21WaWV3UmVtb3ZlZD1cIm9uQ3VzdG9tVmlld1JlbW92ZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbVZpZXdSZW1vdmVkPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiBhIGN1c3RvbSB2aWV3IGhhcyBiZWVuIHNhdmVkIChuZXdseSBjcmVhdGVkIG9yIHVwZGF0ZWQpLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uQ3VzdG9tVmlld1NhdmVkPVwib25DdXN0b21WaWV3U2F2ZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvbkN1c3RvbVZpZXdTYXZlZD86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gYSBjdXN0b20gdmlldyBoYXMgYmVlbiBzZXQgYXMgdGhlIGRlZmF1bHQgdmlldyBmb3IgYSB3b3JrYm9vay5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbkN1c3RvbVZpZXdTZXREZWZhdWx0PVwib25DdXN0b21WaWV3U2V0RGVmYXVsdEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uQ3VzdG9tVmlld1NldERlZmF1bHQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCBhZnRlciBhIG5ldyBzdG9yeSBwb2ludCBiZWNvbWVzIGFjdGl2ZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvblN0b3J5UG9pbnRTd2l0Y2hlZD1cIm9uU3RvcnlQb2ludFN3aXRjaGVkSGFuZGxlclwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgb25TdG9yeVBvaW50U3dpdGNoZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSBzdW1tYXJ5IGRhdGEgb24gYSB2aXN1YWxpemF0aW9uIGhhdmUgY2hhbmdlZC4gWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggVGFibGVhdVZpeiBvYmplY3RzLlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIG9uU3VtbWFyeURhdGFDaGFuZ2VkPVwib25TdW1tYXJ5RGF0YUNoYW5nZWRIYW5kbGVyXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBvblN1bW1hcnlEYXRhQ2hhbmdlZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiAoQmV0YSkgUmVwcmVzZW50cyB0aGUgb3B0aW9ucyBmb3IgY29uZmlndXJpbmcgYSB2aXogaW4gYXV0aG9yaW5nIG1vZGUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6QXV0aG9yaW5nU2V0dGluZ3MgZXh0ZW5kcyBWaXpTZXR0aW5nc1NoYXJlZCB7XG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgQ2xvc2UgYnV0dG9uIGlzIGhpZGRlbiBvciB2aXNpYmxlLlxuICAgKiBJZiBub3Qgc2V0LCBkZWZhdWx0cyB0byBmYWxzZSwgbWVhbmluZyB0aGF0IHRoZSBDbG9zZSBidXR0b24gaXMgdmlzaWJsZS5cbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaGlkZS1jbG9zZS1idXR0b24gLz5cbiAgICogYGBgXG4gICAqL1xuICBoaWRlQ2xvc2VCdXR0b24/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBBbiBldmVudCByYWlzZWQgd2hlbiB0aGUgd29ya2Jvb2sgaGFzIGJlZW4gcHVibGlzaGVkLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbldvcmtib29rUHVibGlzaGVkPVwib25Xb3JrYm9va1B1Ymxpc2hlZEhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uV29ya2Jvb2tQdWJsaXNoZWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIFwicHVibGlzaCBhc1wiIGlzIHN1Y2Nlc3NmdWwuIFRoaXMgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2hlbiB1c2luZyBlbWJlZGRlZCB3ZWIgYXV0aG9yaW5nIGZ1bmN0aW9uYWxpdHkuXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIG9uV29ya2Jvb2tQdWJsaXNoZWRBcz1cIm9uV29ya2Jvb2tQdWJsaXNoZWRBc0hhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uV29ya2Jvb2tQdWJsaXNoZWRBcz86IHN0cmluZztcblxuICAvKipcbiAgICogQW4gZXZlbnQgcmFpc2VkIHdoZW4gdGhlIHdvcmtib29rIGlzIHJlYWR5IHRvIGNsb3NlLiBUaGlzIG5vdGlmaWNhdGlvbiBpcyBzZW50IHdoZW4gdXNpbmcgZW1iZWRkZWQgd2ViIGF1dGhvcmluZyBmdW5jdGlvbmFsaXR5LlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtYXV0aG9yaW5nLXZpeiBpZD1cInRhYmxlYXVWaXpcIiBvbldvcmtib29rUmVhZHlUb0Nsb3NlPVwib25Xb3JrYm9va1JlYWR5VG9DbG9zZUhhbmRsZXJcIiAvPlxuICAgKiBgYGBcbiAgICovXG4gIG9uV29ya2Jvb2tSZWFkeVRvQ2xvc2U/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyUGFyYW1ldGVycyB7XG4gIGZpZWxkOiBzdHJpbmc7XG4gIHZhbHVlOiBzdHJpbmc7XG59XG5cbi8qKlxuICogVml6UGFyYW1ldGVycyBhcmUgdXNlZCB0byBzZXQgUGFyYW1ldGVyIHZhbHVlcyBvbiB0aGUgdml6LlxuICpcbiAqICogYGBgXG4gKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCI+XG4gKiAgPHZpei1wYXJhbWV0ZXIgbmFtZT1cInBhcmFtZXRlci1uYW1lXCIgdmFsdWU9XCJwYXJhbWV0ZXItdmFsdWVcIj48L3Zpei1wYXJhbWV0ZXI+XG4gKiA8L3RhYmxlYXUtdml6PlxuICogYGBgXG4gKlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpelBhcmFtZXRlciB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdG8gYmUgc2V0LlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWYWxpZCB2YWx1ZSBmb3IgdGhlIHBhcmFtZXRlciBiZWluZyBzZXQuXG4gICAqL1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIEN1c3RvbVBhcmFtZXRlcnMgYXJlIHVzZWQgdG8gcGFzcyBhbG9uZyBzZXR0aW5ncywgaW5mb3JtYXRpb24sIGV0Yy4sIHRoYXQgYXJlbid0IGV4cG9zZWQgb24gdGhlXG4gKiB0YWJsZWF1LXZpeiBlbGVtZW50LiBDdXN0b21QYXJhbWV0ZXJzIHdpbGwgb3ZlcnJpZGUgYXR0cmlidXRlcywgb3IgZmlsdGVycywgc2V0IG9uIHRoZSB0YWJsZWF1LXZpeiBlbGVtZW50LlxuICpcbiAqICogYGBgXG4gKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCI+XG4gKiAgPGN1c3RvbS1wYXJhbWV0ZXIgbmFtZT1cInBhcmFtZXRlci1uYW1lXCIgdmFsdWU9XCJwYXJhbWV0ZXItdmFsdWVcIj48L2N1c3RvbS1wYXJhbWV0ZXI+XG4gKiA8L3RhYmxlYXUtdml6PlxuICogYGBgXG4gKlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbVBhcmFtZXRlciB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBwYXJhbWV0ZXIgdG8gYmUgc2V0LlxuICAgKi9cbiAgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBWYWxpZCB2YWx1ZSBmb3IgdGhlIHBhcmFtZXRlciBiZWluZyBzZXQuXG4gICAqL1xuICB2YWx1ZTogc3RyaW5nO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBleHBvcnRpbmcgZGF0YS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeHBvcnREYXRhT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBEbyBub3QgdXNlIGFsaWFzZXMgc3BlY2lmaWVkIGluIHRoZSBkYXRhIHNvdXJjZSBpbiBUYWJsZWF1LiBEZWZhdWx0IGlzIGZhbHNlLlxuICAgKi9cbiAgaWdub3JlQWxpYXNlcz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBUaGUgY29sdW1ucyB0byBpbmNsdWRlIHNwZWNpZmllZCBieSBmaWVsZCBpZCwgaW5jbHVkZXMgYWxsIGJ5IGRlZmF1bHQuXG4gICAqIFRoZSBvcmRlciBvZiB0aGUgY29sdW1uIGlkcyBpbiB0aGUgYXJyYXkgZGV0ZXJtaW5lcyB0aGUgY29sdW1uIG9yZGVyIHNob3duIGluIHRoZSBzdW1tYXJ5IGRhdGEgdGFibGUuXG4gICAqL1xuICBjb2x1bW5zVG9JbmNsdWRlQnlJZD86IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhwb3J0UERGT3B0aW9ucyB7XG4gIHNjYWxpbmc6IFByaW50U2NhbGluZztcbiAgcGFnZVNpemU6IFByaW50UGFnZVNpemU7XG4gIG9yaWVudGF0aW9uOiBQcmludE9yaWVudGF0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydFNjZW5hcmlvc0ZvclBERkFuZFBvd2VyUG9pbnQge1xuICBjdXJyZW50U2hlZXROYW1lOiBzdHJpbmc7XG4gIGV4cG9ydGFibGVTaGVldE5hbWVzRnJvbURhc2hib2FyZDogQXJyYXk8c3RyaW5nPjtcbiAgZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tV29ya2Jvb2s6IEFycmF5PHN0cmluZz47XG59XG4iLCIvKipcbiAqIFNlcnZlciBzZXNzaW9uIGluZm9ybWF0aW9uIGZvciB1c2Ugd2l0aCBWaXpRTCBEYXRhIFNlcnZpY2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVml6UUxEYXRhU2VydmljZVNlc3Npb25JbmZvIHtcbiAgLyoqXG4gICAqIFRoZSBWaXpRTCBTZXJ2ZXIgc2Vzc2lvbiBJRCBmb3IgdXNlIHdpdGggVml6UUwgRGF0YSBTZXJ2aWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgdml6cWxTZXJ2ZXJTZXNzaW9uSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGdsb2JhbCBzZXNzaW9uIGhlYWRlciBmb3IgdXNlIHdpdGggVml6UUwgRGF0YSBTZXJ2aWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgZ2xvYmFsU2Vzc2lvbkhlYWRlcjogc3RyaW5nO1xufVxuIiwiLyoqXG4gKiBVc2VyIHN1cHBsaWVkIG9wdGlvbnMgdGhhdCBkbyBub3QgZ2V0IHBhc3NlZCBhcyByZXF1ZXN0IHBhcmFtZXRlcnMgdG8gbG9hZCBhIFRhYmxlYXUgdml6LCBUYWJsZWF1IGFza2RhdGFcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXZWJDb21wb25lbnRMb2NhbFNldHRpbmdzIHtcbiAgLyoqXG4gICAqIFRoZSB2aXogc3JjXG4gICAqL1xuICBzcmM/OiBzdHJpbmcgfCBudWxsO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIHdpZHRoIGluIHBpeGVsc1xuICAgKiBDYW4gYmUgYW55IHZhbGlkIENTUyBzaXplIHNwZWNpZmllci4gSWYgbm90IHNwZWNpZmllZCwgZGVmYXVsdHMgdG8gdGhlIHB1Ymxpc2hlZCB3aWR0aCBvZiB0aGUgdmlldy5cbiAgICovXG4gIHdpZHRoPzogc3RyaW5nIHwgbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBSZXByZXNlbnRzIGhlaWdodCBpbiBwaXhlbHNcbiAgICogQ2FuIGJlIGFueSB2YWxpZCBDU1Mgc2l6ZSBzcGVjaWZpZXIuIElmIG5vdCBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIHRoZSBwdWJsaXNoZWQgaGVpZ2h0IG9mIHRoZSB2aWV3LlxuICAgKi9cbiAgaGVpZ2h0Pzogc3RyaW5nIHwgbnVtYmVyO1xufVxuXG4vKipcbiAqIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYWxsIG9mIHRoZSBvcHRpb25zIGZvciBjb25maWd1cmluZyBhIHdlYmNvbXBvbmVudCB0aGF0IGFyZSBjb21tb24gYmV0d2VlblxuICogdml6IGFuZCBhc2tkYXRhLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdlYkNvbXBvbmVudFNldHRpbmdzU2hhcmVkIHtcbiAgLyoqXG4gICAqIFRoZSB0b2tlbiB1c2VkIGZvciBhdXRob3JpemF0aW9uXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgdG9rZW49XCJzb21lLXRva2VuLWNvbnRhaW5pbmctY2xpZW50SWRcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIHRva2VuPVwic29tZS10b2tlbi1jb250YWluaW5nLWNsaWVudElkXCIgLz5cbiAgICogYGBgXG4gICAqL1xuICB0b2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIG5vbi1taW5pZmllZCB2ZXJzaW9uIG9mIEphdmFTY3JpcHQgaXMgbG9hZGVkLiBJZiBzcGVjaWZpZWQgKG9yIHNldCB0byB0cnVlKSwgdGhlXG4gICAqIG5vbi1taW5pZmllZCB2ZXJzaW9uIGlzIHVzZWQgZm9yIGJvdGggdGhlIGxvY2FsIGNvbXBvbmVudCBhbmQgdGhlIFRhYmxlYXUgU2VydmVyIHZpc3VhbGl6YXRpb24gKGlmIGVuYWJsZWQpLlxuICAgKiBJZiBub3Qgc3BlY2lmaWVkIChvciBzZXQgdG8gZmFsc2UpLCB0aGUgbWluaWZpZWQgdmVyc2lvbiBvZiB0aGUgSmF2YVNjcmlwdCBmaWxlcyBhcmUgbG9hZGVkLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGRlYnVnIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgZGVidWcgLz5cbiAgICogPHRhYmxlYXUtYXNrLWRhdGEgaWQ9XCJ0YWJsZWF1QXNrRGF0YVwiIGRlYnVnIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgZGVidWc/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0byB1c2UgdGhlIG9sZCBhdXRoIG1lY2hhbmlzbSBmb3IgYXV0aGVudGljYXRpb24gd2hpY2ggaGFwcGVucyBpbnNpZGUgdGhlIGlmcmFtZS4gSWYgc3BlY2lmaWVkLCBWaXpMb2FkRXJyb3JFdmVudHNcbiAgICogdHJpZ2dlcmVkIGR1ZSB0byBhdXRoIGZhaWx1cmVzIHdpbGwgbm90IGJlIHRocm93bi5cbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXV0aCAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdXRoIC8+XG4gICAqIDx0YWJsZWF1LWFzay1kYXRhIGlkPVwidGFibGVhdUFza0RhdGFcIiBpZnJhbWUtYXV0aCAvPlxuICAgKiBgYGBcbiAgICovXG4gIGlmcmFtZUF1dGg/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdsb2FkaW5nJyBhdHRyaWJ1dGUgb2YgdGhlIGVtYmVkZGVkIGlmcmFtZS5cbiAgICogU2VlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaWZyYW1lI2xvYWRpbmdcbiAgICpcbiAgICogYGBgXG4gICAqIDx0YWJsZWF1LXZpeiBpZD1cInRhYmxlYXVWaXpcIiBpZnJhbWUtYXR0ci1sb2FkaW5nPVwibGF6eVwiIC8+XG4gICAqIDx0YWJsZWF1LWF1dGhvcmluZy12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItbG9hZGluZz1cImxhenlcIiAvPlxuICAgKiA8dGFibGVhdS1wdWxzZSBpZD1cInRhYmxlYXVQdWxzZVwiIGlmcmFtZS1hdHRyLWxvYWRpbmc9XCJsYXp5XCIgLz5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdHRyaWJ1dGVMb2FkaW5nPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdmFsdWUgb2YgdGhlICdzdHlsZScgYXR0cmlidXRlIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUuXG4gICAqXG4gICAqIGBgYFxuICAgKiA8dGFibGVhdS12aXogaWQ9XCJ0YWJsZWF1Vml6XCIgaWZyYW1lLWF0dHItc3R5bGU9XCJib3JkZXI6IDFweCBzb2xpZCByZWRcIiAvPlxuICAgKiA8dGFibGVhdS1hdXRob3Jpbmctdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLXN0eWxlPVwiYm9yZGVyOiAxcHggc29saWQgcmVkXCIgLz5cbiAgICogPHRhYmxlYXUtcHVsc2UgaWQ9XCJ0YWJsZWF1UHVsc2VcIiBpZnJhbWUtYXR0ci1zdHlsZT1cImJvcmRlcjogMXB4IHNvbGlkIHJlZFwiIC8+XG4gICAqIGBgYFxuICAgKi9cbiAgaWZyYW1lQXR0cmlidXRlU3R5bGU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSB2YWx1ZSBvZiB0aGUgJ2NsYXNzJyBhdHRyaWJ1dGUgb2YgdGhlIGVtYmVkZGVkIGlmcmFtZSBwcm92aWRpbmcgYWNjZXNzIHRvIGFueVxuICAgKiBjdXN0b20gc2VsZWN0b3JzIGRlZmluZWQgaW4gdGhlIGA8aWZyYW1lLXN0eWxlPmAgY2hpbGQgdGFnLlxuICAgKlxuICAgKiBgYGBcbiAgICogPHRhYmxlYXUtdml6IGlkPVwidGFibGVhdVZpelwiIGlmcmFtZS1hdHRyLWNsYXNzPVwicmVkLWJvcmRlclwiPlxuICAgKiAgIDxpZnJhbWUtc3R5bGU+XG4gICAqICAgICAucmVkLWJvcmRlciB7XG4gICAqICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIHJlZDtcbiAgICogICAgIH1cbiAgICogICA8L2lmcmFtZS1zdHlsZT5cbiAgICogPC90YWJsZWF1LXZpej5cbiAgICogYGBgXG4gICAqL1xuICBpZnJhbWVBdHRyaWJ1dGVDbGFzcz86IHN0cmluZztcbn1cblxuLyoqXG4gKiBUaGUgbmFtZXMgb2YgdGhlIGNvbW1vbiBzdHJpbmcgY29uc3RhbnRzIHlvdSBjYW4gdXNlIGFzIEhUTUwgYXR0cmlidXRlcyBmb3IgdGhlIHRhYmxlYXUgd2ViIGNvbXBvbmVudC5cbiAqIEBpZ25vcmVcbiAqL1xuZXhwb3J0IGVudW0gV2ViQ29tcG9uZW50QXR0cmlidXRlcyB7XG4gIFNyYyA9ICdzcmMnLFxuICBXaWR0aCA9ICd3aWR0aCcsXG4gIEhlaWdodCA9ICdoZWlnaHQnLFxuICBUb2tlbiA9ICd0b2tlbicsXG4gIERlYnVnID0gJ2RlYnVnJyxcbiAgSWZyYW1lQXV0aCA9ICdpZnJhbWUtYXV0aCcsXG4gIE9uVml6TG9hZEVycm9yID0gJ29udml6bG9hZGVycm9yJyxcbiAgRm9yY2VUb2tlblN5bmMgPSAnZm9yY2UtdG9rZW4tc3luYycsXG59XG5cbi8qKlxuICogVGhlIG5hbWVzIG9mIHRoZSBlbWJlZGRlZCBpZnJhbWUgYXR0cmlidXRlcyB3aG9zZSB2YWx1ZXMgY2FuIGJlIGNvbnRyb2xsZWQuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIEVtYmVkZGVkSWZyYW1lQXR0cmlidXRlcyB7XG4gIExvYWRpbmcgPSAnaWZyYW1lLWF0dHItbG9hZGluZycsXG4gIFN0eWxlID0gJ2lmcmFtZS1hdHRyLXN0eWxlJyxcbiAgQ2xhc3MgPSAnaWZyYW1lLWF0dHItY2xhc3MnLFxufVxuXG4vKipcbiAqIFRoZSBuYW1lcyBvZiB0aGUgc3RyaW5nIGNvbnN0YW50cyB5b3UgY2FuIHVzZSBhcyBjaGlsZCB0YWdzIGZvciBUYWJsZWF1Vml6LCBUYWJsZWF1QXV0aG9yaW5nVml6IGFuZCBUYWJsZWF1QXNrRGF0YSBjdXN0b20gZWxlbWVudHMuXG4gKiBAaWdub3JlXG4gKi9cbmV4cG9ydCBlbnVtIFdlYkNvbXBvbmVudENoaWxkRWxlbWVudHMge1xuICAvKipcbiAgICogQ29udGFpbnMgYSBsaXN0IG9mIGN1c3RvbSBwYXJhbWV0ZXJzLiAgQXZhaWxhYmxlIGluIHZpeiB2aWV3aW5nLCB2aXogYXV0aG9yaW5nIGFuZCBhc2tkYXRhLlxuICAgKi9cbiAgQ3VzdG9tUGFyYW1ldGVyID0gJ2N1c3RvbS1wYXJhbWV0ZXInLFxuXG4gIC8qKlxuICAgKiBDdXN0b20gc3R5bGVzIGFwcGxpY2FibGUgdG8gdGhlIGVtYmVkZGVkIGlmcmFtZSBlbGVtZW50IGl0c2VsZiAobm90IGluc2lkZSBpdCkuXG4gICAqL1xuICBJZnJhbWVTdHlsZSA9ICdpZnJhbWUtc3R5bGUnLFxufVxuXG5leHBvcnQgZW51bSBXZWJDb21wb25lbnRDaGlsZEVsZW1lbnRBdHRyaWJ1dGVzIHtcbiAgRmllbGQgPSAnZmllbGQnLFxuICBWYWx1ZSA9ICd2YWx1ZScsXG4gIE5hbWUgPSAnbmFtZScsXG59XG4iLCJpbXBvcnQgeyBGaWx0ZXIgfSBmcm9tICcuLi9TaGFyZWQvRmlsdGVySW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UgfSBmcm9tICcuLi9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmltcG9ydCB7IE1hcmtzQ29sbGVjdGlvbiB9IGZyb20gJy4uL1NoYXJlZC9TZWxlY3Rpb25JbnRlcmZhY2VzJztcbmltcG9ydCB7IFdvcmtib29rRm9ybWF0dGluZywgV29ya3NoZWV0Rm9ybWF0dGluZyB9IGZyb20gJy4uL1NoYXJlZC9Xb3JrYm9va0Zvcm1hdHRpbmdJbnRlcmZhY2VzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICcuL05hbWVzcGFjZXMvVGFibGVhdSc7XG5pbXBvcnQgeyBQYXJhbWV0ZXIgfSBmcm9tICcuL1BhcmFtZXRlckludGVyZmFjZXMnO1xuaW1wb3J0IHsgU2hlZXQsIFdvcmtzaGVldCB9IGZyb20gJy4vU2hlZXRJbnRlcmZhY2VzJztcblxuLyoqXG4gKiBBbiBldmVudCB3aGljaCBpcyByZWxhdGVkIHRvIGEgcGFydGljdWxhciBXb3Jrc2hlZXQgaW4gdGhlIHdvcmtib29rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBleHRlbmRzIFRhYmxlYXVTaGVldEV2ZW50IHtcbiAgLyoqXG4gICAqIEByZXR1cm5zICBUaGUgd29ya3NoZWV0IHdoaWNoIHdhcyB0aGUgc291cmNlIG9mIHRoaXMgZXZlbnQuXG4gICAqL1xuICByZWFkb25seSB3b3Jrc2hlZXQ6IFdvcmtzaGVldDtcbn1cblxuLyoqXG4gKiBBbiBldmVudCB3aGljaCBpcyByYWlzZWQgd2hlbiBtYXJrcyBhcmUgc2VsZWN0ZWQgb24gYSB3b3Jrc2hlZXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFya3NTZWxlY3RlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IHtcbiAgLyoqXG4gICAqIEByZXR1cm5zICBUaGUgY29sbGVjdGlvbiBvZiBNYXJrcyB0aGF0IHdlcmUgc2VsZWN0ZWQuXG4gICAqL1xuICBnZXRNYXJrc0FzeW5jKCk6IFByb21pc2U8TWFya3NDb2xsZWN0aW9uPjtcbn1cblxuLyoqXG4gKiBBbiBldmVudCB3aGljaCBpcyByYWlzZWQgd2hlbiBzdW1tYXJ5IGRhdGEgaXMgY2hhbmdlZCBmb3IgYSB3b3Jrc2hlZXQgb3Igd2hlbiBhIHdvcmtzaGVldCdzIGRhdGEgc291cmNlIGlzIHJlZnJlc2hlZFxuICpcbiAqIEBzaW5jZSAxLjExLjAgYW5kIFRhYmxlYXUgMjAyNC4xXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQge31cblxuLyoqXG4gKiBBbiBldmVudCB3aGljaCBpcyByZWxhdGVkIHRvIGEgcGFydGljdWxhciBTaGVldCAod29ya3NoZWV0LCBkYXNoYm9hcmQsIHN0b3J5KSBpbiB0aGUgd29ya2Jvb2suXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVhdVNoZWV0RXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQge1xuICAvKipcbiAgICogQHJldHVybnMgIFRoZSBzaGVldCB3aGljaCB3YXMgdGhlIHNvdXJjZSBvZiB0aGlzIGV2ZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgc2hlZXQ6IFNoZWV0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlckNoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGJlaW5nIGZpbHRlcmVkLlxuICAgKi9cbiAgcmVhZG9ubHkgZmllbGROYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUaGUgRmlsdGVyIG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGV2ZW50LlxuICAgKi9cbiAgZ2V0RmlsdGVyQXN5bmMoKTogUHJvbWlzZTxGaWx0ZXI+O1xufVxuXG4vKipcbiAqIEFuIGV2ZW50IHdoaWNoIGlzIHJlbGF0ZWQgdG8gYSB3b3JrYm9vaydzIGZvcm1hdHRpbmcgKHdvcmtzaGVldCwgZGFzaGJvYXJkLCBzdG9yeSkgaW4gdGhlIHdvcmtib29rLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVFdmVudCB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIG5ldyBleHRlbnNpb24gZm9ybWF0dGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGluZzogV29ya2Jvb2tGb3JtYXR0aW5nO1xufVxuXG4vKipcbiAqIEFuIGV2ZW50IHJhaXNlZCB3aGVuIHRoZSB3b3Jrc2hlZXQncyBmb3JtYXR0aW5nIGNoYW5nZXMuXG4gKiBOb3RlIHRoYXQgdGhpcyBldmVudCBpcyBhbHNvIHJhaXNlZCB3aGVuIHRoZSB3b3JrYm9vaydzIGZvcm1hdHRpbmcgY2hhbmdlcy5cbiAqIEBzaW5jZSAxLjEzIGFuZCBUYWJsZWF1IDIwMjUuMVxuICovXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQge1xuICAvKipcbiAgICogQHJldHVybnMgIFRoZSBuZXcgZm9ybWF0dGluZ1xuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGluZzogV29ya3NoZWV0Rm9ybWF0dGluZztcbn1cblxuLyoqIEFuIGV2ZW50IG9iamVjdCByZXByZXNlbnRzIGEgbm90aWZpY2F0aW9uIHRoYXQgc29tZSBzb3J0IG9mIHN0YXRlIGhhcyBjaGFuZ2VkLlxuICogVGhpcyBpcyB0aGUgYmFzZSBldmVudCBpbnRlcmZhY2UuIEFsbCBldmVudHMgd2lsbCBpbmhlcml0IHRoaXMgdHlwZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZWF1RXZlbnQge1xuICAvKipcbiAgICogQHJldHVybnMgIFRoZSB0eXBlIG9mIGV2ZW50IHdoaWNoIHRoaXMgY2xhc3MgaXMgcmVwcmVzZW50aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogVGFibGVhdUV2ZW50VHlwZTtcbn1cblxuLyoqXG4gKiBBbiBldmVudCB3aGljaCBpcyByYWlzZWQgd2hlbiB0aGUgdmFsdWUgb2YgYSBwYXJhbWV0ZXIgY2hhbmdlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQge1xuICAvKipcbiAgICogQHJldHVybnMgIFRoZSBwYXJhbWV0ZXIgdGhhdCB3YXMgY2hhbmdlZC5cbiAgICovXG4gIGdldFBhcmFtZXRlckFzeW5jKCk6IFByb21pc2U8UGFyYW1ldGVyPjtcbn1cblxuLyoqXG4gKiBBbiBldmVudCB3aGljaCBpcyByYWlzZWQgd2hlbiB0aGUgc2V0dGluZ3Mgb2YgYW4gZXh0ZW5zaW9uIGFyZSB1cGRhdGVkLlxuICogU2hvdWxkIGJlIGxpc3RlbmVkIGZvciBkaXJlY3RseSBmcm9tIHRoZSBgdGFibGVhdS5leHRlbnNpb25zLnNldHRpbmdzYCBvYmplY3QuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2V0dGluZ3NDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQge1xuICAvKipcbiAgICogQHJldHVybnMgdGhlIG5ldyBzZXR0aW5ncyB0aGF0IHdlcmUgcmVjZW50bHkgc2F2ZWQuXG4gICAqL1xuICByZWFkb25seSBuZXdTZXR0aW5nczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuLyoqXG4gKiBBbiBldmVudCB3aGljaCBpcyByYWlzZWQgd2hlbiB0aGUgZGFzaGJvYXJkIG9iamVjdHMgYXJlIG1vZGlmaWVkLlxuICogU2hvdWxkIGJlIGxpc3RlbmVkIGZvciBkaXJlY3RseSBmcm9tIHRoZSBgdGFibGVhdS5leHRlbnNpb25zLmRhc2hib2FyZENvbnRlbnQuZGFzaGJvYXJkYCBvYmplY3QuXG4gKlxuICogQHNpbmNlIDEuNy4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICogQGNhdGVnb3J5IERhc2hib2FyZCBFeHRlbnNpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IHtcbiAgLyoqXG4gICAqIEByZXR1cm5zIGEgbWFwIG9mIGRhc2hib2FyZCBvYmplY3QgaWQncyB0byBhbiBhcnJheSBvZiBkYXNoYm9hcmQgb2JqZWN0IGxheW91dCBjaGFuZ2VzXG4gICAqL1xuICByZWFkb25seSBkYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzO1xufVxuXG4vKipcbiAqIEFuIGV2ZW50IHdoaWNoIGlzIHJhaXNlZCB3aGVuIHRoZSBkaWFsb2cgaGFzIGEgbWVzc2FnZSBmb3IgdGhlIHVuZGVybHlpbmcgZXh0ZW5zaW9uIChzZW50IHVzaW5nIGB0YWJsZWF1LmV4dGVuc2lvbnMudWkuc2VuZERpYWxvZ01lc3NhZ2VBc3luY2ApLCBvciB2aWNlIHZlcnNhLlxuICogU2hvdWxkIGJlIGxpc3RlbmVkIGZvciBkaXJlY3RseSBmcm9tIHRoZSBgdGFibGVhdS5leHRlbnNpb25zLnVpYCBvYmplY3QuXG4gKiBGb3IgZXhhbXBsZSwgd2hlbiB0aGUgZGlhbG9nIHNlbmRzIGEgbWVzc2FnZSB0byB0aGUgZXh0ZW5zaW9uIHVzaW5nIGB0YWJsZWF1LmV4dGVuc2lvbnMudWkuc2VuZERpYWxvZ01lc3NhZ2VBc3luY2AgbWV0aG9kLFxuICogdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgbGlzdGVuaW5nIGZvciB0aGlzIGV2ZW50IGFuZCBoYW5kbGluZyBpdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEaWFsb2dNZXNzYWdlRXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQge1xuICAvKipcbiAgICogQHJldHVybnMgdGhlIG1lc3NhZ2UgdGhhdCB3YXMgc2VudCB0by9mcm9tIHRoZSBkaWFsb2cuXG4gICAqL1xuICByZWFkb25seSBtZXNzYWdlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRoZSB1cmwgb2YgdGhlIGRpYWxvZyB0aGF0IHNlbnQgdGhlIG1lc3NhZ2UuXG4gICAqIElmIHVuZGVmaW5lZCwgdGhlIG1lc3NhZ2Ugd2FzIHNlbnQgYnkgdGhlIGhvc3QgZXh0ZW5zaW9uIGl0c2VsZi5cbiAgICovXG4gIHJlYWRvbmx5IHNvdXJjZURpYWxvZ1VybD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBNYXAgb2JqZWN0IHRoYXQgaXMgdXNlZCBmb3IgdGhlIERhc2hib2FyZExheW91dENoYW5nZWRFdmVudC5cbiAqIEBjYXRlZ29yeSBEYXNoYm9hcmQgRXh0ZW5zaW9uc1xuICovXG5leHBvcnQgZGVjbGFyZSB0eXBlIERhc2hib2FyZExheW91dENoYW5nZURldGFpbHMgPSBNYXA8bnVtYmVyLCBBcnJheTxEYXNoYm9hcmRMYXlvdXRDaGFuZ2U+PjtcblxuLyoqXG4gKiBDYWxsYmFjayBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGludm9rZWQgd2hlbiBhbiBldmVudCBub3RpZmljYXRpb24gaXMgZW1pdHRlZC5cbiAqXG4gKiBAcGFyYW0gZXZlbnQgIENsYXNzIHJlcHJlc2VudGluZyB0aGUgZXZlbnQgd2hpY2ggb2NjdXJyZWQuXG4gKi9cbmV4cG9ydCB0eXBlIFRhYmxlYXVFdmVudEhhbmRsZXJGbiA9IChldmVudDogVGFibGVhdUV2ZW50KSA9PiB2b2lkO1xuXG4vKipcbiAqIEZ1bmN0aW9uIHdoaWNoIGNhbiBiZSBpbnZva2VkIHRvIHJlbW92ZSBhbiBldmVudCBoYW5kbGVyIHJlZ2lzdHJhdGlvbi4gVGhpcyB3aWxsIGJlXG4gKiByZXR1cm5lZCB3aGVuIHJlZ2lzdGVyaW5nIGFuIGV2ZW50IGFuZCBtYWtlcyB1bnJlZ2lzdGVyaW5nIHNpbXBsZXIuXG4gKlxuICogQHJldHVybnMgIFdoZXRoZXIgb3Igbm90IHRoZSB1bnJlZ2lzdHJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC5cbiAqL1xuZXhwb3J0IHR5cGUgVGFibGVhdUV2ZW50VW5yZWdpc3RlckZuID0gKCkgPT4gYm9vbGVhbjtcblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGhhbmRsaW5nIHJlZ2lzdGVyaW5nIGFuZCB1bnJlZ2lzdGVyaW5nIGV2ZW50IGxpc3RlbmVycy4gRGlmZmVyZW50IG9iamVjdHMgd2lsbCBpbXBsZW1lbnRcbiAqIHRoaXMgaW50ZXJmYWNlIHRvIG1hbmFnZSB0aGVpciBldmVudCBoYW5kbGluZy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFdmVudExpc3RlbmVyTWFuYWdlciB7XG4gIC8qKlxuICAgKiBBZGRzIGEgbmV3IGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBvYmplY3QuIElmIHRoaXMgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgdGhlIHNwZWNpZmllZCBgZXZlbnRUeXBlYCxcbiAgICogdGhlIG1ldGhvZCB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuICAgKiBUaGUgZm9sbG93aW5nIHRhYmxlIHNob3dzIHRoZSBldmVudCB0eXBlcyBzdXBwb3J0ZWQgYnkgb2JqZWN0cy5cbiAgICpcbiAgICogfCBvYmplY3QgfCBldmVudFR5cGUgfFxuICAgKiB8IC0tLS0tLSAgfCAtLS0tLSB8XG4gICAqIHwge0BsaW5rIFdvcmtzaGVldH0gfCBgRmlsdGVyQ2hhbmdlZGAgLCBgTWFya1NlbGVjdGlvbkNoYW5nZWRgLCBgU3VtbWFyeURhdGFDaGFuZ2VkYCwgYFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkYCB8XG4gICAqIHwge0BsaW5rIFBhcmFtZXRlcn0gfCBgUGFyYW1ldGVyQ2hhbmdlZGAgfFxuICAgKiB8IHtAbGluayBTZXR0aW5nc30gIHwgIGBTZXR0aW5nc0NoYW5nZWRgIHxcbiAgICogfCB7QGxpbmsgRGFzaGJvYXJkfSB8ICBgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZGAsIGBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkYCB8XG4gICAqXG4gICAqIEBwYXJhbSBldmVudFR5cGUgIFRoZSB0eXBlIG9mIGV2ZW50IHRvIHJlZ2lzdGVyIGZvci4gVGhlIHR5cGUgb2YgZXZlbnQgaXMgYSBgVGFibGVhdUV2ZW50VHlwZWAgZW51bWVyYXRpb24uXG4gICAqIEBwYXJhbSBoYW5kbGVyICAgIFRoZSBmdW5jdGlvbiB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuIGFuIGV2ZW50IGhhcHBlbnMuXG4gICAqIEByZXR1cm5zICAgICAgICAgIEEgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIGNhbiBiZSBjYWxsZWQgdG8gcmVtb3ZlIHRoaXMgcmVnaXN0cmF0aW9uLlxuICAgKlxuICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2V0cyB1cCBhIGxpc3RlbmVyIGluIGEgd29ya3NoZWV0IGZvciBhIG1hcmsgc2VsZWN0aW9uIGV2ZW50IChgTWFya1NlbGVjdGlvbkNoYW5nZWRgKS5cbiAgICogV2hlbiB0aGUgZXZlbnQgb2NjdXJzLCB0aGUgZGF0YSBpcyByZWxvYWRlZC4gVGhlIGBhZGRFdmVudExpc3RlbmVyYCBtZXRob2QgcmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdW4tcmVnaXN0ZXJzXG4gICAqIHRoZSBldmVudCBoYW5kbGVyLiBDYWxsIHRoYXQgZnVuY3Rpb24sIGluIHRoaXMgY2FzZSwgYHVucmVnaXN0ZXJFdmVudEhhbmRsZXJGdW5jdGlvbigpYCB0byByZW1vdmUgdGhlIHJlZ2lzdHJhdGlvbi5cbiAgICpcbiAgICogYGBgXG4gICAqIC8vIEFkZCBhbiBldmVudCBsaXN0ZW5lciBmb3IgdGhlIHNlbGVjdGlvbiBjaGFuZ2VkIGV2ZW50IG9uIHRoaXMgc2hlZXQuXG4gICAqIC8vIEFzc2lnbmluZyB0aGUgZXZlbnQgdG8gYSB2YXJpYWJsZSBqdXN0IHRvIG1ha2UgdGhlIGV4YW1wbGUgZml0IG9uIHRoZSBwYWdlIGhlcmUuXG4gICAgY29uc3QgbWFya1NlbGVjdGlvbiA9IHRhYmxlYXUuVGFibGVhdUV2ZW50VHlwZS5NYXJrU2VsZWN0aW9uQ2hhbmdlZDtcbiAgICAgLy9cbiAgICB1bnJlZ2lzdGVyRXZlbnRIYW5kbGVyRnVuY3Rpb24gPSB3b3Jrc2hlZXQuYWRkRXZlbnRMaXN0ZW5lcihtYXJrU2VsZWN0aW9uLCBmdW5jdGlvbiAoc2VsZWN0aW9uRXZlbnQpIHtcbiAgICAvLyBXaGVuIHRoZSBzZWxlY3Rpb24gY2hhbmdlcywgcmVsb2FkIHRoZSBkYXRhXG4gICAgICAgIGxvYWRTZWxlY3RlZE1hcmtzKHdvcmtzaGVldE5hbWUpO1xuICAgIH0pO1xuICAgKlxuICAgKiAvLyByZW1vdmUgdGhlIGV2ZW50IGxpc3RlbmVyIHdoZW4gZG9uZVxuICAgKiAgdW5yZWdpc3RlckV2ZW50SGFuZGxlckZ1bmN0aW9uKCk7XG4gICAqXG4gICAqIGBgYFxuICAgKlxuICAgKi9cbiAgYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIGhhbmRsZXI6IFRhYmxlYXVFdmVudEhhbmRsZXJGbik6IFRhYmxlYXVFdmVudFVucmVnaXN0ZXJGbjtcblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBldmVudCBsaXN0ZW5lciBpZiBhIG1hdGNoaW5nIG9uZSBpcyBmb3VuZC4gSWYgbm8gbWF0Y2hpbmcgbGlzdGVuZXIgZXhpc3RzLCB0aGUgbWV0aG9kIGRvZXMgbm90aGluZy5cbiAgICogVGhlIGhhbmRsZXIgZnVuY3Rpb24gbXVzdCB0aGUgaGFuZGxlciBmdW5jdGlvbiBzcGVjaWZpZWQgaW4gdGhlIGNhbGwgdG8gdGhlIGBhZGRFdmVudExpc3RlbmVyYCBtZXRob2QuIEFsdGVybmF0aXZlbHksIHVzZSB0aGUgZnVuY3Rpb25cbiAgICogcmV0dXJuZWQgZnJvbSB0aGUgY2FsbCB0byBgYWRkRXZlbnRMaXN0ZW5lcmAgdG8gdW5yZWdpc3RlciB0aGUgZXZlbnQgbGlzdGVuZXIuXG4gICAqIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgW0V2ZW50cyBhbmQgRXZlbnQgSGFuZGxpbmddKGh0dHBzOi8vdGFibGVhdS5naXRodWIuaW8vZXh0ZW5zaW9ucy1hcGkvZG9jcy9jb3JlL3RyZXhfZXZlbnRzKS5cbiAgICpcbiAgICogQHJldHVybnMgIFdoZXRoZXIgb3Igbm90IGFuIGV2ZW50IGxpc3RlbmVyIHdhcyByZW1vdmVkLlxuICAgKi9cbiAgcmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudFR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIGhhbmRsZXI6IFRhYmxlYXVFdmVudEhhbmRsZXJGbik6IGJvb2xlYW47XG59XG4iLCIvLyBBbGwgZW51bSB2YWx1ZXMgbWFkZSBhdmFpbGFibGUgdG8gRXh0ZW5zaW9ucyBkZXZlbG9wZXJzLlxuLy8gRW51bXMgc2hvdWxkIGJlIGtlcHQgaW4gYWxwaGFiZXRpY2FsIG9yZGVyLlxuXG5pbXBvcnQgeyBFeHRlbnNpb25zIH0gZnJvbSAnLi9FeHRlbnNpb25zJztcblxubmFtZXNwYWNlIFRhYmxlYXUge1xuICBleHBvcnQgbGV0IGV4dGVuc2lvbnM6IEV4dGVuc2lvbnM7XG4gIC8qKlxuICAgKiBBbGwgZXJyb3IgY29kZXMgdXNlZCBieSB0aGUgRXh0ZW5zaW9ucyBBUEkuXG4gICAqL1xuICBleHBvcnQgZW51bSBFcnJvckNvZGVzIHtcbiAgICAvKipcbiAgICAgKiBUaHJvd24gd2hlbiBjYWxsZXIgYXR0ZW1wdHMgdG8gZXhlY3V0ZSBjb21tYW5kIGJlZm9yZSBpbml0aWFsaXphdGlvbiBoYXMgY29tcGxldGVkLlxuICAgICAqL1xuICAgIEFQSU5vdEluaXRpYWxpemVkID0gJ2FwaS1ub3QtaW5pdGlhbGl6ZWQnLFxuICAgIC8qKlxuICAgICAqIFRocm93biB3aGVuIGNhbGxlciBhdHRlbXB0cyB0byBleGVjdXRlIGNvbW1hbmQgd2hpbGUgZXh0ZW5zaW9uIGlzIG5vdCB2aXNpYmxlLlxuICAgICAqL1xuICAgIFZpc2liaWxpdHlFcnJvciA9ICd2aXNpYmlsaXR5LWVycm9yJyxcbiAgICAvKipcbiAgICAgKiBPbmx5IG9uZSBkaWFsb2cgY2FuIGJlIG9wZW5lZCBhdCB0aW1lIHdpdGggdGhlIFVJIG5hbWVzcGFjZSBmdW5jdGlvbmFsaXR5LlxuICAgICAqL1xuICAgIERpYWxvZ0FscmVhZHlPcGVuID0gJ2RpYWxvZy1hbHJlYWR5LW9wZW4nLFxuICAgIC8qKlxuICAgICAqIFRoZSBvcGVuIGRpYWxvZyB3YXMgY2xvc2VkIGJ5IHRoZSB1c2VyLlxuICAgICAqL1xuICAgIERpYWxvZ0Nsb3NlZEJ5VXNlciA9ICdkaWFsb2ctY2xvc2VkLWJ5LXVzZXInLFxuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgVGFibGVhdSBFeHRlbnNpb25zIEFQSS4gQ29udGFjdCBUYWJsZWF1IFN1cHBvcnQuXG4gICAgICovXG4gICAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gICAgLyoqXG4gICAgICogQSBkaWFsb2cgbXVzdCBzdGFydCBvbiB0aGUgc2FtZSBkb21haW4gYXMgdGhlIHBhcmVudCBleHRlbnNpb24uXG4gICAgICovXG4gICAgSW52YWxpZERvbWFpbkRpYWxvZyA9ICdpbnZhbGlkLWRpYWxvZy1kb21haW4nLFxuICAgIC8qKlxuICAgICAqIEEgcGFyYW1ldGVyIGlzIG5vdCB0aGUgY29ycmVjdCBkYXRhIHR5cGUgb3IgZm9ybWF0LiBUaGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGlzIHNwZWNpZmllZCBpbiB0aGUgRXJyb3IubWVzc2FnZSBmaWVsZC5cbiAgICAgKi9cbiAgICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgICAvKipcbiAgICAgKiBDYW4gb2NjdXIgaWYgdGhlIGV4dGVuc2lvbiBpbnRlcmFjdHMgd2l0aCBhIGZpbHRlciB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgd29ya3NoZWV0LlxuICAgICAqL1xuICAgIE1pc3NpbmdGaWx0ZXIgPSAnbWlzc2luZy1maWx0ZXInLFxuICAgIC8qKlxuICAgICAqIENhbiBvY2N1ciBpZiB0aGUgZXh0ZW5zaW9uIGludGVyYWN0cyB3aXRoIGEgcGFyYW1ldGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXQuXG4gICAgICovXG4gICAgTWlzc2luZ1BhcmFtZXRlciA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gICAgLyoqXG4gICAgICogSW50ZXJuYWwgU2VydmVyIEVycm9yXG4gICAgICovXG4gICAgU2VydmVyRXJyb3IgPSAnc2VydmVyLWVycm9yJyxcbiAgICAvKipcbiAgICAgKiBEZXZlbG9wZXIgY2Fubm90IHNhdmUgc2V0dGluZ3Mgd2hpbGUgYW5vdGhlciBzYXZlIGlzIHN0aWxsIGluIHByb2dyZXNzLlxuICAgICAqL1xuICAgIFNldHRpbmdTYXZlSW5Qcm9ncmVzcyA9ICdzZXR0aW5nLXNhdmUtaW4tcHJvZ3Jlc3MnLFxuICAgIC8qKlxuICAgICAqIEFuIHVua25vd24gZXZlbnQgbmFtZSB3YXMgc3BlY2lmaWVkIGluIHRoZSBjYWxsIHRvIGBhZGRFdmVudExpc3RlbmVyYCBvciBgcmVtb3ZlRXZlbnRMaXN0ZW5lcmAuXG4gICAgICovXG4gICAgVW5zdXBwb3J0ZWRFdmVudE5hbWUgPSAndW5zdXBwb3J0ZWQtZXZlbnQtbmFtZScsXG4gICAgLyoqXG4gICAgICogQSBtZXRob2Qgd2FzIHVzZWQgZm9yIGEgdHlwZSBvZiBkYXRhIHNvdXJjZSB0aGF0IGRvZXNuJ3Qgc3VwcG9ydCB0aGF0IG1ldGhvZCAoc2VlIGdldEFjdGl2ZVRhYmxlc0FzeW5jIGZvciBhbiBleGFtcGxlKVxuICAgICAqL1xuICAgIFVuc3VwcG9ydGVkTWV0aG9kRm9yRGF0YVNvdXJjZVR5cGUgPSAndW5zdXBwb3J0ZWQtbWV0aG9kLWZvci1kYXRhLXNvdXJjZS10eXBlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgY29udGV4dCBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbkNvbnRleHQge1xuICAgIERlc2t0b3AgPSAnZGVza3RvcCcsXG4gICAgU2VydmVyID0gJ3NlcnZlcicsXG4gICAgQ2xvdWQgPSAnY2xvdWQnLFxuICAgIFB1YmxpY1dlYiA9ICdwdWJsaWMtd2ViJyxcbiAgICBQdWJsaWNEZXNrdG9wID0gJ3B1YmxpYy1kZXNrdG9wJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbW9kZSBpbiB3aGljaCB0aGUgRXh0ZW5zaW9ucyBpcyBjdXJyZW50bHkgcnVubmluZy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEV4dGVuc2lvbk1vZGUge1xuICAgIEF1dGhvcmluZyA9ICdhdXRob3JpbmcnLFxuICAgIFZpZXdpbmcgPSAndmlld2luZycsXG4gIH1cblxuICAvKipcbiAgICogVGhlIG1lZGlhIHR5cGUgb2YgdGhlIGV4cG9ydGVkIGNvbnRlbnQuXG4gICAqL1xuICBleHBvcnQgZW51bSBFeHBvcnRlZE1lZGlhVHlwZSB7XG4gICAgSW1hZ2UgPSAnaW1hZ2UnLFxuICAgIFBkZiA9ICdwZGYnLFxuICAgIFN2ZyA9ICdzdmcnLFxuICAgIEh0bWwgPSAnaHRtbCcsXG4gICAgUG93ZXJQb2ludCA9ICdwb3dlcnBvaW50JyxcbiAgICBFeGNlbCA9ICdleGNlbCcsXG4gIH1cblxuICAvKipcbiAgICogUmVwcmVzZW50cyB0aGUgdHlwZSBvZiBldmVudCB0aGF0IGNhbiBiZSBsaXN0ZW5lZCBmb3IuXG4gICAqL1xuICBleHBvcnQgZW51bSBUYWJsZWF1RXZlbnRUeXBlIHtcbiAgICAvKipcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICogUmFpc2VkIHdoZW4gYSBtZXNzYWdlIGlzIHJlY2VpdmVkIHRoYXQgd2FzIHNlbnQgYnkgYSBkaWFsb2cgb3IgZXh0ZW5zaW9uIHZpYSBgc2VuZERpYWxvZ01lc3NhZ2VBc3luY2AuKi9cbiAgICBEaWFsb2dNZXNzYWdlUmVjZWl2ZWQgPSAnZGlhbG9nLW1lc3NhZ2UtcmVjZWl2ZWQnLFxuXG4gICAgLyoqIFJhaXNlZCB3aGVuIGFueSBmaWx0ZXIgaGFzIGNoYW5nZWQgc3RhdGUuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuKi9cbiAgICBGaWx0ZXJDaGFuZ2VkID0gJ2ZpbHRlci1jaGFuZ2VkJyxcblxuICAgIC8qKiBUaGUgc2VsZWN0ZWQgbWFya3Mgb24gYSB2aXN1YWxpemF0aW9uIGhhcyBjaGFuZ2VkLlxuICAgICAqIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIFtXb3Jrc2hlZXRdKC4uL2ludGVyZmFjZXMvd29ya3NoZWV0Lmh0bWwpIG9iamVjdHMuICovXG4gICAgTWFya1NlbGVjdGlvbkNoYW5nZWQgPSAnbWFyay1zZWxlY3Rpb24tY2hhbmdlZCcsXG5cbiAgICAvKiogVGhlIHN1bW1hcnkgZGF0YSBiYWNraW5nIGEgd29ya3NoZWV0IGhhcyBjaGFuZ2VkXG4gICAgICogWW91IGNhbiB1c2UgdGhpcyBldmVudCB0eXBlIHdpdGggW1dvcmtzaGVldF0oLi4vaW50ZXJmYWNlcy93b3Jrc2hlZXQuaHRtbCkgb2JqZWN0cy4qL1xuICAgIFN1bW1hcnlEYXRhQ2hhbmdlZCA9ICdzdW1tYXJ5LWRhdGEtY2hhbmdlZCcsXG5cbiAgICAvKiogQSBwYXJhbWV0ZXIgaGFzIGhhZCBpdHMgdmFsdWUgbW9kaWZpZWQuIFlvdSBjYW4gdXNlIHRoaXMgZXZlbnQgdHlwZSB3aXRoIHtAbGluayBQYXJhbWV0ZXJ9IG9iamVjdHMuICovXG4gICAgUGFyYW1ldGVyQ2hhbmdlZCA9ICdwYXJhbWV0ZXItY2hhbmdlZCcsXG5cbiAgICAvKiogU2V0dGluZ3MgaGF2ZSBiZWVuIGNoYW5nZWQgZm9yIHRoaXMgZXh0ZW5zaW9uLiBZb3UgY2FuIHVzZSB0aGlzIGV2ZW50IHR5cGUgd2l0aCB7QGxpbmsgU2V0dGluZ3N9IG9iamVjdHMuICovXG4gICAgU2V0dGluZ3NDaGFuZ2VkID0gJ3NldHRpbmdzLWNoYW5nZWQnLFxuXG4gICAgLyoqIFRoZSBkYXNoYm9hcmQgbGF5b3V0IGhhcyBjaGFuZ2VkXG4gICAgICogQGNhdGVnb3J5IERhc2hib2FyZCBFeHRlbnNpb25zXG4gICAgICovXG4gICAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCA9ICdkYXNoYm9hcmQtbGF5b3V0LWNoYW5nZWQnLFxuXG4gICAgLyoqIFRoZSB3b3JrYm9vayBmb3JtYXR0aW5nIGhhcyBjaGFuZ2VkXG4gICAgICogQGNhdGVnb3J5IERhc2hib2FyZCBFeHRlbnNpb25zXG4gICAgICovXG4gICAgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCA9ICd3b3JrYm9vay1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuXG4gICAgLyoqIFRoZSB3b3Jrc2hlZXQgZm9ybWF0dGluZyBoYXMgY2hhbmdlZFxuICAgICAqIEBjYXRlZ29yeSBWaXogRXh0ZW5zaW9uc1xuICAgICAqL1xuICAgIFdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkID0gJ3dvcmtzaGVldC1mb3JtYXR0aW5nLWNoYW5nZWQnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBkYXRhIHR5cGUgb2YgZW5jb2RpbmdzIGZvciBjcmVhdGVWaXpJbWFnZUFzeW5jLlxuICAgKiBAc2luY2UgMS42LjBcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlRW5jb2RpbmdUeXBlIHtcbiAgICBEaXNjcmV0ZSA9ICdkaXNjcmV0ZScsXG4gICAgQ29udGludW91cyA9ICdjb250aW51b3VzJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgc29ydCBkaXJlY3Rpb24gZm9yIGNyZWF0ZVZpekltYWdlQXN5bmMuXG4gICAqIEBzaW5jZSAxLjguMCBhbmQgVGFibGVhdSAyMDIxLjRcbiAgICovXG4gIGV4cG9ydCBlbnVtIFZpekltYWdlU29ydERpcmVjdGlvblR5cGUge1xuICAgIEFzY2VuZGluZyA9ICdhc2NlbmRpbmcnLFxuICAgIERlc2NlbmRpbmcgPSAnZGVzY2VuZGluZycsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHBhbGV0dGUgdHlwZSBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuOC4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgZXhwb3J0IGVudW0gVml6SW1hZ2VQYWxldHRlVHlwZSB7XG4gICAgQ3VzdG9tRGl2ZXJnaW5nID0gJ2N1c3RvbS1kaXZlcmdpbmcnLFxuICAgIEN1c3RvbVNlcXVlbnRpYWwgPSAnY3VzdG9tLXNlcXVlbnRpYWwnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSBTaXplIFNldHRpbmcgdHlwZSBmb3IgY3JlYXRlVml6SW1hZ2VBc3luYy5cbiAgICogQHNpbmNlIDEuOC4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgZXhwb3J0IGVudW0gVml6SW1hZ2VTaXplU2V0dGluZ1R5cGUge1xuICAgIEZpeGVkID0gJ2ZpeGVkJyxcbiAgICBNYW51YWwgPSAnbWFudWFsJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgU2l6ZSBTZXR0aW5nIGFsaWdubWVudCB0eXBlIGZvciBjcmVhdGVWaXpJbWFnZUFzeW5jLlxuICAgKiBAc2luY2UgMS44LjAgYW5kIFRhYmxlYXUgMjAyMS40XG4gICAqL1xuICBleHBvcnQgZW51bSBWaXpJbWFnZVNpemVTZXR0aW5nQWxpZ25tZW50VHlwZSB7XG4gICAgUmlnaHQgPSAncmlnaHQnLFxuICAgIExlZnQgPSAnbGVmdCcsXG4gICAgQ2VudGVyID0gJ2NlbnRlcicsXG4gIH1cbn1cbmV4cG9ydCA9IFRhYmxlYXU7XG4iLCJpbXBvcnQgeyBEaWFsb2dTdHlsZSB9IGZyb20gJy4uLy4uL1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuXG4vKipcbiAqIFRoZSBVSSBuYW1lc3BhY2UgY29udGFpbnMgbWV0aG9kcyB0aGF0IGFsbG93IGFuIGV4dGVuc2lvbiB0byBkaXNwbGF5IGEgcG9wdXBcbiAqIGRpYWxvZyB3aW5kb3cuIEEgbW9kYWwgZGlhbG9nIGNhbiBiZSB1c2VmdWwgaW4gYXV0aGVudGljYXRpb24gb3IgY29uZmlndXJhdGlvbiBzY2VuYXJpb3MsXG4gKiBvciB3aGVuIGV4dHJhIHNpdHVhdGlvbmFsIFVJIHNwYWNlIGlzIG5lZWRlZC4gT25seSBvbmUgZGlhbG9nIGNhbiBiZSBkaXNwbGF5ZWQgYXQgYSB0aW1lIHBlciBleHRlbnNpb24uXG4gKiBJbnNpZGUgdGhlIHBvcHVwIGRpYWxvZyB3aW5kb3csIGFub3RoZXIgZXh0ZW5zaW9uIGNhbiBiZSBsb2FkZWQgYW5kIHJ1bi4gVGhpcyAqZGlhbG9nIGV4dGVuc2lvbiogd2lsbCBoYXZlIGZ1bGwgYWNjZXNzXG4gKiB0byB0aGUgZnVuY3Rpb25zIHByb3ZpZGVkIGJ5IHRoZSBFeHRlbnNpb25zIEFQSS4gT25lIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZXh0ZW5zaW9uIHJ1bm5pbmcgaW4gdGhlIHBvcHVwIGRpYWxvZyB3aW5kb3dcbiAqIGFuZCBhbiBleHRlbnNpb24gcnVubmluZyBpbiB0aGUgZGFzaGJvYXJkIGlzIHRoYXQgdGhlIHBvcHVwIGRpYWxvZyB3aW5kb3cgbXVzdCBjYWxsXG4gKiB0aGUgYGluaXRpYWxpemVEaWFsb2dBc3luYygpYCBtZXRob2QgaW5zdGVhZCBvZiBgaW5pdGlhbGl6ZUFzeW5jKClgIHRvIGluaXRpYWxpemUgdGhlIGV4dGVuc2lvbi5cbiAqXG4gKiAqKk5vdGUqKiBJZiB5b3Ugd2FudCB0byB1c2UgYSBwb3B1cCBkaWFsb2cgd2luZG93IG9uIFRhYmxlYXUgU2VydmVyLCB5b3UgbmVlZCB0byBsZXQgdXNlcnMga25vdyB0aGF0IHRoZWlyIGJyb3dzZXIgbXVzdCBiZVxuICogIGNvbmZpZ3VyZWQgdG8gYWxsb3cgcG9wdXBzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFVJIHtcbiAgLyoqXG4gICAqIEBwYXJhbSB1cmwgICAgICAgICAgIFRoZSB1cmwgb2YgdGhlICdkaWFsb2cgZXh0ZW5zaW9uJyB0byBuYXZpZ2F0ZSB0byBpbiB0aGUgZGlhbG9nLiBUaGUgdXJsIG11c3RcbiAgICogICAgICAgICAgICAgICAgICAgICAgYmVsb25nIHRvIHRoZSBzYW1lIGRvbWFpbiBhcyB0aGUgcGFyZW50IGV4dGVuc2lvbi5cbiAgICogQHNpbmNlIDEuMy4wICAgICAgICAgQSByZWxhdGl2ZSBwYXRoIG1heSBiZSB1c2VkIGJlZ2lubmluZyB3aXRoIFRhYmxlYXUgMjAxOS4zIGFuZCB2ZXJzaW9uIDEuMy4wIG9mIHRoZSBFeHRlbnNpb25zIEFQSSBsaWJyYXJ5LlxuICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgcmVsYXRpdmUgcGF0aCBtdXN0IHJlc29sdmUgdG8gdGhlIGRpcmVjdG9yeSwgb3IgYSBjaGlsZCBkaXJlY3RvcnksIG9mIHRoZSBleHRlbnNpb24uXG4gICAqICAgICAgICAgICAgICAgICAgICAgIFJvb3QtcmVsYXRpdmUgcGF0aHMgYXJlIG5vdCBhbGxvd2VkLiBGb3IgZXhhbXBsZSwgYC4vY29uZmlnLmh0bWxgIG9yIGBjb25maWcuaHRtbGAgYXJlIGFsbG93ZWQsXG4gICAqICAgICAgICAgICAgICAgICAgICAgIGJ1dCBub3QgdGhlIHJvb3QtcmVsYXRpdmUgcGF0aCBgL2NvbmZpZy5odG1sYC5cbiAgICogICAgICAgICAgICAgICAgICAgICAgKipOb3RlKiogSWYgeW91ciBleHRlbnNpb24gaXMgbWVhbnQgZm9yIHVzZSBpbiB2ZXJzaW9ucyBvZiBUYWJsZWF1IHByaW9yIHRvIDIwMTkuMyxcbiAgICogICAgICAgICAgICAgICAgICAgICAgeW91IHNob3VsZCB1c2UgYW4gYWJzb2x1dGUgdXJsLlxuICAgKiBAcGFyYW0gcGF5bG9hZCAgICAgICBUaGUgYHBheWxvYWRgIGlzIG9wdGlvbmFsLCBhbmQgaXMgdXNlZCB0byBwcm92aWRlIGRhdGEgdG8gdGhlIHBvcHVwIGRpYWxvZyB3aW5kb3dcbiAgICogICAgICAgICAgICAgICAgICAgICAgYXQgc3RhcnR1cC4gVGhlIGBwYXlsb2FkYCB3aWxsIGJlIHJldHVybmVkIHRvIHRoZSBkaWFsb2cgZXh0ZW5zaW9uIGFzIHRoZSByZXR1cm5cbiAgICogICAgICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgdGhlIGNhbGwgdG8gdGhlIGB0YWJsZWF1LmV4dGVuc2lvbnMudWkuaW5pdGlhbGl6ZURpYWxvZ0FzeW5jYCBmdW5jdGlvbi5cbiAgICogICAgICAgICAgICAgICAgICAgICAgSWYgbm8gYHBheWxvYWRgIGlzIHByb3ZpZGVkLCB5b3UgbXVzdCBpbmRpY2F0ZSB0aGlzIHdpdGggYW4gZW1wdHkgc3RyaW5nIGBcIiBcImAuXG4gICAqIEBwYXJhbSBkaWFsb2dPcHRpb25zIFNwZWNpZmllcyB0aGUgb3B0aW9ucyBmb3IgdGhlIHBvcHVwIGRpYWxvZyB3aW5kb3cuXG4gICAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBgZGlhbG9nT3B0aW9uc2AgaGFzIHByb3BlcnRpZXMgZm9yIHdpZHRoIGFuZCBoZWlnaHQgKGluIHBpeGVscykgYW5kIGEgcHJvcGVydHkgZm9yIHRoZSBkaWFsb2cncyBzdHlsZS5cbiAgICogICAgICAgICAgICAgICAgICAgICAgVGhlIGRpYWxvZyBzdHlsZSBjYW4gYmUgYSB3aW5kb3csIGEgbW9kYWwgZGlhbG9nLCBvciBhIG1vZGVsZXNzIGRpYWxvZy4gSWYgc3R5bGUgaXMgbm90IHNwZWNpZmllZCwgd2luZG93IHdpbGwgYmUgdXNlZC5cbiAgICogICAgICAgICAgICAgICAgICAgICAgWW91IHBhc3MgdGhlc2UgcHJvcGVydGllcyB0byB0aGUgYGRpc3BsYXlEaWFsb2dBc3luY2AgZnVuY3Rpb24sIGFzIGZvbGxvd3M6XG4gICAqICAgICAgICAgICAgICAgICAgICAgIGB7d2lkdGg6YCAqbnVtYmVyKmAsIGhlaWdodDpgICpudW1iZXIqYCwgZGlhbG9nU3R5bGU6YCAqRGlhbG9nU3R5bGUqYH1gXG4gICAqXG4gICAqXG4gICAqIEByZXR1cm5zIEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGRpYWxvZyBoYXMgYmVlbiBjbG9zZWQuIEl0IHdpbGwgY29udGFpbiBhXG4gICAqICAgICAgICAgIHBheWxvYWQgYXMgYSBzdHJpbmcgcHJvdmlkZWQgYnkgdGhlIGRpYWxvZyBleHRlbnNpb24uIFRoZSBwcm9taXNlIGlzIHJlamVjdGVkIGlmXG4gICAqICAgICAgICAgIHRoZSB1c2VyIG1hbnVhbGx5IGNsb3NlcyB0aGUgZGlhbG9nIHdpbmRvdyAoZm9yIGV4YW1wbGUsIGJ5IGNsaWNraW5nIHRoZSAnWCcgaW4gd2luZG93KS5cbiAgICogICAgICAgICAgSXQgaXMgZ29vZCBwcmFjdGljZSB0byBoYW5kbGUgdGhpcyBlcnJvciBjb25kaXRpb24gd2l0aCBhIGNhdGNoIGJsb2NrLCBhcyBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuXG4gICAqXG4gICAqICBgYGBcbiAgICogICB0YWJsZWF1LmV4dGVuc2lvbnMudWkuZGlzcGxheURpYWxvZ0FzeW5jKHBvcHVwVXJsLCBkZWZhdWx0UGF5bG9hZCwgeyB3aWR0aDogNTAwLCBoZWlnaHQ6IDUwMCB9KS50aGVuKChjbG9zZVBheWxvYWQpID0+IHtcbiAgICogICAgIC8vXG4gICAqICAgICAvLyBUaGUgcHJvbWlzZSBpcyByZXNvbHZlZCB3aGVuIHRoZSBkaWFsb2cgaGFzIGJlZW4gY2xvc2VkIGFzIGV4cGVjdGVkLCBtZWFuaW5nIHRoYXRcbiAgICogICAgIC8vIHRoZSBwb3B1cCBleHRlbnNpb24gaGFzIGNhbGxlZCB0YWJsZWF1LmV4dGVuc2lvbnMudWkuY2xvc2VEaWFsb2coKSBtZXRob2QuXG4gICAqICAgICAvLyBUaGUgY2xvc2UgcGF5bG9hZCAoY2xvc2VQYXlsb2FkKSBpcyByZXR1cm5lZCBmcm9tIHRoZSBwb3B1cCBleHRlbnNpb25cbiAgICogICAgIC8vIHZpYSB0aGUgY2xvc2VEaWFsb2coKSBtZXRob2QuXG4gICAqICAgICAvL1xuICAgKiAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICogICAgIC8vIE9uZSBleHBlY3RlZCBlcnJvciBjb25kaXRpb24gaXMgd2hlbiB0aGUgcG9wdXAgaXMgY2xvc2VkIGJ5IHRoZSB1c2VyIChtZWFuaW5nIHRoZSB1c2VyXG4gICAqICAgICAvLyBjbGlja3MgdGhlICdYJyBpbiB0aGUgdG9wIHJpZ2h0IG9mIHRoZSBkaWFsb2cpLiBUaGlzIGNhbiBiZSBjaGVja2VkIGZvciBsaWtlIHNvOlxuICAgKiAgICAgICBzd2l0Y2goZXJyb3IuZXJyb3JDb2RlKSB7XG4gICAqICAgICAgICAgY2FzZSB0YWJsZWF1LkVycm9yQ29kZXMuRGlhbG9nQ2xvc2VkQnlVc2VyOlxuICAgKiAgICAgICAgICAgY29uc29sZS5sb2coXCJEaWFsb2cgd2FzIGNsb3NlZCBieSB1c2VyXCIpO1xuICAgKiAgICAgICAgICAgYnJlYWs7XG4gICAqICAgICAgICAgZGVmYXVsdDpcbiAgICogICAgICAgY29uc29sZS5lcnJvcihlcnJvci5tZXNzYWdlKTtcbiAgICogICAgICAgfVxuICAgKiAgICAgfSk7XG4gICAqICBgYGBcbiAgICpcbiAgICovXG4gIGRpc3BsYXlEaWFsb2dBc3luYyh1cmw6IHN0cmluZywgcGF5bG9hZD86IHN0cmluZywgZGlhbG9nT3B0aW9ucz86IERpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz47XG5cbiAgLyoqXG4gICAqIEBleHBlcmltZW50YWxcbiAgICogU2VuZHMgYSBtZXNzYWdlIGZyb20gdGhlIGRpYWxvZyB0byB0aGUgaG9zdCBleHRlbnNpb24gb3IgdmljZSB2ZXJzYS5cbiAgICogRm9yIGRpYWxvZ3Mgc2VuZGluZyBtZXNzYWdlcyB0byBleHRlbnNpb25zLCB3ZSBtdXN0IGxpc3RlbiBmb3IgdGhlIERpYWxvZ01lc3NhZ2VFdmVudCBpbiB0aGUgZXh0ZW5zaW9uIGluIG9yZGVyIHRvIHJlY2VpdmUgdGhlIG1lc3NhZ2UuXG4gICAqIEZvciBleHRlbnNpb25zIHNlbmRpbmcgbWVzc2FnZXMgdG8gZGlhbG9nLCB3ZSBtdXN0IGxpc3RlbiBmb3IgdGhlIERpYWxvZ01lc3NhZ2VFdmVudCBpbiB0aGUgZGlhbG9nIGNvZGUgaW4gb3JkZXIgdG8gcmVjZWl2ZSB0aGUgbWVzc2FnZS5cbiAgICogRm9yIHR3byB3YXkgY29tbXVuaWNhdGlvbiwgbGlzdGVuIGZvciB0aGUgRGlhbG9nTWVzc2FnZUV2ZW50IGluIGJvdGggdGhlIGRpYWxvZyBhbmQgZXh0ZW5zaW9uIGNvZGUuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIEEgbWVzc2FnZSB0byBzZW5kLlxuICAgKiBAcGFyYW0gdGFyZ2V0RGlhbG9nVXJsIFRoZSB1cmwgb2YgdGhlIGRpYWxvZyB0byBzZW5kIHRoZSBtZXNzYWdlIHRvLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudCB0byB0aGUgcGFyZW50IGV4dGVuc2lvbi5cbiAgICpcbiAgICogYGBgXG4gICAqXG4gICAqICAgLy8gU2VuZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgZGlhbG9nIHRvIHRoZSBleHRlbnNpb246XG4gICAqXG4gICAqICAgLy8gZXh0ZW5zaW9uIGNvZGUgKGxpc3RlbmluZyBmb3IgbWVzc2FnZXMgb3JpZ2luYXRpbmcgZnJvbSB0aGUgZGlhbG9nKVxuICAgKiAgIHRhYmxlYXUuZXh0ZW5zaW9ucy51aS5hZGRFdmVudExpc3RlbmVyKHRhYmxlYXUuVGFibGVhdUV2ZW50VHlwZS5EaWFsb2dNZXNzYWdlUmVjZWl2ZWQsIChlKSA9PiB7XG4gICAqICAgICBjb25zb2xlLmxvZygnTWVzc2FnZSByZWNlaXZlZCBmcm9tIGRpYWxvZzogJyArIGUubWVzc2FnZSk7XG4gICAqICAgfSlcbiAgICogICB0YWJsZWF1LmV4dGVuc2lvbnMudWkuZGlzcGxheURpYWxvZ0FzeW5jKHBvcHVwVXJsKTtcbiAgICogICAuLi5cbiAgICpcbiAgICogICAvLyBkaWFsb2cgY29kZSAoc2VuZGluZyBtZXNzYWdlIHRvIGV4dGVuc2lvbilcbiAgICogICBhd2FpdCB0YWJsZWF1LmV4dGVuc2lvbnMuaW5pdGlhbGl6ZURpYWxvZ0FzeW5jKCk7XG4gICAqICAgYXdhaXQgdGFibGVhdS5leHRlbnNpb25zLnVpLnNlbmREaWFsb2dNZXNzYWdlQXN5bmMoJ0hlbGxvIGZyb20gZGlhbG9nIScpO1xuICAgKlxuICAgKlxuICAgKiAgIC8vIFNlbmRpbmcgYSBtZXNzYWdlIGZyb20gdGhlIGV4dGVuc2lvbiB0byB0aGUgZGlhbG9nOlxuICAgKlxuICAgKiAgIC8vIGRpYWxvZyBjb2RlIChsaXN0ZW5pbmcgZm9yIG1lc3NhZ2VzIG9yaWdpbmF0aW5nIGZyb20gdGhlIGV4dGVuc2lvbilcbiAgICogICBhd2FpdCB0YWJsZWF1LmV4dGVuc2lvbnMuaW5pdGlhbGl6ZURpYWxvZ0FzeW5jKCk7XG4gICAqICAgdGFibGVhdS5leHRlbnNpb25zLnVpLmFkZEV2ZW50TGlzdGVuZXIodGFibGVhdS5UYWJsZWF1RXZlbnRUeXBlLkRpYWxvZ01lc3NhZ2VSZWNlaXZlZCwgKGUpID0+IHtcbiAgICogICAgIGNvbnNvbGUubG9nKCdNZXNzYWdlIHJlY2VpdmVkIGZyb20gZXh0ZW5zaW9uOiAnICsgZS5tZXNzYWdlKTtcbiAgICogICB9KVxuICAgKiAgIC4uLlxuICAgKlxuICAgKiAgIC8vIGV4dGVuc2lvbiBjb2RlIChzZW5kaW5nIG1lc3NhZ2UgdG8gZGlhbG9nKVxuICAgKiAgIHRhYmxlYXUuZXh0ZW5zaW9ucy51aS5kaXNwbGF5RGlhbG9nQXN5bmMocG9wdXBVcmwpO1xuICAgKiAgIC8vIHdhaXRpbmcgYSBiaXQgZm9yIGRpYWxvZyB0byBhcHBlYXIgYmVmb3JlIHNlbmRpbmcgbWVzc2FnZS5cbiAgICogICAvLyBub3RpY2UgdGhlIGludGVudGlvbmFsIG9taXNzaW9uIG9mIGF3YWl0IGluIGNhbGxzIHRvIGRpc3BsYXlEaWFsb2dBc3luYy5cbiAgICogICAvLyB0aGF0J3MgYmVjYXVzZSBpZiB3ZSBhd2FpdCwgd2Ugd29udCBydW4gYW55IGNvZGUgYWZ0ZXIgdGhhdCBsaW5lIHVudGlsIHRoZSBkaWFsb2cgY2xvc2VzIGFuZCB0aGUgcHJvbWlzZSByZXR1cm5zLlxuICAgKiAgIHNldFRpbWVvdXQoKCkgPT4gdGFibGVhdS5leHRlbnNpb25zLnVpLnNlbmREaWFsb2dNZXNzYWdlQXN5bmMoJ0hlbGxvIGZyb20gZXh0ZW5zaW9uIScsIHBvcHVwVXJsKSwgMTAwMCk7XG4gICAqIGBgYFxuICAgKlxuICAgKi9cbiAgc2VuZERpYWxvZ01lc3NhZ2VBc3luYyhtZXNzYWdlOiBzdHJpbmcsIHRhcmdldERpYWxvZ1VybD86IHN0cmluZyk7XG5cbiAgLyoqXG4gICAqIEBleHBlcmltZW50YWxcbiAgICogU2VuZHMgYSBtZXNzYWdlIGZyb20gdGhlIGRpYWxvZyB0byB0aGUgZXh0ZW5zaW9uIG9yIGRpYWxvZyB0aGF0IG9wZW5lZCBpdC5cbiAgICogVGhpcyBvbmx5IHdvcmtzIGlmIGNhbGxlZCBmcm9tIHRoZSBkaWFsb2cuXG4gICAqXG4gICAqIEBwYXJhbSBtZXNzYWdlIEEgbWVzc2FnZSB0byBzZW5kLlxuICAgKlxuICAgKi9cbiAgc2VuZERpYWxvZ01lc3NhZ2VUb1BhcmVudEFzeW5jKG1lc3NhZ2U6IHN0cmluZyk7XG5cbiAgLyoqXG4gICAqIENsb3NlcyB0aGUgZXh0ZW5zaW9uJ3MgZGlhbG9nLiBDYW4gYmUgY2FsbGVkIGZyb20gdGhlIHBvcHVwIGRpYWxvZyBvciBmcm9tIHRoZSBleHRlbnNpb24gaXRzZWxmLlxuICAgKlxuICAgKiBAcGFyYW0gcGF5bG9hZCBUaGUgYHBheWxvYWRgIGlzIG9wdGlvbmFsLCBhbmQgaWYgc3BlY2lmaWVkLCBpdCBpcyBtYWRlIGF2YWlsYWJsZSB0byBwYXJlbnQgZXh0ZW5zaW9uIHdoZW5cbiAgICogICAgICAgICAgICAgICAgdGhpcyBwb3B1cCBkaWFsb2cgY2xvc2VzLiBJZiB0aGUgZXh0ZW5zaW9uIHJ1bm5pbmcgaW4gdGhlIHBvcHVwIGRpYWxvZyB3aW5kb3cgZG9lcyBub3QgcmV0dXJuXG4gICAqICAgICAgICAgICAgICAgIGEgcGF5bG9hZCwgeW91IG11c3Qgc3RpbGwgcHJvdmlkZSBhbiBlbXB0eSBzdHJpbmcgYFwiIFwiYCBhcyBhIHJldHVybiB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIGRpYWxvZ1VybCBTcGVjaWZpZXMgdGhlIHVybCBvZiB0aGUgZGlhbG9nIHRvIGNsb3NlLlxuICAgKiAgICAgICAgICAgICAgICAgIElmIHRoZSBtZXRob2QgaXMgY2FsbGVkIGZyb20gYSBkaWFsb2csIGFuZCB0aGUgZGlhbG9nVXJsIGlzIG5vdCBzcGVjaWZpZWQsIHRoaXMgd2lsbCBjbG9zZSB0aGUgY3VycmVudCBkaWFsb2cuXG4gICAqICAgICAgICAgICAgICAgICAgSWYgdGhlIG1ldGhvZCBpcyBjYWxsZWQgZnJvbSBhbiBleHRlbnNpb24sIGFuZCB0aGUgZGlhbG9nVXJsIGlzIG5vdCBzcGVjaWZpZWQsIHRoaXMgd2lsbCBjbG9zZSBhbGwgb3BlbiBkaWFsb2dzLlxuICAgKiBgYGBcbiAgICogICAgdGFibGVhdS5leHRlbnNpb25zLnVpLmNsb3NlRGlhbG9nKCdteVBheWxvYWQgc3RyaW5nJyk7XG4gICAqXG4gICAqIGBgYFxuICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgYSBjYWxsIHRvIHRoZSBjbG9zZURpYWxvZyBtZXRob2Qgd2hlbiB0aGUgZGlhbG9nIGV4dGVuc2lvbiBkb2VzIG5vdCByZXR1cm4gYSBwYXlsb2FkLlxuICAgKlxuICAgKiBgYGBcbiAgICogICAgLy8gc3BlY2lmeSBhbiBlbXB0eSBzdHJpbmcgaWYgbm8gcGF5bG9hZCBpcyByZXR1cm5lZFxuICAgKiAgICB0YWJsZWF1LmV4dGVuc2lvbnMudWkuY2xvc2VEaWFsb2coJycpO1xuICAgKiBgYGBcbiAgICpcbiAgICovXG4gIGNsb3NlRGlhbG9nKHBheWxvYWQ/OiBzdHJpbmcsIGRpYWxvZ1VybD86IHN0cmluZyk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGlhbG9nT3B0aW9ucyB7XG4gIC8qKiBTcGVjaWZpZXMgdGhlIHN1Z2dlc3RlZCB3aWR0aCAoaW4gcGl4ZWxzKSBvZiBkaWFsb2cgdG8gZGlzcGxheS4gIE5vdCBndWFyYW50ZWVkIHRvIGJlIGV4YWN0bHkgdGhhdCB3aWR0aC4gKi9cbiAgcmVhZG9ubHkgd2lkdGg/OiBudW1iZXI7XG4gIC8qKiBTcGVjaWZpZXMgdGhlIHN1Z2dlc3RlZCBoZWlnaHQgKGluIHBpeGVscykgb2YgdGhlIHBvcHVwIGRpYWxvZy4gIE5vdCBndWFyYW50ZWVkIHRvIGJlIGV4YWN0bHkgdGhhdCBoZWlnaHQuICovXG4gIHJlYWRvbmx5IGhlaWdodD86IG51bWJlcjtcbiAgLyoqXG4gICAqIFNwZWNpZmllcyB0aGUgc3R5bGUgZm9yIHRoZSBwb3B1cCBkaWFsb2cuXG4gICAqIEBzaW5jZSAxLjEwLjAgYW5kIFRhYmxlYXUgMjAyMi40XG4gICAqL1xuICByZWFkb25seSBkaWFsb2dTdHlsZT86IERpYWxvZ1N0eWxlO1xufVxuIiwiaW1wb3J0IHsgRGF0YVZhbHVlIH0gZnJvbSAnLi4vU2hhcmVkL0RhdGFUYWJsZUludGVyZmFjZXMnO1xuaW1wb3J0IHsgRGF0YVR5cGUsIFBhcmFtZXRlclZhbHVlVHlwZSwgUGVyaW9kVHlwZSB9IGZyb20gJy4uL1NoYXJlZC9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuaW1wb3J0IHsgRXZlbnRMaXN0ZW5lck1hbmFnZXIgfSBmcm9tICcuL0V2ZW50SW50ZXJmYWNlJztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgcGFyYW1ldGVyIGluIFRhYmxlYXUgYW5kIHByb3ZpZGVzIHdheXMgdG8gaW50cm9zcGVjdCB0aGUgcGFyYW1ldGVyIGFuZCBjaGFuZ2UgaXRzIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJhbWV0ZXIgZXh0ZW5kcyBFdmVudExpc3RlbmVyTWFuYWdlciB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIGRpc3BsYXkgbmFtZSBvZiB0aGlzIHBhcmFtZXRlci5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgIERhdGFWYWx1ZSByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIHBhcmFtZXRlci5cbiAgICovXG4gIHJlYWRvbmx5IGN1cnJlbnRWYWx1ZTogRGF0YVZhbHVlO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIHR5cGUgb2YgZGF0YSB0aGlzIHBhcmFtZXRlciBob2xkcy5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGFUeXBlOiBEYXRhVHlwZTtcblxuICAvKipcbiAgICogQHJldHVybnMgIFRoZSBhbGxvd2FibGUgc2V0IG9mIHZhbHVlcyB0aGlzIHBhcmFtZXRlciBjYW4gdGFrZS5cbiAgICovXG4gIHJlYWRvbmx5IGFsbG93YWJsZVZhbHVlczogUGFyYW1ldGVyRG9tYWluUmVzdHJpY3Rpb247XG5cbiAgLyoqXG4gICAqIEByZXR1cm4gICBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIFBhcmFtZXRlci5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIHRoaXMgcGFyYW1ldGVyIGFuZCBhc3NpZ25zIGl0IGEgbmV3IHZhbHVlLiBUaGUgbmV3IHZhbHVlIG11c3QgZmFsbCB3aXRoaW5cbiAgICogdGhlIGRvbWFpbiByZXN0cmljdGlvbnMgZGVmaW5lZCBieSBgYWxsb3dhYmxlVmFsdWVzYC4gSWYgdGhlIGRvbWFpbiByZXN0cmljdGlvbiBpcyBgUGFyYW1ldGVyVmFsdWVUeXBlLlJhbmdlYCxcbiAgICogYmUgc3VyZSB0byBjaGVjayB0aGUgYGFsbG93YWJsZVZhbHVlc2AgYmVmb3JlIGFzc2lnbmluZyBhIG5ldyB2YWx1ZS4gSWYgdGhlIG5ldyB2YWx1ZSBpcyBvdXQgb2YgcmFuZ2UsIHRoZVxuICAgKiB1cGRhdGVkIHZhbHVlIHdpbGwgYmUgc2V0IHRvIGVpdGhlciB0aGUgYG1pblZhbHVlYCBvciB0aGUgYG1heFZhbHVlYCBvZiB0aGUgYWxsb3dhYmxlIHJhbmdlLiBJZiBhIHN0ZXAgc2l6ZSBpcyBhbHNvIHNwZWNpZmllZFxuICAgKiBhbmQgdGhlIG5ldyB2YWx1ZSBkb2VzIG5vdCBmYWxsIG9uIHRoZSBzdGVwIGludGVydmFscywgdGhlIHVwZGF0ZWQgdmFsdWUgd2lsbCBiZSBzZXQgdG8gdGhlIGNsb3Nlc3QsIGxvd2VyIHN0ZXAsXG4gICAqIG9yIGNsb3Nlc3QsIGVhcmxpZXIgZGF0ZS4gSWYgdGhlIGRvbWFpbiByZXN0cmljdGlvbiBpcyB0eXBlIGBQYXJhbWV0ZXJWYWx1ZVR5cGUuTGlzdGAsIGFuZCB0aGVyZSBhcmUgYWxpYXNlcyBkZWZpbmVkIGZvciB0aGUgbGlzdCxcbiAgICogdGhlIGFsaWFzZWQgdmFsdWUgc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgbWV0aG9kLlxuICAgKlxuICAgKiBAcGFyYW0gbmV3VmFsdWUgIFRoZSBuZXcgdmFsdWUgdG8gYXNzaWduIHRvIHRoaXMgcGFyYW1ldGVyLlxuICAgKiA+WyFOb3RlXSBGb3IgY2hhbmdpbmcgYERhdGVgIHBhcmFtZXRlcnMsIFVUQyBEYXRlIG9iamVjdHMgYXJlIGV4cGVjdGVkLlxuICAgKiBAcmV0dXJucyAgICAgICAgIFRoZSB1cGRhdGVkIGBEYXRhVmFsdWVgLiBUaGUgcHJvbWlzZSBpcyByZWplY3RlZCBpZiBgbmV3VmFsdWVgIGlzIGludmFsaWQuIEhvd2V2ZXIsIGlmIHRoZSBkb21haW4gcmVzdHJpY3Rpb25cbiAgICogaXMgdHlwZSBgQWxsb3dhYmxlVmFsdWVzVHlwZS5SYW5nZWAsIGFuZCB0aGUgYG5ld1ZhbHVlYCBpcyBvdXQgb2YgdGhlIHJhbmdlIGJvdW5kcywgdGhlIHBhcmFtZXRlciBnZXRzIHNldCB0byB0aGUgYG1pblZhbHVlYFxuICAgKiBvciB0aGUgYG1heFZhbHVlYCBvZiB0aGUgcmFuZ2UgKHdoaWNoZXZlciBpcyBjbG9zZXIpLiBJZiB0aGUgcmFuZ2UgaGFzIGEgYHN0ZXBTaXplYCBvciBgZGF0ZVN0ZXBQZXJpb2RgLCB0aGUgcGFyYW1ldGVyIGdldHMgc2V0XG4gICAqIHRvIHRoZSBjbG9zZXN0LCBsb3dlciBzdGVwLCBvciB0aGUgY2xvc2VzdCwgZWFybGllciBkYXRlLlxuICAgKlxuICAgKi9cbiAgY2hhbmdlVmFsdWVBc3luYyhuZXdWYWx1ZTogc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IERhdGUpOiBQcm9taXNlPERhdGFWYWx1ZT47XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyB0aGUgYWxsb3dhYmxlIHNldCBvZiB2YWx1ZXMgd2hpY2ggYSBwYXJhbWV0ZXIgY2FuIGJlIHNldCB0by5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBQYXJhbWV0ZXJEb21haW5SZXN0cmljdGlvbiB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIHR5cGUgb2YgcmVzdHJpY3Rpb24gd2UgaGF2ZSBvbiB0aGUgcGFyYW1ldGVyJ3MgZG9tYWluLiBUaGlzIHZhbHVlXG4gICAqICAgICAgICAgICB3aWxsIGVmZmVjdCB3aGF0IG90aGVyIHByb3BlcnRpZXMgYXJlIGNvbmZpZ3VyZWQgb24gdGhpcyBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBQYXJhbWV0ZXJWYWx1ZVR5cGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBJZiBgUGFyYW1ldGVyVmFsdWVUeXBlLkxpc3RgLCB0aGUgYXJyYXkgd2lsbCBiZSB0aGUgbGlzdCBvZlxuICAgKiAgICAgICAgICAgdmFsdWVzIHdoaWNoIHRoZSBwYXJhbWV0ZXIgaXMgYWxsb3dlZCB0byB0YWtlLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxsb3dhYmxlVmFsdWVzPzogQXJyYXk8RGF0YVZhbHVlPjtcblxuICAvKipcbiAgICogQHJldHVybnMgIElmIGBQYXJhbWV0ZXJWYWx1ZVR5cGUuUmFuZ2VgLCB0aGUgdmFsdWUgd2lsbCBiZSB0aGUgbG93ZXJcbiAgICogICAgICAgICAgIGJvdW5kIG9mIGFsbG93YWJsZSB2YWx1ZXMgZm9yIHRoZSBwYXJhbWV0ZXIuXG4gICAqL1xuICByZWFkb25seSBtaW5WYWx1ZT86IERhdGFWYWx1ZTtcblxuICAvKipcbiAgICogQHJldHVybnMgIElmIGBQYXJhbWV0ZXJWYWx1ZVR5cGUuUmFuZ2VgLCB0aGUgdmFsdWUgd2lsbCBiZSB0aGUgdXBwZXJcbiAgICogICAgICAgICAgIGJvdW5kIG9mIGFsbG93YWJsZSB2YWx1ZXMgZm9yIHRoZSBwYXJhbWV0ZXIuXG4gICAqL1xuICByZWFkb25seSBtYXhWYWx1ZT86IERhdGFWYWx1ZTtcblxuICAvKipcbiAgICogQHJldHVybnMgIElmIGBQYXJhbWV0ZXJWYWx1ZVR5cGUuUmFuZ2VgLCB0aGUgdmFsdWUgd2lsbFxuICAgKiAgICAgICAgICAgZGVmaW5lIHRoZSBzdGVwIHNpemUgdXNlZCBpbiB0aGUgcGFyYW1ldGVyIFVJIGNvbnRyb2wgc2xpZGVyLlxuICAgKiAgICAgICAgICAgTm90ZSB0aGF0IGlmIHlvdSBzcGVjaWZ5IGEgbmV3IHZhbHVlIGZvciB0aGUgcGFyYW1ldGVyLCB1c2luZyB0aGUgYGNoYW5nZVZhbHVlQXN5bmMoKWAgbWV0aG9kLFxuICAgKiAgICAgICAgICAgdGhhdCBkb2VzIG5vdCBhbGlnbiBvbiB0aGUgYHN0ZXBTaXplYCBpbnRlcnZhbCwgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IHRvIHRoZSBjbG9zZXN0LCBsb3dlciBpbnRlcnZhbC5cbiAgICogICAgICAgICAgIEZvciBleGFtcGxlLCBpZiB0aGUgYHN0ZXBTaXplYCB3YXMgNSBhbmQgdGhlIHN0ZXBzIHdlcmUgMSwgNSwgMTAsIGlmIHRoZSBuZXcgdmFsdWUgc3BlY2lmaWVkXG4gICAqICAgICAgICAgICB3YXMgOCwgdGhlIHZhbHVlIDUgd291bGQgYmUgdXNlZCBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RlcFNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBJZiBgUGFyYW1ldGVyVmFsdWVUeXBlLlJhbmdlYCwgdGhpcyBkZWZpbmVzIHRoZSBzdGVwIGRhdGUgcGVyaW9kXG4gICAqICAgICAgICAgICB1c2VkIGluIHRoZSBQYXJhbWV0ZXIgVUkgY29udHJvbCBzbGlkZXIuIE5vdGUgdGhhdCBpZiB5b3Ugc3BlY2lmeSBhIG5ldyB2YWx1ZSBmb3IgdGhlIHBhcmFtZXRlcixcbiAgICogICAgICAgICAgIHVzaW5nIHRoZSBgY2hhbmdlVmFsdWVBc3luYygpYCBtZXRob2QsIHRoYXQgZG9lcyBub3QgYWxpZ24gb24gdGhlIGBkYXRlU3RlcFBlcmlvZGAgaW50ZXJ2YWwsIHRoZVxuICAgKiAgICAgICAgICAgdmFsdWUgd2lsbCBiZSBzZXQgdG8gdGhlIGNsb3Nlc3QsIGVhcmxpZXIgZGF0ZS5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGVTdGVwUGVyaW9kPzogUGVyaW9kVHlwZTtcbn1cbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICcuL05hbWVzcGFjZXMvVGFibGVhdSc7XG5cbi8qKlxuICogQ3VzdG9tIGVycm9yIGNsYXNzIHRoYXQgZXh0ZW5kcyB0aGUgZGVmYXVsdCBKYXZhU2NyaXB0IEVycm9yIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZWF1RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUYWJsZWF1IHNwZWNpZmljIEVycm9yQ29kZVxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3JDb2RlOiBFcnJvckNvZGVzO1xufVxuIiwiaW1wb3J0IHsgQW5ub3RhdGlvblR5cGUgfSBmcm9tICcuL05hbWVzcGFjZXMvVGFibGVhdSc7XG5cbi8qKlxuICogUmVwcmVzZW50cyBhbiBhbm5vdGF0aW9uIGluIGEgd29ya3NoZWV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFubm90YXRpb24ge1xuICAvKipcbiAgICogQHJldHVybnMgVGhlIGZvcm1hdHRlZCBhbm5vdGF0aW9uIGFzIGEgSFRNTCBzdHJpbmcuIEhUTUwgaXMgY3VycmVudGx5IG5vdCBhY2NlcHRlZCB3aGVuIGFkZGluZyBhbiBhbm5vdGF0aW9uLlxuICAgKi9cbiAgYW5ub3RhdGlvbkhUTUw6IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgVW5pcXVlIGlkIHJlcHJlc2VudGluZyB0aGUgYW5ub3RhdGlvbi5cbiAgICovXG4gIGFubm90YXRpb25JZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgcGxhaW4gdGV4dCBvZiB0aGUgYW5ub3RhdGlvbi5cbiAgICovXG4gIGFubm90YXRpb25UZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBhbm5vdGF0aW9uIHR5cGUuXG4gICAqL1xuICBhbm5vdGF0aW9uVHlwZTogQW5ub3RhdGlvblR5cGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFVuaXF1ZSB0dXBsZSByZXByZXNlbnRpbmcgdGhlIG1hcmsgdGhhdCBpcyBiZWluZyBhbm5vdGF0ZWQuIFRoZSB0dXBsZUlkIHdpbGwgYmUgMCBmb3IgQXJlYSBvciBQb2ludCBhbm5vdGF0aW9ucy5cbiAgICovXG4gIHR1cGxlSWQ6IG51bWJlcjtcbn1cbiIsImltcG9ydCB7IERhdGFUYWJsZSwgRGF0YVRhYmxlUmVhZGVyIH0gZnJvbSAnLi9EYXRhVGFibGVJbnRlcmZhY2VzJztcbmltcG9ydCB7XG4gIENvbHVtblR5cGUsXG4gIERhdGFGb3JtYXRUeXBlLFxuICBEYXRhVHlwZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUsXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBOZWdhdGl2ZU51bWJlckZvcm1hdCxcbiAgTnVtYmVyRm9ybWF0VW5pdHMsXG59IGZyb20gJy4vTmFtZXNwYWNlcy9UYWJsZWF1JztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBkYXRhIHNvdXJjZSB1c2VkIGJ5IGEgV29ya3NoZWV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERhdGFTb3VyY2Uge1xuICAvKipcbiAgICogQHJldHVybnMgVGhlIHVzZXIgZnJpZW5kbHkgbmFtZSBvZiB0aGUgZGF0YSBzb3VyY2UgYXMgc2VlbiBpbiB0aGUgVUkuXG4gICAqL1xuICByZWFkb25seSBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFVuaXF1ZSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgZGF0YSBzb3VyY2UuXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBmaWVsZHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGF0YSBzb3VyY2UuXG4gICAqL1xuICByZWFkb25seSBmaWVsZHM6IEFycmF5PEZpZWxkPjtcblxuICAvKipcbiAgICogQHJldHVybnMgTGFzdCB1cGRhdGUgdGltZSBvZiB0aGUgZGF0YSBzb3VyY2UncyBleHRyYWN0LCBvciB1bmRlZmluZWQgaWYgdGhpcyBkYXRhIHNvdXJjZSBpcyBsaXZlLlxuICAgKi9cbiAgcmVhZG9ubHkgZXh0cmFjdFVwZGF0ZVRpbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGlzIGRhdGEgc291cmNlIGlzIGFuIGV4dHJhY3QsIGZhbHNlIG90aGVyd2lzZS5cbiAgICovXG4gIHJlYWRvbmx5IGlzRXh0cmFjdDogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHJldHVybnMgVHJ1ZSBpZiB0aGlzIGRhdGEgc291cmNlIGlzIHB1Ymxpc2hlZCB0byBzZXJ2ZXIsIGZhbHNlIG90aGVyd2lzZS4gQWx3YXlzIHVuZGVmaW5lZCBwcmlvciB0byBUYWJsZWF1IDIwMjEuNC5cbiAgICogQHNpbmNlIDEuNy4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgcmVhZG9ubHkgaXNQdWJsaXNoZWQ6IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFVSTCBvZiBkYXRhIHNvdXJjZSBpZiBwdWJsaXNoZWQgdG8gc2VydmVyLCB1bmRlZmluZWQgb3RoZXJ3aXNlLiBBbHdheXMgdW5kZWZpbmVkIHByaW9yIHRvIFRhYmxlYXUgMjAyMS40LlxuICAgKiBAc2luY2UgMS43LjAgYW5kIFRhYmxlYXUgMjAyMS40XG4gICAqIEBoaWRkZW4gRm9yIGZpcnN0IGNsYXNzIGV4dGVuc2lvbnMgb25seVxuICAgKi9cbiAgcHVibGlzaGVkVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZDtcblxuICAvKipcbiAgICogVGhpcyBjYWxsIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGNsaWNraW5nIHRoZSBSZWZyZXNoIG9wdGlvbiBvbiBhIGRhdGEgc291cmNlIGluXG4gICAqIFRhYmxlYXUuICBUaGlzIGRvZXMgbm90IHJlZnJlc2ggYW4gZXh0cmFjdC5cbiAgICpcbiAgICogPlshTm90ZV0gVGhlIGByZWZyZXNoQXN5bmMoKWAgbWV0aG9kIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gc2NlbmFyaW9zIHdoZXJlIG1hbnVhbFxuICAgKiBpbnRlcmFjdGlvbiBjYXVzZXMgYSBuZWVkIHRvIHJlZnJlc2ggdGhlIGRhdGEgaW4gdGhlIFRhYmxlYXUgdmlzdWFsaXphdGlvbi4gVGhlIG1ldGhvZCBpcyBub3QsXG4gICAqIGFzIGN1cnJlbnRseSBkZXNpZ25lZCwgbWVhbnQgdG8gc3VwcG9ydCBvciBlbXVsYXRlIHN0cmVhbWluZyBvciAqbGl2ZSogdmlzdWFsaXphdGlvbnMuXG4gICAqIEV4dGVuc2lvbnMgdGhhdCB1c2UgdGhlIG1ldGhvZCB0byByZWZyZXNoIGFnZ3Jlc3NpdmVseSBvciBhdXRvbWF0aWNhbGx5XG4gICAqIGNhbiBjYXVzZSBpc3N1ZXMgb24gVGFibGVhdSBTZXJ2ZXIgYW5kIFRhYmxlYXUgT25saW5lIGFuZCBhcmUgc3ViamVjdCB0byBiZWluZyBibG9ja2VkXG4gICAqIGJ5IHRoZSBUYWJsZWF1IE9ubGluZSBhZG1pbmlzdHJhdG9yLlxuICAgKlxuICAgKiBUaGlzIGNhbGwgZG9lcyBub3QgY3VycmVudGx5IHN1cHBvcnQgcmVmcmVzaGluZyBsaXZlIEdvb2dsZSBTaGVldCBkYXRhIHNvdXJjZXMuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBkYXRhIHNvdXJjZSBoYXMgZmluaXNoZWQgcmVmcmVzaGluZy5cbiAgICovXG4gIHJlZnJlc2hBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiB0YWJsZSBzdW1tYXJ5IG9iamVjdHMgdGhhdCBhcmUgY3VycmVudGx5IHVzZWQgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgKlxuICAgKiBAdGhyb3dzICBVbnN1cHBvcnRlZE1ldGhvZEZvckRhdGFTb3VyY2VUeXBlIGVycm9yIGlmIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBvbiBhIEN1YmUgRGF0YVNvdXJjZSBvciBHQS5cbiAgICpcbiAgICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAxLjQuMC4gIFVzZSBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYy5cbiAgICovXG4gIGdldEFjdGl2ZVRhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8VGFibGVTdW1tYXJ5Pj47XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIEFuIGFycmF5IG9mIGRlc2NyaXB0aW9ucyBvZiB0aGUgY29ubmVjdGlvbnMgd2l0aGluIHRoaXMgZGF0YSBzb3VyY2UuXG4gICAqL1xuICBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb25uZWN0aW9uU3VtbWFyeT4+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAgQ29sbGVjdGlvbiBvZiBvcHRpb25zIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGNhbGwuXG4gICAqIEByZXR1cm5zICAgICAgICBSZXR1cm5zIGEgcHJvbWlzZSBjb250YWluaW5nIGEgcGFnZSBvZiBkYXRhIGZyb20gdGhlIHVuZGVybHlpbmcgZGF0YSBvZiB0aGUgZGF0YSBzb3VyY2UuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB1c2Ugb2YgdGhlIGBnZXRVbmRlcmx5aW5nRGF0YUFzeW5jKClgIG1ldGhvZCB0byBnZXQgdGhlIHVuZGVybHlpbmcgZGF0YSBmcm9tIGEgc3BlY2lmaWMgZGF0YSBzb3VyY2UuXG4gICAqIFRoZSBleGFtcGxlIHVzZXMgdGhlIEphdmFTY3JpcHQgYGZpbmQoKWAgbWV0aG9kIHRvIHNlbGVjdCB0aGUgd29ya2Jvb2sgYW5kIGRhdGEgc291cmNlLlxuICAgKlxuICAgKiBgYGBcbiAgICogY29uc3QgZGF0YVNvdXJjZXMgPSBhd2FpdCB3b3Jrc2hlZXQuZ2V0RGF0YVNvdXJjZXNBc3luYygpO1xuICAgKiBjb25zdCBkYXRhU291cmNlID0gZGF0YVNvdXJjZXMuZmluZChkYXRhc291cmNlID0+IGRhdGFzb3VyY2UubmFtZSA9PT0gXCJTYW1wbGUgLSBTdXBlcnN0b3JlXCIpO1xuICAgKiBjb25zdCBkYXRhVGFibGUgPSBhd2FpdCBkYXRhU291cmNlLmdldFVuZGVybHlpbmdEYXRhQXN5bmMoKTtcbiAgICogbGV0IGZpZWxkID0gZGF0YVRhYmxlLmNvbHVtbnMuZmluZChjb2x1bW4gPT4gY29sdW1uLmZpZWxkTmFtZSA9PT0gXCJTdWItQ2F0ZWdvcnlcIik7XG4gICAqIGxldCBsaXN0ID0gW107XG4gICAqIGZvciAobGV0IHJvdyBvZiBkYXRhVGFibGUuZGF0YSkge1xuICAgKiAgICAgbGlzdC5wdXNoKHJvd1tmaWVsZC5pbmRleF0udmFsdWUpO1xuICAgKiB9XG4gICAqIGxldCB2YWx1ZXMgPSBsaXN0LmZpbHRlcigoZWwsIGksIGFycikgPT4gYXJyLmluZGV4T2YoZWwpID09PSBpKTtcbiAgICogY29uc29sZS5sb2codmFsdWVzKTtcbiAgICpcbiAgICogYGBgXG4gICAqIEBkZXByZWNhdGVkIFVzZSBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luYyBvciBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYy5cbiAgICovXG4gIGdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9ucz86IERhdGFTb3VyY2VVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPERhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqXG4gICAqIEdldHMgdGhlIHVuZGVybHlpbmcgbG9naWNhbCB0YWJsZXMgdXNlZCBpbiB0aGUgZGF0YSBzb3VyY2UuXG4gICAqXG4gICAqIEBzaW5jZSAxLjQuMFxuICAgKiBAcmV0dXJucyBBbiBhcnJheSBvZiBsb2dpY2FsIHRhYmxlcyB0aGF0IGFyZSBjdXJyZW50bHkgdXNlZCBpbiB0aGUgZGF0YSBzb3VyY2UuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSB1c2VzIHRoZSBgZ2V0TG9naWNhbFRhYmxlc0FzeW5jYCBtZXRob2QgdG8gcHJpbnQgdGhlIG5hbWVzIG9mIHRoZVxuICAgKiB0aGUgbG9naWNhbCB0YWJsZXMgdG8gdGhlIGNvbnNvbGUuXG4gICAqXG4gICAqIGBgYFxuICAgKiBkYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYygpLnRoZW4oZnVuY3Rpb24gKGxvZ2ljYWxUYWJsZXMpIHtcbiAgICogICAvLyBMb29wIHRocm91Z2ggZWFjaCB0YWJsZSB0aGF0IHdhcyB1c2VkIGluIGNyZWF0aW5nIHRoaXMgZGF0YSBzb3VyY2VcbiAgICogICBsb2dpY2FsVGFibGVzLmZvckVhY2goZnVuY3Rpb24gKHRhYmxlKSB7XG4gICAqICAgICAgY29uc29sZS5sb2codGFibGUuY2FwdGlvbik7XG4gICAqICAgfSk7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIGdldExvZ2ljYWxUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PExvZ2ljYWxUYWJsZT4+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1bmRlcmx5aW5nIGRhdGEgdGFibGUgZm9yIHRoZSBnaXZlbiBsb2dpY2FsIHRhYmxlIGlkLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAgQ29sbGVjdGlvbiBvZiBvcHRpb25zIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgdGhlIGNhbGwuXG4gICAqIEByZXR1cm5zIEEgZGF0YSB0YWJsZSBjb250YWluaW5nIHRoZSB1bmRlcmx5aW5nIGRhdGEgb2YgdGhlIGRhdGEgc291cmNlLlxuICAgKiBAc2VlIGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luYyB0byByZWFkIG1vcmUgdGhhbiAxMCwwMDAgcm93cy5cbiAgICpcbiAgICogWW91IGNhbiB1c2UgdGhlIGBnZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMubWF4Um93c2AgcHJvcGVydHkgdG8gcmVxdWVzdCB0aGUgbnVtYmVyIG9mIHJvd3Mgb2YgZGF0YSB0byByZXR1cm4uXG4gICAqIElmIHVuc3BlY2lmaWVkIChtYXhSb3dzID09ICcwJyksIHRoZSBjYWxsIHRvIGBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmNgIHJlcXVlc3RzIGFsbCByb3dzIGluIHRoZSBsb2dpY2FsIHRhYmxlLlxuICAgKiBOb3RlIHRoYXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWQgZnJvbSB0aGUgYGdldExvZ2ljYWxUYWJsZURhdGFBc3luYygpYCBtZXRob2QgaXMgbGltaXRlZFxuICAgKiB0byAxMCwwMDAgcm93cy4gWW91IGNhbiB1c2UgdGhlIGBEYXRhVGFibGVgIHByb3BlcnR5LCBgaXNUb3RhbFJvd0NvdW50TGltaXRlZGAsIHRvIHRlc3Qgd2hldGhlciB0aGVyZSBpc1xuICAgKiBtb3JlIGRhdGEuIEEgdmFsdWUgb2YgdHJ1ZSBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbGluZyBmdW5jdGlvbiByZXF1ZXN0ZWQgbW9yZSByb3dzIHRoYW4gdGhlIGxpbWl0ICgxMCwwMDApIGFuZCB0aGVcbiAgICogdW5kZXJseWluZyBkYXRhIHNvdXJjZSBjb250YWlucyBtb3JlIHJvd3MgdGhhbiBjYW4gYmUgcmV0dXJuZWQuXG4gICAqXG4gICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyB1c2Ugb2YgdGhlIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYygpIG1ldGhvZCB0byBnZXQgdGhlIGRhdGEgZnJvbSBhIHNwZWNpZmljIGxvZ2ljYWwgdGFibGUgaW4gYSBkYXRhIHNvdXJjZS5cbiAgICogVGhlIGV4YW1wbGUgdXNlcyB0aGUgSmF2YVNjcmlwdCBmaW5kKCkgbWV0aG9kIHRvIHNlbGVjdCB0aGUgd29ya2Jvb2ssIGFuZCB1c2VzIHRoZSBnZXRMb2dpY2FsVGFibGVzQXN5bmMgbWV0aG9kIHRvIGlkZW50aWZ5IHRoZSBsb2dpY2FsIHRhYmxlIGlkLlxuICAgKiBgYGBcbiAgICogY29uc3QgZGF0YVNvdXJjZXMgPSBhd2FpdCB3b3Jrc2hlZXQuZ2V0RGF0YVNvdXJjZXNBc3luYygpO1xuICAgKiBjb25zdCBkYXRhU291cmNlID0gZGF0YVNvdXJjZXMuZmluZChkYXRhc291cmNlID0+IGRhdGFzb3VyY2UubmFtZSA9PT0gXCJTYW1wbGUgLSBTdXBlcnN0b3JlXCIpO1xuICAgKiBjb25zdCBsb2dpY2FsVGFibGVzID0gYXdhaXQgZGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVzQXN5bmMoKVxuICAgKiBjb25zdCBkYXRhVGFibGUgPSBhd2FpdCBkYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVzWzBdLmlkKTtcbiAgICogY29uc29sZS5sb2coZGF0YVRhYmxlKTtcbiAgICogYGBgXG4gICAqL1xuXG4gIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8RGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgdW5kZXJseWluZyBkYXRhIHRhYmxlIHJlYWRlciBmb3IgdGhlIGdpdmVuIGxvZ2ljYWwgdGFibGUgaWQuXG4gICAqIE9ubHkgb25lIGFjdGl2ZSBEYXRhVGFibGVSZWFkZXIgcGVyIGxvZ2ljYWwgdGFibGUgaWQgaXMgc3VwcG9ydGVkLlxuICAgKlxuICAgKiBAcGFyYW0gbG9naWNhbFRhYmxlSWQgbG9naWNhbCB0YWJsZSBpZC5cbiAgICogQHBhcmFtIHBhZ2VSb3dDb3VudCBUaGUgbnVtYmVyIG9mIHJvd3MgcGVyIHBhZ2UuIFRoZSBkZWZhdWx0IGFuZCBtYXhpbXVtIGlzIDEwLDAwMCByb3dzLlxuICAgKiBAcGFyYW0gb3B0aW9ucyAgQ29sbGVjdGlvbiBvZiBvcHRpb25zIHRvIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgdGhlIHJlYWRlci5cbiAgICogQHJldHVybnMgICAgICAgIEEgZGF0YSB0YWJsZSByZWFkZXIgdG8gYWNjZXNzIHRoZSBsb2dpY2FsIHRhYmxlIGRhdGEgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgKiBAaGlkZGVuXG4gICAqIGBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmNgIGF0dGVtcHRzIHRvIHByZXBhcmUgYWxsIHRoZSByb3dzIG9mIHRoZSB0YWJsZSB0byBiZSByZWFkIGFzIHBhZ2VzLlxuICAgKiBUaGVyZSBpcyBhIGxpbWl0IHRvIHRoZSBudW1iZXIgb2Ygcm93cyB0aGF0IGNhbiBiZSBwcmVwYXJlZC4gVGhlIGRlZmF1bHQgbGltaXQgaXMgYWJvdXQgMSBtaWxsaW9uXG4gICAqIHJvd3Mgb2YgZGF0YS4gSG93ZXZlciwgaWYgdGhlIGRhdGEgc291cmNlIGhhcyBtYW55IGNvbHVtbnMsIHRoaXMgbnVtYmVyIHdpbGwgYmUgYWRqdXN0ZWQgZG93bndhcmQuXG4gICAqIFlvdSBjYW4gY2hhbmdlIHRoZSBkZWZhdWx0IGxpbWl0IHdpdGggdGhlIFRhYmxlYXUgU2VydmVyIChDbG91ZCkgb3IgVGFibGVhdSBEZXNrdG9wIG9wdGlvbjogRXh0ZW5zaW9uc0FuZEVtYmVkZGluZ1JlYWRlckNlbGxMaW1pdC5cbiAgICogSWYgdGhlIGRhdGEgc291cmNlIGhhcyBtYW55IGNvbHVtbnMsIGBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmNgIGNhbiBiZSBzcGVkIHVwIGJ5IG9ubHkgcmVxdWVzdGluZ1xuICAgKiBuYXRpdmUgZGF0YSB2YWx1ZXMgaW4gdGhlIGBEYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zYC5cbiAgICpcbiAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHVzZSBvZiB0aGUgYGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luY2AgYW5kIGBnZXRBbGxQYWdlc0FzeW5jYCB0b1xuICAgKiBwcmVwYXJlIHBhZ2VzIG9mIDEwLDAwMCByb3dzIGVhY2gsIGFuZCB0aGVuIHRvIGdldCBhIG1heGltdW0gb2YgMTUwLDAwMCByb3dzIG9mIG5hdGl2ZSBkYXRhIGZyb21cbiAgICogYSBzcGVjaWZpYyBsb2dpY2FsIHRhYmxlIGluIGEgZGF0YSBzb3VyY2UuXG4gICAqXG4gICAqIGBgYFxuICAgKiBjb25zdCBkYXRhU291cmNlcyA9IGF3YWl0IHdvcmtzaGVldC5nZXREYXRhU291cmNlc0FzeW5jKCk7XG4gICAqIGNvbnN0IGRhdGFTb3VyY2UgPSBkYXRhU291cmNlcy5maW5kKGRhdGFzb3VyY2UgPT4gZGF0YXNvdXJjZS5uYW1lID09PSBcIlNhbXBsZSAtIFN1cGVyc3RvcmVcIik7XG4gICAqIGNvbnN0IGxvZ2ljYWxUYWJsZXMgPSBhd2FpdCBkYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYygpXG4gICAqIGNvbnN0IGRhdGFUYWJsZVJlYWRlciA9IGF3YWl0IGRhdGFTb3VyY2UuZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKGxvZ2ljYWxUYWJsZXNbMF0uaWQsIDEwMDAwLFxuICAgKiAgICAgeyBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogdGFibGVhdS5JbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5Pbmx5TmF0aXZlVmFsdWVzIH0pO1xuICAgKiBjb25zdCBkYXRhVGFibGUgPSBhd2FpdCBkYXRhVGFibGVSZWFkZXIuZ2V0QWxsUGFnZXNBc3luYygxNTAwMDApO1xuICAgKiBjb25zb2xlLmxvZyhkYXRhVGFibGUpO1xuICAgKiBhd2FpdCBkYXRhVGFibGVSZWFkZXIucmVsZWFzZUFzeW5jKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBEYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPERhdGFUYWJsZVJlYWRlcj47XG59XG5cbi8qKlxuICogQmFzaWMgcHJvcGVydGllcyBvZiBhIGZpZWxkXG4gKiBAaGlkZGVuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRCYXNlIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zICBUaGUgbmFtZSBvZiB0aGUgZmllbGQgKGkuZS4gdGhlIGNhcHRpb24pLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVXNlciBkZXNjcmlwdGlvbiBvZiBmaWVsZCwgdW5kZWZpbmVkIGlmIHRoZXJlIGlzIG5vbmUuXG4gICAqL1xuICByZWFkb25seSBkZXNjcmlwdGlvbjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgZGF0YSB0eXBlIG9mIHRoZSBmaWVsZFxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YVR5cGU6IERhdGFUeXBlIHwgdW5kZWZpbmVkO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIHJvbGUgb2YgdGhpcyBmaWVsZC5cbiAgICovXG4gIHJlYWRvbmx5IHJvbGU6IEZpZWxkUm9sZVR5cGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUaGUgdHlwZSBvZiBhZ2dyZWdhdGlvbiBmb3IgdGhpcyBmaWVsZC5cbiAgICovXG4gIHJlYWRvbmx5IGFnZ3JlZ2F0aW9uOiBGaWVsZEFnZ3JlZ2F0aW9uVHlwZTtcblxuICAvKipcbiAgICogQHJldHVybnMgIFRoZSB0eXBlIG9mIHRoZSBjb2x1bW4sIGVpdGhlciBkaXNjcmV0ZSBvciBjb250aW51b3VzLiBDb3VsZCBob2xkIHZhbHVlICdVbmtub3duJy5cbiAgICovXG4gIHJlYWRvbmx5IGNvbHVtblR5cGU6IENvbHVtblR5cGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUcnVlIGlmIHRoaXMgZmllbGQgaXMgYSB0YWJsZSBjYWxjdWxhdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGlzQ2FsY3VsYXRlZEZpZWxkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVHJ1ZSBpZiB0aGlzIGZpZWxkIGlzIGEgY29tYmluYXRpb24gb2YgbXVsdGlwbGUgZmllbGRzLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICByZWFkb25seSBpc0NvbWJpbmVkRmllbGQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUcnVlIGlmIHRoaXMgZmllbGQgaXMgZ2VuZXJhdGVkIGJ5IFRhYmxlYXUsIGZhbHNlIG90aGVyd2lzZS5cbiAgICogICAgICAgICAgIFRhYmxlYXUgZ2VuZXJhdGVzIGEgbnVtYmVyIG9mIGZpZWxkcyBmb3IgYSBkYXRhIHNvdXJjZSwgc3VjaCBhcyBOdW1iZXJcbiAgICogICAgICAgICAgIG9mIFJlY29yZHMsIG9yIE1lYXN1cmUgVmFsdWVzLiAgVGhpcyBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0b1xuICAgKiAgICAgICAgICAgZGlzdGluZ3Vpc2ggYmV0d2VlbiB0aG9zZSBmaWVsZHMgYW5kIGZpZWxkcyB0aGF0IGNvbWUgZnJvbSB0aGUgdW5kZXJseWluZ1xuICAgKiAgICAgICAgICAgZGF0YSBjb25uZWN0aW9uLCBvciB3ZXJlIGNyZWF0ZWQgYnkgYSB1c2VyLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNHZW5lcmF0ZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRydWUgaWYgdGhpcyByb2xlIGhhcyBhIHNlbWFudGljIHR5cGUgb2YgZ2Vvc3BhdGlhbDogZS5nIGxhdGl0dWRlLCBsb25naXR1ZGUsIHppcGNvZGUsIENpdHkgbmFtZS4uLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNHZW9zcGF0aWFsOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVHJ1ZSBpZiB0aGlzIGZpZWxkIGlzIGhpZGRlbiwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNIaWRkZW46IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUcnVlIGlmIHRoaXMgZmllbGQgY29tZXMgZnJvbSB0aGUgcHVibGlzaGVkIGRhdGFzb3VyY2UuIEZhbHNlIGlmIGl0IHdhcyBjcmVhdGVkIGluIFRhYmxlYXUgKGFzIGEgY2FsY3VsYXRlZCBmaWVsZCwgZm9yIGV4YW1wbGUpLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBUaGUgc2VtYW50aWMgcm9sZSBvZiB0aGUgZmllbGQuXG4gICAqIENhbiBiZSBlaXRoZXIgYSBnZW9ncmFwaGljIHJvbGUgKGUuZy4gbGF0aXR1ZGUsIGxvbmdpdHVkZSwgY2l0eSwgY291bnRyeSwgZXRjLi4uKSBvciBhbiBpbWFnZSByb2xlXG4gICAqIEBzaW5jZSAxLjE2LjBcbiAgICovXG4gIHNlbWFudGljUm9sZT86IHN0cmluZztcblxuICAvKipcbiAgICogRGF0YSBmb3JtYXR0aW5nIG9wdGlvbnMgZm9yIHRoZSBmaWVsZC5cbiAgICogQHNpbmNlIDEuMTYuMFxuICAgKi9cbiAgZGF0YUZvcm1hdD86IERhdGFGb3JtYXQ7XG59XG5cbi8qKlxuICogQSBmaWVsZCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGRhdGEgc291cmNlIGl0IGJlbG9uZ3MgdG8sXG4gKiBpdHMgcm9sZSwgYW5kIHRoZSBhYmlsaXR5IHRvIGZldGNoIHRoZSBkb21haW4gdmFsdWVzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpZWxkIGV4dGVuZHMgRmllbGRCYXNlIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zICBVbmlxdWUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIGZpZWxkIGluIHRoaXMgZGF0YXNvdXJjZS5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUaGUgZGF0YSBzb3VyY2UgdG8gd2hpY2ggdGhpcyBmaWVsZCBiZWxvbmdzLlxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YVNvdXJjZTogRGF0YVNvdXJjZTtcbn1cblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY29ubmVjdGlvbiB3aXRoaW4gYSBkYXRhc291cmNlIChleDogQSBTUUwgU2VydmVyIGNvbm5lY3Rpb24pLlxuICogQSBkYXRhIHNvdXJjZSBjYW4gYmUgY29tcG9zZWQgb2Ygb25lIG9yIG1vcmUgY29ubmVjdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvblN1bW1hcnkge1xuICAvKipcbiAgICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIGNvbm5lY3Rpb24gKGkuZS4gdGhlIGNhcHRpb24pLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBVbmlxdWUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIGNvbm5lY3Rpb24uXG4gICAqL1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgdHlwZSBvZiB0aGUgY29ubmVjdGlvbiAoaS5lLiBTUUwgU2VydmVyLCB3ZWIgZGF0YSBjb25uZWN0b3IpLlxuICAgKi9cbiAgcmVhZG9ubHkgdHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgVVJJIHRvIHdoaWNoIHRoZSBjb25uZWN0aW9uIGlzIHBvaW50aW5nLCBpZiBhcHBsaWNhYmxlLlxuICAgKiAgICAgICAgICBJZiBhIGRhdGEgc291cmNlIGlzIGEgcHVibGlzaGVkIGRhdGEgc291cmNlLCB0aGUgVVJJIGlzIHJldHVybmVkXG4gICAqICAgICAgICAgIGFzIGBsb2NhbGhvc3RgLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmVyVVJJOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogUmVwcmVzZW50cyBhIHRhYmxlIG9mIGRhdGEgaW4gYSBkYXRhIHNvdXJjZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBUYWJsZVN1bW1hcnkge1xuICAvKipcbiAgICogQHJldHVybnMgVGhlIG5hbWUgb2YgdGhlIHRhYmxlIChpLmUuIHRoZSBjYXB0aW9uKS5cbiAgICovXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgVW5pcXVlIHN0cmluZyByZXByZXNlbnRpbmcgdGhpcyB0YWJsZS5cbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRoZSBJRCBvZiB0aGUgY29ubmVjdGlvbiB0aGF0IHRoaXMgdGFibGUgYmVsb25ncyB0by5cbiAgICovXG4gIHJlYWRvbmx5IGNvbm5lY3Rpb25JZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB0aGUgY3VzdG9tIFNRTCB1c2VkIHRvIGNyZWF0ZSB0aGlzIHRhYmxlIGlmIGl0IHdhcyBjcmVhdGVkIHdpdGggQ3VzdG9tIFNRTCwgdW5kZWZpbmVkIG90aGVyd2lzZS5cbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVNRTDogc3RyaW5nIHwgdW5kZWZpbmVkO1xufVxuXG4vKipcbiAqXG4gKiBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgZmV0Y2hpbmcgZGF0YSBmcm9tIGFuIGRhdGEgc291cmNlIG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zIHtcbiAgLyoqXG4gICAqIERvIG5vdCB1c2UgYWxpYXNlcyBzcGVjaWZpZWQgaW4gdGhlIGRhdGEgc291cmNlIGluIFRhYmxlYXUuIERlZmF1bHQgaXMgZmFsc2UuXG4gICAqL1xuICBpZ25vcmVBbGlhc2VzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIGNvbHVtbnMgdG8gcmV0dXJuIHNwZWNpZmllZCBieSBmaWVsZCBuYW1lLCByZXR1cm5zIGFsbCBieSBkZWZhdWx0LlxuICAgKi9cbiAgY29sdW1uc1RvSW5jbHVkZT86IEFycmF5PHN0cmluZz47XG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW5zIHRvIHJldHVybiBzcGVjaWZpZWQgYnkgZmllbGQgaWQsIHJldHVybnMgYWxsIGJ5IGRlZmF1bHQuXG4gICAqIFNpbmNlIDEuNS4wLCBmaWVsZElkIGlzIGEgcHJvcGVydHkgb2YgdGhlIENvbHVtbiBvYmplY3QuXG4gICAqXG4gICAqIEBzaW5jZSAxLjUuMFxuICAgKi9cbiAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ/OiBBcnJheTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXR1cm4uIDEwLDAwMCBieSBkZWZhdWx0XG4gICAqIEBzaW5jZSAxLjEwLjAgYW5kIFRhYmxlYXUgMjAyMi40IENvbnNpZGVyIHVzaW5nIGEgRGF0YVRhYmxlUmVhZGVyIHJldHVybmVkIGJ5IG9uZSBvZiB0aGUgZ2V0Li4uRGF0YVJlYWRlckFzeW5jIG1ldGhvZHNcbiAgICogdG8gYXZvaWQgdGhlIDEwLDAwMCByb3cgbGltaXQuXG4gICAqL1xuICBtYXhSb3dzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoaWNoIHByb3BlcnRpZXMgdG8gcmV0dXJuIGluIERhdGFWYWx1ZXMuIFRoZSBkZWZhdWx0IGlzIGBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXNgLlxuICAgKiBBbGwgcHJvcGVydGllcyBub3QgcmVxdWVzdGVkIHdpbGwgYmUgYHVuZGVmaW5lZGAgaW4gdGhlIERhdGFWYWx1ZSByZXN1bHRzLlxuICAgKiBUaGlzIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIG9ubHksIGFuZCB3aWxsIGJlIGlnbm9yZWQgaW4gVGFibGVhdSB2ZXJzaW9ucyBwcmlvciB0byAyMDIxLjIuXG4gICAqXG4gICAqIEBzaW5jZSAxLjUuMFxuICAgKi9cbiAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24/OiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbjtcbn1cblxuLyoqXG4gKiBAc2luY2UgMS40LjBcbiAqIFJlcHJlc2VudHMgYSBsb2dpY2FsIHRhYmxlIGluIGEgZGF0YSBzb3VyY2Ugb3IgYSBsb2dpY2FsIHRhYmxlIHVzZWQgaW4gYSB3b3Jrc2hlZXRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBMb2dpY2FsVGFibGUge1xuICByZWFkb25seSBpZDogc3RyaW5nO1xuXG4gIHJlYWRvbmx5IGNhcHRpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBAc2luY2UgMS4xNi4wXG4gKiBGb3JtYXR0aW5nIG9wdGlvbnMgZm9yIGEgbnVtYmVyIG9yIGRhdGUgY29sdW1uXG4gKi9cbmV4cG9ydCB0eXBlIERhdGFGb3JtYXQgPSB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgZGVmYXVsdCBmb3JtYXR0aW5nIG9wdGlvbnMgZm9yIGVhY2ggbWFyay5cbiAgICovXG4gIGRlZmF1bHRPcHRpb25zOiBEYXRhRm9ybWF0dGluZ09wdGlvbnM7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgc3VidG90YWxzIGZvcm1hdHRpbmcgb3B0aW9ucyBmb3IgYSBncm91cCBvZiBtYXJrcy5cbiAgICovXG4gIHN1YnRvdGFsc09wdGlvbnM/OiBEYXRhRm9ybWF0dGluZ09wdGlvbnM7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgdG90YWxzIGZvcm1hdHRpbmcgb3B0aW9ucyBmb3IgYWxsIG1hcmtzLlxuICAgKi9cbiAgdG90YWxzT3B0aW9ucz86IERhdGFGb3JtYXR0aW5nT3B0aW9ucztcbiAgLyoqXG4gICAqIEByZXR1cm5zIEZvcm1hdHRpbmcgb3ByaW9ucyBmb3IgdGhlIGZpZWxkJ3MgYXhpcy5cbiAgICovXG4gIGF4aXNPcHRpb25zPzogRGF0YUZvcm1hdHRpbmdPcHRpb25zO1xufTtcblxuLyoqXG4gKiBAc2luY2UgMS4xNi4wXG4gKiBGb3JtYXR0aW5nIG9wdGlvbnMgZm9yIGEgbnVtYmVyIG9yIGRhdGUgY29sdW1uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUZvcm1hdHRpbmdPcHRpb25zIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSB0eXBlIG9mIHRoZSBmb3JtYXQuXG4gICAqIENhbiBzcGVjaWZ5IG51bWJlciwgY3VycmVuY3ksIGRhdGUsIHRpbWUsIHBlcmNlbnRhZ2UsIHNjaWVudGlmaWMsIG9yIGF1dG8tZm9ybWF0IChkZWZhdWx0KS5cbiAgICogRm9yIG51bWJlcnMsIGNhbiBhbHNvIHNwZWNpZnkgY3VzdG9tIG51bWJlciBmb3JtYXQuXG4gICAqL1xuICBmb3JtYXRUeXBlOiBEYXRhRm9ybWF0VHlwZTtcbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBsb2NhbGUgb2YgdGhlIGZvcm1hdCAoZS5nLiBlbi1VUywgZnItRlIsIGV0Yy4pLlxuICAgKi9cbiAgbG9jYWxlOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgbnVtYmVyIG9mIGRpZ2l0cyB0byBkaXNwbGF5IGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LlxuICAgKi9cbiAgZGVjaW1hbHM6IG51bWJlcjtcbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBjaGFyYWN0ZXIgdG8gdXNlIGFzIHRoZSBkZWNpbWFsIHBvaW50LlxuICAgKi9cbiAgZGVjaW1hbENoYXJhY3Rlcjogc3RyaW5nO1xuICAvKipcbiAgICogQHJldHVybnMgV2hldGhlciB0byBzaG93IHRob3VzYW5kIHNlcGFyYXRvcnMuXG4gICAqL1xuICBzaG93U2VwYXJhdG9yczogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBjaGFyYWN0ZXIgdG8gdXNlIGFzIHRoZSB0aG91c2FuZCBzZXBhcmF0b3IuXG4gICAqL1xuICBzZXBhcmF0b3JDaGFyYWN0ZXI6IHN0cmluZztcbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBwcmVmaXggdG8gZGlzcGxheSBiZWZvcmUgdGhlIHZhbHVlLlxuICAgKi9cbiAgcHJlZml4OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgc3VmZml4IHRvIGRpc3BsYXkgYWZ0ZXIgdGhlIHZhbHVlLlxuICAgKi9cbiAgc3VmZml4OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBEaXNwbGF5IHRoZSBudW1iZXIgdXNpbmcgc3BlY2lmaWVkIHVuaXRzIChlLmcuIGBLYCBmb3IgdGhvdXNhbmRzLCBgTWAgZm9yIG1pbGxpb25zLCBgQmAgZm9yIGJpbGxpb25zLCBldGMuKS5cbiAgICovXG4gIHVuaXRzOiBOdW1iZXJGb3JtYXRVbml0cztcbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBmb3JtYXQgZm9yIGRpc3BsYXlpbmcgLlxuICAgKi9cbiAgbmVnYXRpdmVGb3JtYXQ6IE5lZ2F0aXZlTnVtYmVyRm9ybWF0O1xuICAvKipcbiAgICogQHJldHVybnMgVGhlIGN1c3RvbSBmb3JtYXQgc3RyaW5nIHRvIGRpc3BsYXkgZm9yIHRoZSB2YWx1ZS5cbiAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gbnVtYmVyIGZvcm1hdHMsIHNlZSBbRm9ybWF0IE51bWJlcnMgYW5kIE51bGwgVmFsdWVzXShodHRwczovL2hlbHAudGFibGVhdS5jb20vY3VycmVudC9wcm8vZGVza3RvcC9lbi11cy9mb3JtYXR0aW5nX3NwZWNpZmljX251bWJlcnMuaHRtKS5cbiAgICogV2hlbiB0aGUgY3VzdG9tIGZvcm1hdCBzdHJpbmcgaXMgdXNlZCBmb3IgbnVtYmVycywgb3RoZXIgZm9ybWF0dGluZyBvcHRpb25zIGFyZSBpZ25vcmVkLlxuICAgKiBGb3IgaW5mb3JtYXRpb24gb24gZm9ybWF0dGluZyBkYXRlcywgc2VlIFtDdXN0b20gRGF0ZSBGb3JtYXRzXShodHRwczovL2hlbHAudGFibGVhdS5jb20vY3VycmVudC9wcm8vZGVza3RvcC9lbi11cy9kYXRlc19jdXN0b21fZGF0ZV9mb3JtYXRzLmh0bSkuXG4gICAqIFRoZSBjdXN0b20gZm9ybWF0IHN0cmluZyBpcyBhbHdheXMgdXNlZCBmb3IgZGF0ZXMgYW5kIHRoZSBvdGhlciBmb3JtYXR0aW5nIG9wdGlvbnMgZG8gbm90IGFwcGx5IChleGNlcHQgZm9yIHRoZSBgZm9ybWF0VHlwZWAgYW5kIGBsb2NhbGVgKS5cbiAgICovXG4gIGN1c3RvbUZvcm1hdFN0cmluZzogc3RyaW5nO1xufVxuIiwiaW1wb3J0IHsgRGF0YVR5cGUsIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIH0gZnJvbSAnLi9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuaW1wb3J0IHsgTWFya0luZm8gfSBmcm9tICcuL1NlbGVjdGlvbkludGVyZmFjZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbiB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIG5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBjb2x1bW4uIEluIHN1bW1hcnkgZGF0YSwgdGhpcyBpbmNsdWRlcyB0aGUgYWdncmVnYXRpb24uXG4gICAqIFRoZSBzdW1tYXJ5IGRhdGEgZmllbGQgbmFtZSBpcyBub3Qgc3RhYmxlIGFjcm9zcyBsYW5ndWFnZXMuXG4gICAqIEZvciBleGFtcGxlLCBpbiBhbiBFbmdsaXNoIHZlcnNpb24gb2YgVGFibGVhdSwgdGhlIGZpZWxkIG5hbWUgbWlnaHQgYmUgU1VNKFNhbGVzKS4gSW4gRnJlbmNoLCB0aGlzIHdvdWxkIGJlIFNPTU1FKFNhbGVzKS5cbiAgICovXG4gIHJlYWRvbmx5IGZpZWxkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIGZpZWxkSWQgb2YgdGhlIGZpZWxkIGluIHRoZSBjb2x1bW4uIEluIHN1bW1hcnkgZGF0YSwgdGhpcyBpbmNsdWRlcyB0aGUgYWdncmVnYXRpb24uXG4gICAqIFRoZSBmaWVsZElkIGlzIG5vdCBzdGFibGUgYWNyb3NzIHJlcGxhY2luZyBkYXRhIHNvdXJjZXMuXG4gICAqIEZvciBleGFtcGxlIGFmdGVyIHJlcGxhY2luZyB0aGUgZGF0YSBzb3VyY2UgW0NsaXBib2FyZF8yMDIxMDMwNVQxNjQwMDBdLltzdW06U2FsZXM6cWtdIGNvdWxkIGJlY29tZVxuICAgKiBbZmVkZXJhdGVkLjEydXN1b3ExMTcxbzFiMWViZHloNjBmam5ldjFdLltzdW06U2FsZXM6cWtdLlxuICAgKlxuICAgKiBAc2luY2UgMS41LjBcbiAgICovXG4gIHJlYWRvbmx5IGZpZWxkSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgVGhlIGRhdGEgdHlwZSBvZiB0aGUgY29sdW1uLiBQb3NzaWJsZSB2YWx1ZXMgYXJlXG4gICAqICAgICAgICAgICBmbG9hdCwgaW50ZWdlciwgc3RyaW5nLCBib29sZWFuLCBkYXRlLCBkYXRldGltZSBhbmQgc3BhdGlhbFxuICAgKi9cbiAgcmVhZG9ubHkgZGF0YVR5cGU6IERhdGFUeXBlO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgV2hldGhlciB0aGUgY29sdW1uIGRhdGEgaXMgcmVmZXJlbmNlZCBpbiB0aGUgdmlzdWFsaXphdGlvbi5cbiAgICovXG4gIHJlYWRvbmx5IGlzUmVmZXJlbmNlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHJldHVybnMgIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgcmV0dXJuZWQgZGF0YS5cbiAgICovXG4gIHJlYWRvbmx5IGluZGV4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVRhYmxlIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zICBFaXRoZXIgXCJVbmRlcmx5aW5nIERhdGEgVGFibGVcIiBvciBcIlN1bW1hcnkgRGF0YSBUYWJsZVwiLlxuICAgKi9cbiAgcmVhZG9ubHkgbmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgQSB0d28tZGltZW5zaW9uYWwgYXJyYXkgb2YgZGF0YSB3aXRob3V0IHRoZSBzaGVldCBvciBjb2x1bW5cbiAgICogICAgICAgICAgIG1ldGFkYXRhLiBUaGUgZmlyc3QgYXJyYXkgaW5kZXggaXMgdGhlIHJvdyBpbmRleCBhbmQgdGhlIHNlY29uZFxuICAgKiAgICAgICAgICAgYXJyYXkgaW5kZXggaXMgdGhlIGNvbHVtbiBpbmRleC5cbiAgICovXG4gIHJlYWRvbmx5IGRhdGE6IEFycmF5PEFycmF5PERhdGFWYWx1ZT4+O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgQW4gYXJyYXkgb2YgaW5mb3JtYXRpb24gYWJvdXQgbWFya3MuICBFYWNoIG1hcmsgaW4gdGhlIGFycmF5IGNvcnJlc3BvbmRzXG4gICAqICAgICAgICAgICB0byBhIHJvdyBpbiB0aGUgZGF0YSBvZiB0aGlzIERhdGFUYWJsZS4gTWFya0luZm8gaXMgY3VycmVudGx5IG9ubHkgcGFydGlhbGx5XG4gICAqICAgICAgICAgICBhdmFpbGFibGUgd2l0aGluIHJlc3VsdHMgZnJvbSBnZXRTZWxlY3RlZE1hcmtzQXN5bmMgLyBnZXRNYXJrc0FzeW5jLlxuICAgKi9cbiAgcmVhZG9ubHkgbWFya3NJbmZvPzogQXJyYXk8TWFya0luZm8+O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIGNvbHVtbiBpbmZvcm1hdGlvbiwgaW5jbHVkaW5nIHRoZSBuYW1lLCBkYXRhIHR5cGUsIGFuZCBpbmRleC4uXG4gICAqL1xuICByZWFkb25seSBjb2x1bW5zOiBBcnJheTxDb2x1bW4+O1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIG51bWJlciBvZiByb3dzIGluIHRoZSByZXR1cm5lZCBkYXRhLlxuICAgKi9cbiAgcmVhZG9ubHkgdG90YWxSb3dDb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUcnVlIGlmIHRoZSByb3dzIHJldHVybmVkIGhhdmUgYmVlbiBsaW1pdGVkIHRvIHRoZSBtYXhpbXVtIG51bWJlciBvZiByZXRyaWV2YWJsZSByb3dzLlxuICAgKiAgICAgICAgICBBIHZhbHVlIG9mIHRydWUgaW5kaWNhdGVzIHRoYXQgdGhlIGNhbGxlciByZXF1ZXN0ZWQgbW9yZSByb3dzIHRoYW4gdGhlIGxpbWl0XG4gICAqICAgICAgICAgIGFuZCB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZSBjb250YWlucyBtb3JlIHJvd3MgdGhhbiBjYW4gYmUgcmV0dXJuZWQuXG4gICAqICAgICAgICAgIGlzVG90YWxSb3dDb3VudExpbWl0ZWQgY2FuIGJlIHRydWUgaW4gdGhlIGNhc2Ugb2YgLi4uXG4gICAqICAgICAgICAgIGBnZXRBbGxQYWdlc0FzeW5jYCB3aXRoIG1vcmUgdGhhbiA0LDAwMCwwMDAgcm93cyBpbiB0aGUgc3VtbWFyeSBvciB1bmRlcmx5aW5nIGRhdGEuXG4gICAqICAgICAgICAgIGBnZXRMb2dpY2FsVGFibGVEYXRhQXN5bmNgIG9yIGBnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmNgIHdpdGggbW9yZSB0aGFuIDEwLDAwMCByb3dzIGluIHRoZSBkYXRhLlxuICAgKiAgICAgICAgICBJbiBhbGwgdGhlc2UgY2FzZXMsIGxpbWl0cyBjYW4gYmUgYXZvaWRlZCBieSBwcm9jZXNzaW5nIHRoZSBkYXRhIGluIHBhZ2Ugc2l6ZWQgY2h1bmtzIHdpdGggYERhdGFUYWJsZVJlYWRlcmAuXG4gICAqICAgICAgICAgIGlzVG90YWxSb3dDb3VudExpbWl0ZWQgaXMgYWx3YXlzIGZhbHNlIGluIHRoZSByZXN1bHRzIG9mIERhdGFUYWJsZVJlYWRlci5nZXRQYWdlQXN5bmMoKS5cbiAgICovXG4gIHJlYWRvbmx5IGlzVG90YWxSb3dDb3VudExpbWl0ZWQ/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgV2hldGhlciB0aGUgZGF0YSBpcyBzdW1tYXJ5IGRhdGEgb3IgdW5kZXJseWluZyBkYXRhLlxuICAgKiAgICAgICAgICAgUmV0dXJucyB0cnVlIGZvciBzdW1tYXJ5IGRhdGEuXG4gICAqL1xuICByZWFkb25seSBpc1N1bW1hcnlEYXRhPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhVmFsdWUge1xuICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1hbnkgKi9cbiAgLyoqXG4gICAqIEBzaW5jZSAxLjIuMCBGaXhlcyB0aGUgdHlwZSB0byBiZSB0aGUgcmF3IG5hdGl2ZSB2YWx1ZSByYXRoZXIgdGhhbiBhIHN0cmluZy5cbiAgICogQHJldHVybnMgIENvbnRhaW5zIHRoZSByYXcgbmF0aXZlIHZhbHVlIGFzIGEgSmF2YVNjcmlwdCB0eXBlLCB3aGljaCBpc1xuICAgKiAgICAgICAgICAgb25lIG9mIHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBvciBEYXRlIChhcyBhIHN0cmluZykuIFBsZWFzZSBub3RlIHRoYXQgc3BlY2lhbFxuICAgKiAgICAgICAgICAgdmFsdWVzLCByZWdhcmRsZXNzIG9mIHR5cGUsIGFyZSBhbHdheXMgcmV0dXJuZWQgYXMgYSBTdHJpbmcgc3Vycm91bmRlZCBieVxuICAgKiAgICAgICAgICAgcGVyY2VudCBzaWducywgc3VjaCBhcyAnJW51bGwlJywgb3IgJyVuby1hY2Nlc3MlJy5cbiAgICovXG4gIHJlYWRvbmx5IHZhbHVlOiBhbnk7XG5cbiAgLyoqXG4gICAqIEBzaW5jZSAxLjQuMFxuICAgKiBAcmV0dXJucyBUaGUgcmF3IG5hdGl2ZSB2YWx1ZSBhcyBhIEphdmFTY3JpcHQgdHlwZSwgd2hpY2ggaXNcbiAgICogICAgICAgICAgb25lIG9mIHN0cmluZywgbnVtYmVyLCBib29sZWFuLCBvciBEYXRlIG9iamVjdC4gUGxlYXNlIG5vdGUgdGhhdCBzcGVjaWFsXG4gICAqICAgICAgICAgIHZhbHVlcyBhcmUgcmV0dXJuZWQgYXMgbnVsbC4gVGhlIGFjdHVhbCBzcGVjaWFsIHZhbHVlIGNhbiBiZSBmb3VuZFxuICAgKiAgICAgICAgICBpbiBmb3JtYXR0ZWRWYWx1ZSwgd2hpY2ggd291bGQgYmUgc29tZXRoaW5nIGxpa2UgJ051bGwnLCBvciAnTm8tQWNjZXNzJy5cbiAgICogICAgICAgICAgVXNpbmcgbmF0aXZlVmFsdWUgY2FuIGdyZWF0bHkgc2ltcGxpZnkgeW91ciBlcnJvciBjaGVja2luZyBzaW5jZSBhbGwgdmFsdWVzXG4gICAqICAgICAgICAgIHdpbGwgYmUgdGhlaXIgbmF0aXZlIHR5cGUgdmFsdWUgb3IgbnVsbC5cbiAgICovXG4gIHJlYWRvbmx5IG5hdGl2ZVZhbHVlOiBhbnk7XG4gIC8qIHRzbGludDplbmFibGU6bm8tYW55ICovXG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUaGUgdmFsdWUgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgbG9jYWxlIGFuZCB0aGVcbiAgICogICAgICAgICAgIGZvcm1hdHRpbmcgYXBwbGllZCB0byB0aGUgZmllbGQgb3IgcGFyYW1ldGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGVkVmFsdWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBhbGlhcyBvZiBhIHZhbHVlIG9ubHkgaWYgYGhhc0FsaWFzYCBpcyB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgYWxpYXNWYWx1ZT86IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgSW5kaWNhdGVzIGlmIHRoZSBEYXRhVmFsdWUgY29udGFpbnMgYW4gYWxpYXMgKGZvciBEYXRhVmFsdWVzIG9mIFBhcmFtZXRlcnMgd2l0aCBkb21haW4gcmVzdHJpY3Rpb24gdHlwZVxuICAgKiAgICAgICAgICBgUGFyYW1ldGVyVmFsdWVUeXBlLkxpc3RgKS5cbiAgICovXG4gIHJlYWRvbmx5IGhhc0FsaWFzPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGFyZ3VtZW50IGZvciB0aGUgV29ya3NoZWV0LkdldFN1bW1hcnlEYXRhQXN5bmMgQVBJXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0U3VtbWFyeURhdGFPcHRpb25zIHtcbiAgLyoqXG4gICAqIERvIG5vdCB1c2UgYWxpYXNlcyBzcGVjaWZpZWQgaW4gdGhlIGRhdGEgc291cmNlIGluIFRhYmxlYXUuIERlZmF1bHQgaXMgZmFsc2UuXG4gICAqL1xuICBpZ25vcmVBbGlhc2VzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogT25seSByZXR1cm4gZGF0YSBmb3IgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBtYXJrcy4gRGVmYXVsdCBpcyBmYWxzZS5cbiAgICovXG4gIGlnbm9yZVNlbGVjdGlvbj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIFRoZSBjb2x1bW5zIHRvIHJldHVybiBzcGVjaWZpZWQgYnkgZmllbGQgaWQsIHJldHVybnMgYWxsIGJ5IGRlZmF1bHQuXG4gICAqIFNpbmNlIDEuNS4wLCBmaWVsZElkIGlzIGEgcHJvcGVydHkgb2YgdGhlIENvbHVtbiBvYmplY3QuXG4gICAqXG4gICAqIEBzaW5jZSAxLjUuMFxuICAgKi9cbiAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ/OiBBcnJheTxzdHJpbmc+O1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIHJvd3Mgb2YgZGF0YSB0aGF0IHlvdSB3YW50IHRvIHJldHVybi4gQSB2YWx1ZSBvZiBgMGAgd2lsbCBhdHRlbXB0IHRvIHJldHVybiBhbGwgcm93cy5cbiAgICogYDBgIGlzIHRoZSBkZWZhdWx0IGlmIG1heFJvd3MgaXMgbm90IHNwZWNpZmllZC5cbiAgICogYGdldFVuZGVybHlpbmdUYWJsZURhdGFBc3luY2AgLSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHJldHVybmVkIGlzIGNhcHBlZCBhdCAxMCwwMDAgcmVnYXJkbGVzcyBvZiBtYXhSb3dzLlxuICAgKiBgZ2V0U3VtbWFyeURhdGFBc3luY2AgLSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHJldHVybmVkIGlzIG5vdCBjYXBwZWQsIGJ1dCBwZXJmb3JtYW5jZSBtYXkgc3VmZmVyIHdpdGggbGFyZ2Ugcm93IGNvdW50cy5cbiAgICpcbiAgICogQHNpbmNlIDEuNS4wIG1heFJvd3MgaXMgbm93IHN1cHBvcnRlZCBpbiBib3RoIGBHZXRTdW1tYXJ5RGF0YU9wdGlvbnNgIGFuZCBgR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zYC5cbiAgICogQHNpbmNlIDEuMTAuMCBtYXhSb3dzIGlzIGlnbm9yZWQgd2hlbiBnZXR0aW5nIGEgRGF0YVRhYmxlUmVhZGVyXG4gICAqL1xuICBtYXhSb3dzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTcGVjaWZ5IHdoaWNoIHByb3BlcnRpZXMgdG8gcmV0dXJuIGluIERhdGFWYWx1ZXMuIFRoZSBkZWZhdWx0IGlzIGBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXNgLlxuICAgKiBBbGwgcHJvcGVydGllcyBub3QgcmVxdWVzdGVkIHdpbGwgYmUgYHVuZGVmaW5lZGAgaW4gdGhlIERhdGFWYWx1ZSByZXN1bHRzLlxuICAgKiBUaGlzIGlzIGEgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIG9ubHksIGFuZCB3aWxsIGJlIGlnbm9yZWQgaW4gVGFibGVhdSB2ZXJzaW9ucyBwcmlvciB0byAyMDIxLjIuXG4gICAqXG4gICAqIEBzaW5jZSAxLjUuMFxuICAgKi9cbiAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24/OiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbjtcblxuICAvKipcbiAgICogU3BlY2lmaWVzIHdoZXRoZXIgdG8gYXBwbHkgd29ya3NoZWV0IGxldmVsIGZvcm1hdHRpbmcgdG8gbnVtYmVycyBhbmQgZGF0ZXNcbiAgICogTm90ZSB0aGF0IHRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGdsb2JhbCBmaWVsZCBmb3JtYXR0aW5nIGRlZ2luZWQgaW4gdGhlIFNjaGVtYSBWaWV3ZXJcbiAgICpcbiAgICogQHNpbmNlIDEuMTMuMCBhbmQgVGFibGVhdSAyMDI1LjFcbiAgICovXG4gIGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogT3B0aW9ucyBhcmd1bWVudCBmb3IgdGhlIFdvcmtzaGVldC5nZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMgQVBJLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyBleHRlbmRzIEdldFN1bW1hcnlEYXRhT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBSZXR1cm4gYWxsIHRoZSBjb2x1bW5zIGZvciB0aGUgZGF0YSBzb3VyY2UuIERlZmF1bHQgaXMgZmFsc2UuXG4gICAqL1xuICBpbmNsdWRlQWxsQ29sdW1ucz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogQSBEYXRhVGFibGVSZWFkZXIgYWxsb3dzIGl0ZXJhdGlvbiBvdmVyIHN1bW1hcnkgb3IgdW5kZXJseWluZyBkYXRhIGJ5IHBhZ2VzLlxuICogVGhlIHBhZ2Ugc2l6ZSBpcyBlc3RhYmxpc2hlZCB3aGVuIHRoZSBEYXRhVGFibGVSZWFkZXIgaXMgY3JlYXRlZC5cbiAqIChTZWUgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jLCBnZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jLCBvciBnZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyQXN5bmMuKVxuICogVGhlIG5vcm1hbCBzZXF1ZW5jZSBvZiBvcGVyYXRpb25zIHdvdWxkIGJlIHRvXG4gKiAxLiBDcmVhdGUgdGhlIERhdGFUYWJsZVJlYWRlciBmb3IgdGhlIGRlc2lyZWQgRGF0YVRhYmxlLlxuICogMi4gVXNlIERhdGFUYWJsZVJlYWRlci50b3RhbFJvd0NvdW50IG9yIERhdGFUYWJsZVJlYWRlci5wYWdlQ291bnQgdG8gZGlzY292ZXIgaG93IG1hbnkgcm93cyBvciBwYWdlcyBhcmUgaW4gdGhlIGRlc2lyZWQgRGF0YVRhYmxlLlxuICogMy4gQ2FsbCBEYXRhVGFibGVSZWFkZXIuZ2V0UGFnZUFzeW5jKCkgdG8gZ2V0IHRoZSBwYWdlKHMpIGRlc2lyZWQuIEVhY2ggcGFnZSBpcyBhIERhdGFUYWJsZSBmb3IgdGhhdCBwYWdlLlxuICogICAgQWx0ZXJuYXRpdmVseSwgYmFzZWQgb24gdGhlIERhdGFUYWJsZVJlYWRlci50b3RhbFJvd0NvdW50LCBEYXRhVGFibGVSZWFkZXIuZ2V0QWxsUGFnZXNBc3luYyBjYW4gYmUgdXNlZCB0byBmZXRjaCB0aGUgZW50aXJlIERhdGFUYWJsZS5cbiAqIDQuIENhbGwgRGF0YVRhYmxlUmVhZGVyLnJlbGVhc2VBc3luYygpIHRvIGZyZWUgdXAgcmVzb3VyY2VzLlxuICpcbiAqIE5vdGVzIGZvciB1c2FnZSBvZiBhIERhdGFUYWJsZVJlYWRlcjpcbiAqIDEuIFNpbmNlIERhdGFUYWJsZVJlYWRlcnMgY29uc3VtZSBzZXJ2ZXIgcmVzb3VyY2VzLCBhbiBpbmFjdGl2ZSBEYXRhVGFibGVSZWFkZXIgd2lsbCBiZSBhdXRvbWF0aWNhbGx5XG4gKiAgICByZWxlYXNlZCBhZnRlciA2MCBtaW51dGVzIG9mIGluYWN0aXZpdHkuIChBIG5ldyBEYXRhVGFibGVSZWFkZXIgY2FuIGJlIGNyZWF0ZWQgYXQgdGhhdCB0aW1lLCBpZiBuZWVkZWQuKVxuICogMi4gQ2FsbGluZyBnZXRQYWdlQXN5bmMoKSBhZnRlciBhbiBleHBsaWNpdCBvciBhdXRvbWF0aWMgcmVsZWFzZUFzeW5jKCkgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uXG4gKiAzLiBPbmx5IG9uZSBhY3RpdmUgRGF0YVRhYmxlUmVhZGVyIHBlciBsb2dpY2FsIHRhYmxlIGlkIGlzIHN1cHBvcnRlZC5cbiAqIDQuIFRoZXJlIGFyZSBzdGlsbCBsaW1pdHMgb24gdGhlIG51bWJlciBvZiByb3dzIHN1cHBvcnRlZCBmb3IgdW5kZXJseWluZyBhbmQgbG9naWNhbCBkYXRhIHRhYmxlIHJlYWRlcnMuXG4gKiAgICBUaGUgZGVmYXVsdCBsaW1pdCBpcyBhcHByb3hpbWF0ZWx5IDEgbWlsbGlvbiByb3dzIG9mIGRhdGEgZm9yIGdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyxcbiAqICAgIGFuZCBhcHByb3hpbWF0ZWx5IDMyIG1pbGxpb24gY2VsbHMgKHJvd3MgKiBjb2x1bW5zKSBmb3IgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jLlxuICogICAgQWRtaW5pc3RyYXRvcnMgbWF5IGNoYW5nZSB0aGVzZSBsaW1pdHMgdG8gYmV0dGVyIG1hdGNoIGNvbXB1dGluZyByZXNvdXJjZXMgd2l0aCB0aGUgVGFibGVhdSBTZXJ2ZXIgKENsb3VkKSBvciBUYWJsZWF1IERlc2t0b3Agb3B0aW9uczpcbiAqICAgIEV4dGVuc2lvbnNBbmRFbWJlZGRpbmdSZWFkZXJSb3dMaW1pdCBmb3IgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jIG9yXG4gKiAgICBFeHRlbnNpb25zQW5kRW1iZWRkaW5nUmVhZGVyQ2VsbExpbWl0IGZvciBnZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMuXG4gKlxuICogQHNpbmNlIDEuMTAuMCBhbmQgVGFibGVhdSAyMDIyLjRcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYXRhVGFibGVSZWFkZXIge1xuICAvKipcbiAgICogQHJldHVybnMgIFRoZSBudW1iZXIgb2Ygcm93cyBpbiB0aGUgZnVsbCBkYXRhIHRhYmxlLlxuICAgKi9cbiAgcmVhZG9ubHkgdG90YWxSb3dDb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIG51bWJlciBvZiBwYWdlcyBpbiB0aGUgZnVsbCBkYXRhIHRhYmxlLiBUaGUgbGFzdCBwYWdlIGNvdWxkIGJlIGEgcGFydGlhbCBwYWdlLlxuICAgKi9cbiAgcmVhZG9ubHkgcGFnZUNvdW50OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdldCBhIHBhZ2Ugb2YgZGF0YS4gVGhlIHBhZ2UgaXMgcmV0dXJuZWQgYXMgYSBEYXRhVGFibGUuXG4gICAqIENhbGxzIHRvIGdldFBhZ2VBc3luYygpIGFmdGVyIHJlbGVhc2VBc3luYygpIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gcGFnZU51bWJlciAgVGhlIHBhZ2UgbnVtYmVyICh6ZXJvLWluZGV4ZWQpIHRvIGZldGNoLiBUaGUgcGFnZSBudW1iZXIgc2hvdWxkIGJlIHRyZWF0ZWRcbiAgICogICAgICAgICAgICAgICAgICAgIGxpa2UgYW4gYXJyYXkgaW5kZXggd2l0aCByYW5nZTogMCA8PSBwYWdlTnVtYmVyIDwgcGFnZUNvdW50LlxuICAgKiBAcmV0dXJucyAgICAgICAgICAgQSBEYXRhVGFibGUgY29udGFpbmluZyB0aGUgcmVxdWVzdGVkIHBhZ2UuIFRoZSBudW1iZXIgb2Ygcm93cyByZXR1cm5lZFxuICAgKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlIGxlc3MgdGhhbiB0aGUgcGFnZSBzaXplIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEuXG4gICAqXG4gICAqIGBgYFxuICAgKiBjb25zdCBwYWdlUm93Q291bnQgPSAyMDA7XG4gICAqIGNvbnN0IGRhdGFUYWJsZVJlYWRlciA9IGF3YWl0IHdvcmtzaGVldC5nZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gICAqIGZvciAobGV0IGN1cnJlbnRQYWdlID0gMDsgY3VycmVudFBhZ2UgPCBkYXRhVGFibGVSZWFkZXIucGFnZUNvdW50OyBjdXJyZW50UGFnZSsrKSB7XG4gICAqICAgY29uc3QgY3VycmVudFBhZ2VEYXRhVGFibGUgPSBhd2FpdCBkYXRhVGFibGVSZWFkZXIuZ2V0UGFnZUFzeW5jKGN1cnJlbnRQYWdlKTtcbiAgICogICAvLyAuLi4gcHJvY2VzcyBjdXJyZW50IHBhZ2UgLi4uXG4gICAqIH1cbiAgICogYXdhaXQgZGF0YVRhYmxlUmVhZGVyLnJlbGVhc2VBc3luYygpO1xuICAgKiBgYGBcbiAgICovXG4gIGdldFBhZ2VBc3luYyhwYWdlTnVtYmVyOiBudW1iZXIpOiBQcm9taXNlPERhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgdGhlIHBhZ2VzIG9mIGRhdGEgaW50byBhIHNpbmdsZSBEYXRhVGFibGUuXG4gICAqIENhbGxzIHRvIGdldEFsbFBhZ2VzQXN5bmMoKSBhZnRlciByZWxlYXNlQXN5bmMoKSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi5cbiAgICogVG8gcHJvdGVjdCBhZ2FpbnN0IHBvc3NpYmxlIGJyb3dzZXIgZmFpbHVyZSwgZ2V0QWxsUGFnZXNBc3luYyB3aWxsIGNhcCB0aGUgZGF0YSBhdCBhIG1heGltdW0gb2YgNDAwIHBhZ2VzLlxuICAgKiBXaXRoIGEgZGVmYXVsdCBwYWdlUm93Q291bnQgb2YgMTAsMDAwIHRoaXMgd2lsbCBnaXZlIHlvdSBhIG1heGltdW0gb2YgNCwwMDAsMDAwIHJvd3Mgb2YgZGF0YS5cbiAgICpcbiAgICogSWYgc2l6ZXMgYXJlIGxhcmdlciB0aGFuIHRoaXMsIHBsZWFzZSBwcm9jZXNzIHlvdXIgZGF0YSBpbiBwYWdlIHNpemUgY2h1bmtzLlxuICAgKiBAcGFyYW0gbWF4Um93cyBMaW1pdHMgdGhlIHJlcXVlc3QgdG8gbWF4Um93cy4gSWYgbWF4Um93cyA9PT0gMCwgcmVxdWVzdHMgYWxsIHJvd3MuXG4gICAqIEByZXR1cm5zICAgICAgIEEgRGF0YVRhYmxlIGNvbnRhaW5pbmcgYWxsIHRoZSBkYXRhIGF2YWlsYWJsZSB0byB0aGUgRGF0YVRhYmxlUmVhZGVyIHdpdGggdGhlIG1heGltdW0gcGFnZSBjb3VudCBhYm92ZS5cbiAgICpcbiAgICogYGBgXG4gICAqIC8vIFRvIHNpbXBsaWZ5IHRoZSBleGFtcGxlLCB3ZSBhc3N1bWUgd2UgaGF2ZSBsZXNzIHRoYW4gNG0gcm93cyBvZiBkYXRhXG4gICAqIC8vIFNpbmNlIHdlIGFyZSBmZXRjaGluZyBhbGwgb2YgdGhlIGRhdGEsIHVzZSB0aGUgZGVmYXVsdCBwYWdlIHNpemUgaW4gZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luY1xuICAgKiBjb25zdCBkYXRhVGFibGVSZWFkZXIgPSBhd2FpdCB3b3Jrc2hlZXQuZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYygpO1xuICAgKiBjb25zdCBkYXRhVGFibGUgPSBhd2FpdCBkYXRhVGFibGVSZWFkZXIuZ2V0QWxsUGFnZXNBc3luYygpO1xuICAgKiBhd2FpdCBkYXRhVGFibGVSZWFkZXIucmVsZWFzZUFzeW5jKCk7XG4gICAqIC8vIC4uLiBwcm9jZXNzIHRoZSBkYXRhIHRhYmxlIC4uLlxuICAgKiBgYGBcbiAgICovXG4gIGdldEFsbFBhZ2VzQXN5bmMobWF4Um93cz86IG51bWJlcik6IFByb21pc2U8RGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogUmVsZWFzZSBhbGwgcmVzb3VyY2VzIGhlbGQgYnkgdGhlIERhdGFUYWJsZVJlYWRlci5cbiAgICogQ2FsbGluZyB0aGlzIHdoZW4gZG9uZSB3aXRoIHRoZSBEYXRhVGFibGVSZWFkZXIgaXMgcmVxdWlyZWQgcHJhY3RpY2UgYXMgaXQgZnJlZXMgdXAgcmVzb3VyY2VzLlxuICAgKiBDYWxscyB0byBnZXRQYWdlQXN5bmMoKSBhZnRlciByZWxlYXNlQXN5bmMoKSB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi5cbiAgICovXG4gIHJlbGVhc2VBc3luYygpOiBQcm9taXNlPHZvaWQ+O1xufVxuIiwiZXhwb3J0IGVudW0gU2hhcmVkRXJyb3JDb2RlcyB7XG4gIC8qKlxuICAgKiBBIENTViBvciBFeGNlbCBmaWxlIGZhaWxlZCB0byBiZSBjcmVhdGVkIGluIFZpei5leHBvcnRDcm9zc3RhYkFzeW5jKCkuXG4gICAqL1xuICBDcm9zc3RhYkNyZWF0aW9uRXJyb3IgPSAnY3Jvc3N0YWItY3JlYXRpb24tZXJyb3InLFxuICAvKipcbiAgICogQSBDU1YgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0RGF0YUFzeW5jKCkuXG4gICAqL1xuICBEYXRhQ3JlYXRpb25FcnJvciA9ICdkYXRhLWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgYWdncmVnYXRpb24gd2FzIHNwZWNpZmllZCBmb3IgdGhlIGZpbHRlciwgc3VjaCBhcyBzZXR0aW5nIGEgcmFuZ2UgZmlsdGVyIHRvIFwiU1VNKFNhbGVzKVwiIGluc3RlYWQgb2ZcbiAgICogXCJTYWxlc1wiLlxuICAgKi9cbiAgSW52YWxpZEFnZ3JlZ2F0aW9uRmllbGROYW1lID0gJ2ludmFsaWQtYWdncmVnYXRpb24tZmllbGQtbmFtZScsXG4gIC8qKlxuICAgKiBBIGZpbHRlciBvcGVyYXRpb24gd2FzIGF0dGVtcHRlZCBvbiBhIGZpZWxkIHRoYXQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGRhdGEgc291cmNlLlxuICAgKi9cbiAgSW52YWxpZEZpbHRlckZpZWxkTmFtZSA9ICdpbnZhbGlkLWZpbHRlci1uYW1lJyxcbiAgLyoqXG4gICAqIEEgZmlsdGVyIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIHVzaW5nIGEgdmFsdWUgdGhhdCBpcyB0aGUgd3JvbmcgZGF0YSB0eXBlIG9yIGZvcm1hdC5cbiAgICovXG4gIEludmFsaWRGaWx0ZXJGaWVsZFZhbHVlID0gJ2ludmFsaWQtZmlsdGVyLWZpZWxkVmFsdWUnLFxuICAvKipcbiAgICogQW4gaW52YWxpZCBkYXRlIHZhbHVlIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCBmb3IgYSBkYXRlIGZpZWxkLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvbkRhdGUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZGF0ZScsXG4gIC8qKlxuICAgKiBBIGZpZWxkIHdhcyBzcGVjaWZpZWQgaW4gYSBTaGVldC5zZWxlY3RNYXJrc0FzeW5jKCkgY2FsbCB0aGF0IGRvZXMgbm90IGV4aXN0IGluIHRoZSBkYXRhIHNvdXJjZS5cbiAgICovXG4gIEludmFsaWRTZWxlY3Rpb25GaWVsZE5hbWUgPSAnaW52YWxpZC1zZWxlY3Rpb24tZmllbGROYW1lJyxcbiAgLyoqXG4gICAqIEFuIGludmFsaWQgdmFsdWUgd2FzIHNwZWNpZmllZCBpbiBhIFNoZWV0LnNlbGVjdE1hcmtzQXN5bmMoKSBjYWxsLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblZhbHVlID0gJ2ludmFsaWQtc2VsZWN0aW9uLXZhbHVlJyxcbiAgLyoqXG4gICAqIEEgcGFyYW1ldGVyIGRpZCBub3QgaW5jbHVkZSBhIHZhbGlkIHNoZWV0IHNlbGVjdGlvbiBmb3IgZXhwb3J0aW5nLlxuICAgKi9cbiAgSW52YWxpZFNlbGVjdGlvblNoZWV0ID0gJ2ludmFsaWQtc2VsZWN0aW9uLXNoZWV0JyxcbiAgLyoqXG4gICAqIEFuIGVycm9yIG9jY3VycmVkIHdpdGhpbiB0aGUgVGFibGVhdSBBUEkuIENvbnRhY3QgVGFibGVhdSBTdXBwb3J0LlxuICAgKi9cbiAgSW50ZXJuYWxFcnJvciA9ICdpbnRlcm5hbC1lcnJvcicsXG4gIC8qKlxuICAgKiBBIHBhcmFtZXRlciBpcyBub3QgdGhlIGNvcnJlY3QgZGF0YSB0eXBlIG9yIGZvcm1hdC4gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciBpcyBzcGVjaWZpZWQgaW4gdGhlIEVycm9yLm1lc3NhZ2UgZmllbGQuXG4gICAqL1xuICBJbnZhbGlkUGFyYW1ldGVyID0gJ2ludmFsaWQtcGFyYW1ldGVyJyxcbiAgLyoqXG4gICAqIEEgUERGIGZpbGUgZmFpbGVkIHRvIGJlIGNyZWF0ZWQgaW4gVml6LmV4cG9ydFBERkFzeW5jKCkuXG4gICAqL1xuICBQREZDcmVhdGlvbkVycm9yID0gJ3BkZi1jcmVhdGlvbi1lcnJvcicsXG4gIC8qKlxuICAgKiBBIFBvd2VyUG9pbnQgZmlsZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBpbiBWaXouZXhwb3J0UG93ZXJQb2ludEFzeW5jKCkuXG4gICAqL1xuICBQb3dlclBvaW50Q3JlYXRpb25FcnJvciA9ICdwb3dlcnBvaW50LWNyZWF0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEFuIG9wZXJhdGlvbiB3YXMgYXR0ZW1wdGVkIG9uIGEgc2hlZXQgdGhhdCBpcyBub3QgYWN0aXZlIG9yIGVtYmVkZGVkIHdpdGhpbiB0aGUgYWN0aXZlIGRhc2hib2FyZC5cbiAgICovXG4gIE5vdEFjdGl2ZVNoZWV0ID0gJ25vdC1hY3RpdmUtc2hlZXQnLFxuICAvKipcbiAgICogUHJvcGVydHkgb3IgRnVuY3Rpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoaW4gdGhlIFRhYmxlYXUgQVBJLlxuICAgKi9cbiAgSW1wbGVtZW50YXRpb25FcnJvciA9ICd3cm9uZy1pbXBsZW1lbnRhdGlvbicsXG4gIC8qKlxuICAgKiBDYW4gb2NjdXIgd2hlbiB0d28gaW5jb21wYXRpYmxlIGNhbGxzIGFyZSB0cmlnZ2VyZWQgdG9nZXRoZXIuXG4gICAqL1xuICBBcGlFeGVjdXRpb25FcnJvciA9ICdhcGktZXhlY3V0aW9uLWVycm9yJyxcbiAgLyoqXG4gICAqIEEgZ2VuZXJhbC1wdXJwb3NlIHNlcnZlciBlcnJvciBvY2N1cnJlZC4gRGV0YWlscyBhcmUgY29udGFpbmVkIGluIHRoZSBFcnJvciBvYmplY3QuXG4gICAqL1xuICBTZXJ2ZXJFcnJvciA9ICdzZXJ2ZXItZXJyb3InLFxuICAvKipcbiAgICogQ2FuIG9jY3VyIHdoZW4gYW4gYXBpIGNhbGwgdGltZXMgb3V0LlxuICAgKi9cbiAgVGltZW91dCA9ICd0aW1lb3V0Jyxcbn1cbiIsIi8qKlxuICogQGhpZGRlblxuICogUmVwcmVzZW50cyB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBzZXJ2ZXIuXG4gKiBSZXNlcnZlZCBmb3IgZmlyc3QgY2xhc3MgZXh0ZW5zaW9ucyBvbmx5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbm5lY3RlZFNlcnZlciB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyAgUmV0dXJucyBhbiBpZCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgdXNlciBzaWduZWQgaW50byBzZXJ2ZXIuXG4gICAqICAgICAgICAgICBSZXR1cm5zIHVuZGVmaW5lZCBpZiBvbiBkZXNrdG9wIGFuZCBub3QgY29ubmVjdGVkIHRvIHNlcnZlci5cbiAgICovXG4gIHJlYWRvbmx5IHVzZXJJZD86IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgIFJldHVybnMgYW4gaWQgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHNpdGUgd2hlbiBzaWduZWQgaW50byBzZXJ2ZXIuXG4gICAqICAgICAgICAgICBSZXR1cm5zIHVuZGVmaW5lZCBpZiBvbiBkZXNrdG9wIGFuZCBub3QgY29ubmVjdGVkIHRvIHNlcnZlci5cbiAgICovXG4gIHJlYWRvbmx5IHNpdGVJZD86IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgIFJldHVybnMgYW4gc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBzaXRlTmFtZXNwYWNlIHdoZW4gc2lnbmVkIGludG8gc2VydmVyLlxuICAgKiAgICAgICAgICAgUmV0dXJucyB1bmRlZmluZWQgaWYgb24gZGVza3RvcCBhbmQgbm90IGNvbm5lY3RlZCB0byBzZXJ2ZXIuXG4gICAqL1xuICByZWFkb25seSBzaXRlTmFtZXNwYWNlPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgUmV0dXJucyBhbiBpZCByZXByZXNlbnRpbmcgdGhlIGN1cnJlbnQgd29ya2Jvb2sgd2hlbiBsb2FkZWQgZnJvbSBzZXJ2ZXIuXG4gICAqICAgICAgICAgICBSZXR1cm5zIHVuZGVmaW5lZCBpZiBvbiBkZXNrdG9wIHdpdGggYSBsb2NhbCB3b3JrYm9vay5cbiAgICovXG4gIHJlYWRvbmx5IHdvcmtib29rSWQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFJldHVybnMgYSBsaXN0IG9mIGVuYWJsZWQgZmVhdHVyZSBmbGFncyBtZWFudCBmb3IgZXh0ZW5zaW9ucyxcbiAgICogICAgICAgICAgb3IgdW5kZWZpbmVkIGlmIG5vIGZsYWdzIGhhdmUgYmVlbiBwYXNzZWQuXG4gICAqL1xuICByZWFkb25seSBmZWF0dXJlRmxhZ3M/OiBzdHJpbmdbXTtcbn1cbiIsImltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9EYXRhU291cmNlSW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuL0RhdGFUYWJsZUludGVyZmFjZXMnO1xuaW1wb3J0IHtcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRmlsdGVyRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbixcbiAgRmlsdGVyVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSxcbiAgUGVyaW9kVHlwZSxcbn0gZnJvbSAnLi9OYW1lc3BhY2VzL1RhYmxlYXUnO1xuXG4vKipcbiAqXG4gKiBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgb2YgdGhlIGZpbHRlciB0eXBlcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXIge1xuICAvKipcbiAgICogQHJldHVybnMgIFRoZSBwYXJlbnQgd29ya3NoZWV0LlxuICAgKi9cbiAgcmVhZG9ubHkgd29ya3NoZWV0TmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIHR5cGUgb2YgdGhlIGZpbHRlci5cbiAgICovXG4gIHJlYWRvbmx5IGZpbHRlclR5cGU6IEZpbHRlclR5cGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUaGUgbmFtZSBvZiB0aGUgZmllbGQgYmVpbmcgZmlsdGVyZWQuICBOb3RlIHRoYXQgdGhpcyBpcyB0aGUgY2FwdGlvblxuICAgKiAgICAgICAgICAgYXMgc2hvd24gaW4gdGhlIFVJLCBhbmQgbm90IHRoZSBhY3R1YWwgZGF0YWJhc2UgZmllbGQgbmFtZS5cbiAgICovXG4gIHJlYWRvbmx5IGZpZWxkTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyAgVGhlIGlkIG9mIHRoZSBmaWVsZCBiZWluZyBmaWx0ZXJlZC5cbiAgICovXG5cbiAgcmVhZG9ubHkgZmllbGRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBhIHByb21pc2UgY29udGFpbmluZyB0aGUgZmllbGQgZm9yIHRoZSBmaWx0ZXIuXG4gICAqIEBzaW5jZSAxLjUuMCBGaXhlZCB0byBwcm9wZXJseSByZXR1cm4gdGhlIGZpZWxkLiBBbHNvIHJlcXVpcmVzIFRhYmxlYXUgMjAxOS4yKy5cbiAgICovXG4gIGdldEZpZWxkQXN5bmMoKTogUHJvbWlzZTxGaWVsZD47XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIHRoZSBsaXN0IG9mIHdvcmtzaGVldCBuYW1lcyB0aGF0IGhhdmUgdGhlIGZpbHRlciBhcHBsaWVkLlxuICAgKiBAc2luY2UgMS45LjAgYW5kIFRhYmxlYXUgMjAyMi4yXG4gICAqL1xuICBnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKCk6IFByb21pc2U8QXJyYXk8c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIEFwcGxpZXMgdGhlIGZpbHRlciB0byB0aGUgc3BlY2lmaWVkIGxpc3Qgb2Ygd29ya3NoZWV0cy5cbiAgICogSWYgdGhlIHdvcmtzaGVldChzKSBkbyBub3QgZXhpc3Qgb3IgZG8gbm90IGNvbnRhaW4gdGhlIGZpZWxkIGluIHRoZWlyIGRhdGEgc291cmNlcywgYW4gZXhjZXB0aW9uIGlzIHRocm93bi5cbiAgICpcbiAgICogQHBhcmFtIGFwcGx5VG9Xb3Jrc2hlZXRzIGxpc3Qgb2Ygd29ya3NoZWV0cyB0byBhcHBseSB0aGUgZmlsdGVyIG9uXG4gICAqIEByZXR1cm5zIHRoZSBsaXN0IG9mIHdvcmtzaGVldCBuYW1lcyB0aGF0IGhhdmUgdGhlIGZpbHRlciBhcHBsaWVkXG4gICAqIEBzaW5jZSAxLjkuMCBhbmQgVGFibGVhdSAyMDIyLjJcbiAgICovXG4gIHNldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoYXBwbHlUb1dvcmtzaGVldHM6IEFycmF5PHN0cmluZz4pOiBQcm9taXNlPEFycmF5PHN0cmluZz4+O1xufVxuXG4vKipcbiAqIEEgQ2F0ZWdvcmljYWwgRmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcmljYWxGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIge1xuICAvKipcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBhbGwgdGhlIHZhbHVlcyBhcmUgc2VsZWN0ZWQgZm9yIHRoaXMgZmlsdGVyLiBXaGVuICdBbGwnIGlzIHNlbGVjdGVkLFxuICAgKiBhcHBsaWVkVmFsdWVzIHJldHVybnMgYW4gZW1wdHkgbGlzdC5cbiAgICpcbiAgICogVGhpcyBmaWVsZCBpcyBhdmFpbGFibGUgaW4gVGFibGVhdSAyMDE5LjIgb3IgbGF0ZXJcbiAgICovXG4gIHJlYWRvbmx5IGlzQWxsU2VsZWN0ZWQ/OiBib29sZWFuO1xuICAvKipcbiAgICogQHJldHVybnMgIEEgbGlzdCBvZiB2YWx1ZXMgYXBwbGllZCB0byB0aGlzIGNhdGVnb3JpY2FsIGZpbHRlci4gTm90aWNlIHRoYXQgaWYgdGhpcyBpcyBhXG4gICAqIGRlcGVuZGVudCBmaWx0ZXIsIHRoZSBjdXJyZW50IHJlbGF2ZW50IHZhbHVlcyBjYW4gYmUgZmV0Y2hlZCBieSBjYWxsaW5nXG4gICAqIGBnZXREb21haW5Bc3luYyh0YWJsZWF1LkZpbHRlckRvbWFpblR5cGUuUmVsZXZhbnQpYC5cbiAgICovXG4gIHJlYWRvbmx5IGFwcGxpZWRWYWx1ZXM6IEFycmF5PERhdGFWYWx1ZT47XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUcnVlIGlmIHRoaXMgZmlsdGVyIGlzIGFuIGV4Y2x1ZGUgZmlsdGVyLCBmYWxzZSBpZiBhbiBpbmNsdWRlIGZpbHRlci5cbiAgICovXG4gIHJlYWRvbmx5IGlzRXhjbHVkZU1vZGU6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIGEgcHJvbWlzZSBjb250YWluaW5nIHRoZSBjYXRlZ29yaWNhbCBkb21haW4gZm9yIHRoZSBmaWx0ZXIuIE5vdGUgaWYgYSBmaWx0ZXIgY29udGFpbnNcbiAgICogbXVsdGlwbGUgZmllbGRzIChzdWNoIGFzIGEgZmlsdGVyIGFjdGlvbiB3aXRoIG11bHRpcGxlIGZpZWxkcyksIHRoZSB2YWx1ZXMgYXJyYXkgaW4gdGhlIHJldHVybmVkXG4gICAqIENhdGVnb3JpY2FsRG9tYWluICh7QGxpbmsgQ2F0ZWdvcmljYWxEb21haW4udmFsdWVzfSkgd2lsbCBiZSBlbXB0eS4gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGZpZWxkc1xuICAgKiBpbiB0aGUgZmlsdGVyLCB0aGUgcmVzdWx0cyBuZWVkIHRvIGJlIHJlcHJlc2VudGVkIGJ5IGEgdGFibGUsIHdoaWNoIGlzIG5vdCBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICAgKi9cbiAgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENhdGVnb3JpY2FsRG9tYWluPjtcbn1cblxuLyoqXG4gKiBBIEhpZXJhcmNoaWNhbCBGaWx0ZXJcbiAqIEhpZXJhcmNoaWNhbCBGaWx0ZXJzIGFyZSB1c2VkIHdoZW4gYSBoaWVyYXJjaGljYWwgZmllbGQgaXMgdXNlZCBhcyBhIGZpbHRlciBvbiBhIGN1YmUgZGF0YWJhc2UuXG4gKiBBcyBhbiBleGFtcGxlLCBhc3N1bWUgYSBoaWVyYXJjaGljYWwgZmllbGQgaW4gUHJvZHVjdCwgbmFtZWQgQnlDYXRlZ29yeS5cbiAqIEJ5Q2F0ZWdvcnkgaGFzIHRoZSBmb2xsb3dpbmcgZml2ZSBsZXZlbHM6IEZhbWlseSwgQ2F0ZWdvcnksIFN1YmNhdGVnb3J5LCBCcmFuZCwgU2t1LlxuICogQHNpbmNlIEV4dGVuc2lvbnMgMS4xMC4wIGFuZCBUYWJsZWF1IHZlcnNpb24gMjAyMi4zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGllcmFyY2hpY2FsRmlsdGVyIGV4dGVuZHMgRmlsdGVyIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBkaW1lbnNpb24gbmFtZSBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbHRlci4gSW4gdGhlIEJ5Q2F0ZWdvcnkgZmlsdGVyIGV4YW1wbGUsIHRoaXMgd291bGQgYmUgJ1Byb2R1Y3QnXG4gICAqL1xuICByZWFkb25seSBkaW1lbnNpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBoaWVyYXJjaHkgY2FwdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGZpbHRlci4gSW4gdGhlIEJ5Q2F0ZWdvcnkgZmlsdGVyIGV4YW1wbGUsIHRoaXMgd291bGQgYmUgJ1tQcm9kdWN0XS5bQnlDYXRlZ29yeV0nXG4gICAqL1xuICByZWFkb25seSBoaWVyYXJjaHlDYXB0aW9uOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBudW1iZXIgb2YgbGV2ZWxzIGluIHRoZSBoaWVyYXJjaGljYWwgZmlsdGVyLiBJbiB0aGUgQnlDYXRlZ29yeSBmaWx0ZXIgZXhhbXBsZSwgdGhpcyB3b3VsZCBiZSA1XG4gICAqL1xuICByZWFkb25seSBudW1iZXJPZkxldmVsczogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBEZXRhaWxzIGFib3V0IGVhY2ggbGV2ZWwgaW4gdGhlIGhpZXJhcmNoaWNhbCBmaWx0ZXIuXG4gICAqL1xuICByZWFkb25seSBsZXZlbERldGFpbHM6IEFycmF5PEhpZXJhcmNoaWNhbExldmVsRGV0YWlsPjtcblxuICAvKipcbiAgICogQHJldHVybnMgVHJ1ZSBpZiBhbGwgdGhlIHZhbHVlcyBhcmUgc2VsZWN0ZWQgZm9yIHRoaXMgZmlsdGVyLiBXaGVuICdBbGwnIGlzIHNlbGVjdGVkLFxuICAgKiBhcHBsaWVkVmFsdWVzIHJldHVybnMgYW4gZW1wdHkgbGlzdC5cbiAgICovXG4gIHJlYWRvbmx5IGlzQWxsU2VsZWN0ZWQ6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBBIGxpc3Qgb2YgdmFsdWVzIGFwcGxpZWQgdG8gdGhpcyBoaWVyYXJjaGljYWwgZmlsdGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgYXBwbGllZFZhbHVlczogQXJyYXk8SGllcmFyY2hpY2FsRmlsdGVyRGF0YVZhbHVlPjtcbn1cblxuLyoqXG4gKiBBIFJhbmdlIEZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlRmlsdGVyIGV4dGVuZHMgRmlsdGVyIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zICBNaW5pbXVtIHZhbHVlLCBpbmNsdXNpdmUsIGFwcGxpZWQgdG8gdGhlIGZpbHRlci5cbiAgICovXG4gIHJlYWRvbmx5IG1pblZhbHVlOiBEYXRhVmFsdWU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBNYXhpbXVtIHZhbHVlLCBpbmNsdXNpdmUsIGFwcGxpZWQgdG8gdGhlIGZpbHRlci5cbiAgICovXG4gIHJlYWRvbmx5IG1heFZhbHVlOiBEYXRhVmFsdWU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBUcnVlIGlmIG51bGwgdmFsdWVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgZmlsdGVyLCBmYWxzZSBvdGhlcndpc2UuXG4gICAqL1xuICByZWFkb25seSBpbmNsdWRlTnVsbFZhbHVlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHBhcmFtIGRvbWFpblR5cGUgdGhlIGRvbWFpbiB0eXBlLCBkZWZhdWx0cyB0byByZWxldmFudFxuICAgKiBAcmV0dXJucyBhIHByb21pc2UgY29udGFpbmluZyB0aGUgZG9tYWluIGZvciB0aGUgcmFuZ2UgZmlsdGVyXG4gICAqL1xuICBnZXREb21haW5Bc3luYyhkb21haW5UeXBlPzogRmlsdGVyRG9tYWluVHlwZSk6IFByb21pc2U8UmFuZ2VEb21haW4+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJlbGF0aXZlRGF0ZUZpbHRlciBleHRlbmRzIEZpbHRlciB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyB0aGUgYW5jaG9yIGRhdGUgb2YgdGhlIGZpbHRlclxuICAgKi9cbiAgcmVhZG9ubHkgYW5jaG9yRGF0ZTogRGF0YVZhbHVlO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgZGF0ZSBwZXJpb2Qgb2YgdGhlIGZpbHRlci5cbiAgICovXG4gIHJlYWRvbmx5IHBlcmlvZFR5cGU6IFBlcmlvZFR5cGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSByYW5nZSBvZiB0aGUgZGF0ZSBmaWx0ZXIgKHllYXJzLCBtb250aHMsIGV0Yy4pLlxuICAgKi9cbiAgcmVhZG9ubHkgcmFuZ2VUeXBlOiBEYXRlUmFuZ2VUeXBlO1xuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBXaGVuIGdldFJhbmdlIHJldHVybnMgTEFTVE4gb3IgTkVYVE4sIHRoaXMgaXMgdGhlIE4gdmFsdWUgKGhvdyBtYW55IHllYXJzLCBtb250aHMsIGV0Yy4pLlxuICAgKi9cbiAgcmVhZG9ubHkgcmFuZ2VOOiBudW1iZXI7XG59XG5cbi8qKiAqXG4gKiBQYXNzZWQgaW50byB0aGUgYXBwbHlGaWx0ZXIgbWV0aG9kcyB0byBjb250cm9sIGFkdmFuY2VkIGZpbHRlcmluZyBvcHRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlck9wdGlvbnMge1xuICAvKipcbiAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBmaWx0ZXIgd2lsbCBhcHBseSBpbiBleGNsdWRlIG1vZGUgb3IgaW5jbHVkZSBtb2RlLlxuICAgKiBUaGUgZGVmYXVsdCBpcyBpbmNsdWRlLCB3aGljaCBtZWFucyB0aGF0IHlvdSB1c2UgdGhlIGZpZWxkcyBhcyBwYXJ0IG9mIGEgZmlsdGVyLlxuICAgKiBFeGNsdWRlIG1vZGUgbWVhbnMgdGhhdCB5b3UgaW5jbHVkZSBldmVyeXRoaW5nIGVsc2UgZXhjZXB0IHRoZSBzcGVjaWZpZWQgZmllbGRzLlxuICAgKi9cbiAgcmVhZG9ubHkgaXNFeGNsdWRlTW9kZTogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBSYW5nZSBGaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZUZpbHRlck9wdGlvbnMge1xuICByZWFkb25seSBtaW4/OiBudW1iZXIgfCBEYXRlO1xuICByZWFkb25seSBtYXg/OiBudW1iZXIgfCBEYXRlO1xuICByZWFkb25seSBudWxsT3B0aW9uPzogRmlsdGVyTnVsbE9wdGlvbjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBSZWxhdGl2ZSBEYXRlIEZpbHRlclxuICogQHNpbmNlIHZlcnNpb24gMS45LjAgYW5kIFRhYmxlYXUgMjAyMi4yXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmVsYXRpdmVEYXRlRmlsdGVyT3B0aW9ucyB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyB0aGUgYW5jaG9yIGRhdGUgb2YgdGhlIGZpbHRlclxuICAgKi9cbiAgcmVhZG9ubHkgYW5jaG9yRGF0ZT86IERhdGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSBkYXRlIHBlcmlvZCBvZiB0aGUgZmlsdGVyICh5ZWFycywgbW9udGhzLCBldGMuKS5cbiAgICovXG4gIHJlYWRvbmx5IHBlcmlvZFR5cGU6IFBlcmlvZFR5cGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSByYW5nZSBvZiB0aGUgZGF0ZSBmaWx0ZXIuXG4gICAqL1xuICByZWFkb25seSByYW5nZVR5cGU6IERhdGVSYW5nZVR5cGU7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFdoZW4gZ2V0UmFuZ2UgcmV0dXJucyBMQVNUTiBvciBORVhUTiwgdGhpcyBpcyB0aGUgTiB2YWx1ZSAoaG93IG1hbnkgeWVhcnMsIG1vbnRocywgZXRjLikuXG4gICAqL1xuICByZWFkb25seSByYW5nZU4/OiBudW1iZXI7XG59XG5cbi8qKlxuICogVGhlIGRvbWFpbiBvZiByYW5nZSBmaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZURvbWFpbiB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyB0aGUgZG9tYWluIHR5cGUgKHJlbGV2YW50LCBhbGwpXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBGaWx0ZXJEb21haW5UeXBlO1xuICAvKipcbiAgICogQHJldHVybnMgIE1pbmltdW0gdmFsdWUgYXMgc3BlY2lmaWVkIGluIHRoZSBkb21haW4uXG4gICAqL1xuICByZWFkb25seSBtaW46IERhdGFWYWx1ZTtcbiAgLyoqXG4gICAqIEByZXR1cm5zICBNYXhpbXVtIHZhbHVlIGFzIHNwZWNpZmllZCBpbiB0aGUgZG9tYWluLlxuICAgKi9cbiAgcmVhZG9ubHkgbWF4OiBEYXRhVmFsdWU7XG59XG5cbi8qKlxuICogVGhlIGRvbWFpbiBvZiBhIGNhdGVnb3JpY2FsIGZpbHRlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpY2FsRG9tYWluIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zIHRoZSBkb21haW4gdHlwZSAocmVsZXZhbnQsIGFsbClcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IEZpbHRlckRvbWFpblR5cGU7XG4gIC8qKlxuICAgKiBAcmV0dXJucyB0aGUgbGlzdCBvZiB2YWx1ZXMgaW4gdGhlIGRvbWFpbiBvZiB0aGUgZmlsdGVyXG4gICAqL1xuICByZWFkb25seSB2YWx1ZXM6IEFycmF5PERhdGFWYWx1ZT47XG59XG5cbi8qKlxuICogQSBzZWxlY3RlZCB2YWx1ZSBpbiBhIGhpZXJhcmNoaWNhbCBmaWx0ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBIaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWUge1xuICAvKipcbiAgICogQHJldHVybnMgdGhlIERhdGFWYWx1ZSBvZiB0aGUgc2VsZXRlZCBpdGVtXG4gICAqL1xuICB2YWx1ZTogRGF0YVZhbHVlO1xuICAvKipcbiAgICogQHJldHVybnMgdGhlIHBhdGggdG8gdGhpcyBzZWxlY3RlZCBpdGVtLiBJbiB0aGUgQnlDYXRlZ29yeSBleGFtcGxlLCB0aGUgaGllcmFyY2hpY2FsUGF0aCBmb3IgYSBsZXZlbCAyIGl0ZW0gY291bGQgYmVcbiAgICogJ1tPdXRkb29yICYgU3BvcnRpbmddLltCaWtlc10uW0tpZHMnIEJpa2VzXScuXG4gICAqL1xuICByZWFkb25seSBoaWVyYXJjaGljYWxQYXRoOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBAcmV0dXJucyB0aGUgbGV2ZWwgb2YgdGhpcyBzZWxlY3RlZCBpdGVtLiBJbiB0aGUgQnlDYXRlZ29yeSBleGFtcGxlLCB0aGUgbGV2ZWwgY291bGQgYmUgMC00LlxuICAgKiBGb3IgJ1tPdXRkb29yICYgU3BvcnRpbmddLltCaWtlc10uW0tpZHMnIEJpa2VzXScsIHRoZSBsZXZlbCBpcyAyLlxuICAgKi9cbiAgbGV2ZWw6IG51bWJlcjtcbn1cblxuLyoqXG4gKiBEZXRhaWxzIGFib3V0IGVhY2ggbGV2ZWwgaW4gYSBoaWVyYXJjaGljYWwgZmlsdGVyXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwge1xuICAvKipcbiAgICogQHJldHVybnMgdGhlIGxldmVsIG5hbWUuIEluIHRoZSBCeUNhdGVnb3J5IGV4YW1wbGUsIHRoZSBuYW1lIGNvdWxkIGJlICdGYW1pbHknLCAnQ2F0ZWdvcnknLCAnU3ViY2F0ZWdvcnknLCAnQnJhbmQnLCBvciAnU2t1Jy5cbiAgICovXG4gIG5hbWU6IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgdGhlIGxldmVsIHNlbGVjdGlvbiBzdGF0ZVxuICAgKi9cbiAgbGV2ZWxTZWxlY3Rpb25TdGF0ZTogSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZTtcbn1cbiIsIi8qKlxuICogVGhlIHRhYmxlYXUgbmFtZXNwYWNlIGV4aXN0cyBmb3Igb3JnYW5pemF0aW9uIGFuZCB0byBhdm9pZCBwb2xsdXRpbmdcbiAqIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiBJdCBjb250YWlucyBubyBjb25zdHJ1Y3RzIG90aGVyIHRoYW4gc3ViLW5hbWVzcGFjZXMgYW5kIHRoZSBUYWJsZWF1IGVudW1lcmF0aW9ucy5cbiAqL1xuXG5uYW1lc3BhY2UgVGFibGVhdSB7XG4gIGV4cG9ydCBlbnVtIEFuYWx5dGljc09iamVjdFR5cGUge1xuICAgIENsdXN0ZXIgPSAnY2x1c3RlcicsXG4gICAgRm9yZWNhc3QgPSAnZm9yZWNhc3QnLFxuICAgIFRyZW5kTGluZSA9ICd0cmVuZC1saW5lJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIEFubm90YXRpb25UeXBlIHtcbiAgICBNYXJrID0gJ21hcmsnLFxuICAgIFBvaW50ID0gJ3BvaW50JyxcbiAgICBBcmVhID0gJ2FyZWEnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG4gICAgRGlzY3JldGUgPSAnZGlzY3JldGUnLFxuICAgIENvbnRpbnVvdXMgPSAnY29udGludW91cycsXG4gICAgVW5rbm93biA9ICd1bmtub3duJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIENsYXNzTmFtZUtleSB7XG4gICAgV29ya3NoZWV0VGl0bGUgPSAndGFibGVhdS13b3Jrc2hlZXQtdGl0bGUnLFxuICAgIFdvcmtzaGVldCA9ICd0YWJsZWF1LXdvcmtzaGVldCcsXG4gICAgVG9vbHRpcCA9ICd0YWJsZWF1LXRvb2x0aXAnLFxuICAgIFN0b3J5VGl0bGUgPSAndGFibGVhdS1zdG9yeS10aXRsZScsXG4gICAgRGFzaGJvYXJkVGl0bGUgPSAndGFibGVhdS1kYXNoYm9hcmQtdGl0bGUnLFxuICAgIFBhbmUgPSAndGFibGVhdS1wYW5lJyxcbiAgICBSb3dEaXZpZGVycyA9ICd0YWJsZWF1LXJvdy1kaXZpZGVycycsXG4gICAgQ29sdW1uRGl2aWRlcnMgPSAndGFibGVhdS1jb2x1bW4tZGl2aWRlcnMnLFxuICB9XG5cbiAgLyoqXG4gICAqIFdoYXQgdGhlIG9iamVjdCByZXByZXNlbnRzIGluIGEgZGFzaGJvYXJkLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VHlwZSB7XG4gICAgQmxhbmsgPSAnYmxhbmsnLFxuICAgIFdvcmtzaGVldCA9ICd3b3Jrc2hlZXQnLFxuICAgIFF1aWNrRmlsdGVyID0gJ3F1aWNrLWZpbHRlcicsXG4gICAgUGFyYW1ldGVyQ29udHJvbCA9ICdwYXJhbWV0ZXItY29udHJvbCcsXG4gICAgUGFnZUZpbHRlciA9ICdwYWdlLWZpbHRlcicsXG4gICAgTGVnZW5kID0gJ2xlZ2VuZCcsXG4gICAgVGl0bGUgPSAndGl0bGUnLFxuICAgIFRleHQgPSAndGV4dCcsXG4gICAgSW1hZ2UgPSAnaW1hZ2UnLFxuICAgIFdlYlBhZ2UgPSAnd2ViLXBhZ2UnLFxuICAgIEV4dGVuc2lvbiA9ICdleHRlbnNpb24nLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCByZXByZXNlbnRzIHRoZSB2aXNpYmlsaXR5IHN0YXRlIG9mIGEgZGFzaGJvYXJkIG9iamVjdC5cbiAgICogQHNpbmNlIDEuNy4wXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZSB7XG4gICAgLyoqIFVzZWQgZm9yIHR1cm5pbmcgb24gdGhlIHZpc2liaWxpdHkgb2YgYSBkYXNoYm9hcmQgb2JqZWN0LiovXG4gICAgU2hvdyA9ICdzaG93JyxcblxuICAgIC8qKiBVc2VkIGZvciB0dXJuaW5nIG9mZiB0aGUgdmlzaWJpbGl0eSBvZiBhIGRhc2hib2FyZCBvYmplY3QuKi9cbiAgICBIaWRlID0gJ2hpZGUnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgZGF0YSBhIHZhbHVlIGNhbiBoYXZlXG4gICAqL1xuICBleHBvcnQgZW51bSBEYXRhVHlwZSB7XG4gICAgU3RyaW5nID0gJ3N0cmluZycsXG4gICAgSW50ID0gJ2ludCcsXG4gICAgRmxvYXQgPSAnZmxvYXQnLFxuICAgIEJvb2wgPSAnYm9vbCcsXG4gICAgRGF0ZSA9ICdkYXRlJyxcbiAgICBEYXRlVGltZSA9ICdkYXRlLXRpbWUnLFxuICAgIFNwYXRpYWwgPSAnc3BhdGlhbCcsXG4gICAgVW5rbm93biA9ICd1bmtub3duJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgY2hhbmdlcyB0aGF0IG9jY3VyIHRvIGEgZGFzaGJvYXJkIG9iamVjdC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhc2hib2FyZExheW91dENoYW5nZSB7XG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCB3YXMgYWRkZWQgKi9cbiAgICBBZGRlZCA9ICdhZGRlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0IHdhcyByZW1vdmVkICovXG4gICAgUmVtb3ZlZCA9ICdyZW1vdmVkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QncyBmbG9hdGluZyBzdGF0ZSBjaGFuZ2VkICovXG4gICAgSXNGbG9hdGluZ0NoYW5nZWQgPSAnaXMtZmxvYXRpbmctY2hhbmdlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0J3MgdmlzaWJpbGl0eSBjaGFuZ2VkICovXG4gICAgSXNWaXNpYmxlQ2hhbmdlZCA9ICdpcy12aXNpYmxlLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCdzIHBvc2l0aW9uIGNoYW5nZWQgKi9cbiAgICBQb3NpdGlvbkNoYW5nZWQgPSAncG9zaXRpb24tY2hhbmdlZCcsXG5cbiAgICAvKiogQSBkYXNoYm9hcmQgb2JqZWN0J3Mgc2l6ZSBjaGFuZ2VkICovXG4gICAgU2l6ZUNoYW5nZWQgPSAnc2l6ZS1jaGFuZ2VkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3Qgd2FzIHJlbmFtZWQgKi9cbiAgICBOYW1lQ2hhbmdlZCA9ICduYW1lLWNoYW5nZWQnLFxuXG4gICAgLyoqIEEgZGFzaGJvYXJkIG9iamVjdCBpcyBzZWxlY3RlZCAqL1xuICAgIFNlbGVjdGVkID0gJ3NlbGVjdGVkJyxcblxuICAgIC8qKiBBIGRhc2hib2FyZCBvYmplY3QgaXMgZGVzZWxlY3RlZCAqL1xuICAgIERlc2VsZWN0ZWQgPSAnZGVzZWxlY3RlZCcsXG5cbiAgICAvKiogTmF2aWdhdGUgdG8gYW5vdGhlciBkYXNoYm9hcmQgKi9cbiAgICBEYXNoYm9hcmRDaGFuZ2VkID0gJ2Rhc2hib2FyZC1jaGFuZ2VkJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBWYWxpZCBkYXRlIHJhbmdlcyBmb3IgYSByZWxhdGl2ZSBkYXRlIGZpbHRlci5cbiAgICovXG4gIGV4cG9ydCBlbnVtIERhdGVSYW5nZVR5cGUge1xuICAgIExhc3QgPSAnbGFzdCcsXG4gICAgTGFzdE4gPSAnbGFzdC1uJyxcbiAgICBOZXh0ID0gJ25leHQnLFxuICAgIE5leHROID0gJ25leHQtbicsXG4gICAgQ3VycmVudCA9ICdjdXJyZW50JyxcbiAgICBUb0RhdGUgPSAndG8tZGF0ZScsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHR5cGVzIG9mIGRpYWxvZyBwb3B1cCBzdHlsZXMuXG4gICAqL1xuICBleHBvcnQgZW51bSBEaWFsb2dTdHlsZSB7XG4gICAgV2luZG93ID0gJ3dpbmRvdycsXG4gICAgTW9kYWwgPSAnbW9kYWwnLFxuICAgIE1vZGVsZXNzID0gJ21vZGVsZXNzJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIEVuY29kaW5nVHlwZSB7XG4gICAgQ29sdW1uID0gJ2NvbHVtbicsXG4gICAgUm93ID0gJ3JvdycsXG4gICAgUGFnZSA9ICdwYWdlJyxcbiAgICBGaWx0ZXIgPSAnZmlsdGVyJyxcbiAgICBNYXJrc1R5cGUgPSAnbWFya3MtdHlwZScsXG4gICAgTWVhc3VyZVZhbHVlcyA9ICdtZWFzdXJlLXZhbHVlcycsXG4gICAgQ29sb3IgPSAnY29sb3InLFxuICAgIFNpemUgPSAnc2l6ZScsXG4gICAgTGFiZWwgPSAnbGFiZWwnLFxuICAgIERldGFpbCA9ICdkZXRhaWwnLFxuICAgIFRvb2x0aXAgPSAndG9vbHRpcCcsXG4gICAgU2hhcGUgPSAnc2hhcGUnLFxuICAgIFBhdGggPSAncGF0aCcsXG4gICAgQW5nbGUgPSAnYW5nbGUnLFxuICAgIEdlb21ldHJ5ID0gJ2dlb21ldHJ5JyxcbiAgICBDdXN0b20gPSAnY3VzdG9tJyxcbiAgfVxuXG4gIC8qKlxuICAgKiAgVHlwZSBvZiBhZ2dyZWdhdGlvbiBvbiBhIGZpZWxkLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmllbGRBZ2dyZWdhdGlvblR5cGUge1xuICAgIFN1bSA9ICdzdW0nLFxuICAgIEF2ZyA9ICdhdmcnLFxuICAgIE1pbiA9ICdtaW4nLFxuICAgIE1heCA9ICdtYXgnLFxuICAgIFN0ZGV2ID0gJ3N0ZGV2JyxcbiAgICBTdGRldnAgPSAnc3RkZXZwJyxcbiAgICBWYXIgPSAndmFyJyxcbiAgICBWYXJwID0gJ3ZhcnAnLFxuICAgIENvbGxlY3QgPSAnY29sbGVjdCcsXG4gICAgQ291bnQgPSAnY291bnQnLFxuICAgIENvdW50ZCA9ICdjb3VudGQnLFxuICAgIE1lZGlhbiA9ICdtZWRpYW4nLFxuICAgIEF0dHIgPSAnYXR0cicsXG4gICAgTm9uZSA9ICdub25lJyxcbiAgICBZZWFyID0gJ3llYXInLFxuICAgIFF0ciA9ICdxdHInLFxuICAgIE1vbnRoID0gJ21vbnRoJyxcbiAgICBEYXkgPSAnZGF5JyxcbiAgICBIb3VyID0gJ2hvdXInLFxuICAgIE1pbnV0ZSA9ICdtaW51dGUnLFxuICAgIFNlY29uZCA9ICdzZWNvbmQnLFxuICAgIFdlZWsgPSAnd2VlaycsXG4gICAgV2Vla2RheSA9ICd3ZWVrZGF5JyxcbiAgICBNb250aFllYXIgPSAnbW9udGgteWVhcicsXG4gICAgTWR5ID0gJ21keScsXG4gICAgRW5kID0gJ2VuZCcsXG4gICAgVHJ1bmNZZWFyID0gJ3RydW5jLXllYXInLFxuICAgIFRydW5jUXRyID0gJ3RydW5jLXF0cicsXG4gICAgVHJ1bmNNb250aCA9ICd0cnVuYy1tb250aCcsXG4gICAgVHJ1bmNXZWVrID0gJ3RydW5jLXdlZWsnLFxuICAgIFRydW5jRGF5ID0gJ3RydW5jLWRheScsXG4gICAgVHJ1bmNIb3VyID0gJ3RydW5jLWhvdXInLFxuICAgIFRydW5jTWludXRlID0gJ3RydW5jLW1pbnV0ZScsXG4gICAgVHJ1bmNTZWNvbmQgPSAndHJ1bmMtc2Vjb25kJyxcbiAgICBRdWFydDEgPSAncXVhcnQxJyxcbiAgICBRdWFydDMgPSAncXVhcnQzJyxcbiAgICBTa2V3bmVzcyA9ICdza2V3bmVzcycsXG4gICAgS3VydG9zaXMgPSAna3VydG9zaXMnLFxuICAgIEluT3V0ID0gJ2luLW91dCcsXG4gICAgVXNlciA9ICd1c2VyJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBSb2xlIG9mIGEgZmllbGQuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWVsZFJvbGVUeXBlIHtcbiAgICBEaW1lbnNpb24gPSAnZGltZW5zaW9uJyxcbiAgICBNZWFzdXJlID0gJ21lYXN1cmUnLFxuICAgIFVua25vd24gPSAndW5rbm93bicsXG4gIH1cblxuICAvKipcbiAgICogQW4gZW51bWVyYXRpb24gb2YgdGhlIHZhbGlkIHR5cGVzIG9mIGZpbHRlcnMgdGhhdCBjYW4gYmUgYXBwbGllZC5cbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlclR5cGUge1xuICAgIENhdGVnb3JpY2FsID0gJ2NhdGVnb3JpY2FsJyxcbiAgICBSYW5nZSA9ICdyYW5nZScsXG4gICAgSGllcmFyY2hpY2FsID0gJ2hpZXJhcmNoaWNhbCcsXG4gICAgUmVsYXRpdmVEYXRlID0gJ3JlbGF0aXZlLWRhdGUnLFxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBkaWZmZXJlbnQgdXBkYXRlIHR5cGVzIGZvciBhcHBseWluZyBmaWx0ZXJcbiAgICovXG4gIGV4cG9ydCBlbnVtIEZpbHRlclVwZGF0ZVR5cGUge1xuICAgIEFkZCA9ICdhZGQnLFxuICAgIEFsbCA9ICdhbGwnLFxuICAgIFJlcGxhY2UgPSAncmVwbGFjZScsXG4gICAgUmVtb3ZlID0gJ3JlbW92ZScsXG4gIH1cblxuICAvKipcbiAgICogVGhlIGRvbWFpbiB0eXBlIGZvciBhIGZpbHRlclxuICAgKi9cbiAgZXhwb3J0IGVudW0gRmlsdGVyRG9tYWluVHlwZSB7XG4gICAgLyoqXG4gICAgICogVGhlIGRvbWFpbiB2YWx1ZXMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gdGhlIHNwZWNpZmllZCBmaWx0ZXJcbiAgICAgKiBpLmUuIHRoZSBkb21haW4gaXMgcmVzdHJpY3RlZCBieSBhIHByZXZpb3VzIGZpbHRlclxuICAgICAqL1xuICAgIFJlbGV2YW50ID0gJ3JlbGV2YW50JyxcbiAgICAvKipcbiAgICAgKiBsaXN0IG9mIGFsbCBwb3NzaWJsZSBkb21haW4gdmFsdWVzIGZyb20gZGF0YWJhc2VcbiAgICAgKi9cbiAgICBEYXRhYmFzZSA9ICdkYXRhYmFzZScsXG4gIH1cblxuICAvKipcbiAgICogVGhlIG9wdGlvbiBmb3Igc3BlY2lmeWluZyB3aGljaCB2YWx1ZXMgdG8gaW5jbHVkZSBmb3IgZmlsdGVyaW5nXG4gICAqIEluZGljYXRlcyB3aGF0IHRvIGRvIHdpdGggbnVsbCB2YWx1ZXMgZm9yIGEgZ2l2ZW4gZmlsdGVyIG9yIG1hcmsgc2VsZWN0aW9uIGNhbGwuXG4gICAqL1xuICBleHBvcnQgZW51bSBGaWx0ZXJOdWxsT3B0aW9uIHtcbiAgICBOdWxsVmFsdWVzID0gJ251bGwtdmFsdWVzJyxcbiAgICBOb25OdWxsVmFsdWVzID0gJ25vbi1udWxsLXZhbHVlcycsXG4gICAgQWxsVmFsdWVzID0gJ2FsbC12YWx1ZXMnLFxuICB9XG5cbiAgLyoqXG4gICAqIEVudW0gdGhhdCBzZXJ2ZXMgYXMgYSBmaWx0ZXIgb24gdGhlIERhdGFWYWx1ZXMgcmV0dXJuZWQgZnJvbSBgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luY2AsXG4gICAqIGBnZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyQXN5bmNgIGFuZCBgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jYC5cbiAgICogVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gb2YgcmV0dXJuZWQgZGF0YSB2YWx1ZXMgb25seS4gVGFibGVhdSB2ZXJzaW9ucyBwcmlvciB0byAyMDIxLjJcbiAgICogd2lsbCBwYXNzIHRoZSBkYXRhIGFjcm9zcyBhbmQgcG9wdWxhdGUgdGhlIERhdGFWYWx1ZSBwcm9wZXJ0aWVzLlxuICAgKiBQbGVhc2Ugbm90ZSB0aGF0IGFsbCBwcm9wZXJ0aWVzIG5vdCByZXF1ZXN0ZWQgd2lsbCBiZSBgdW5kZWZpbmVkYCBpbiB0aGUgRGF0YVZhbHVlIHJlc3VsdHMuXG4gICAqIEBzaW5jZSAxLjUuMFxuICAgKi9cbiAgZXhwb3J0IGVudW0gSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24ge1xuICAgIC8qKiBEYXRhVmFsdWVzIHdpbGwgaW5jbHVkZSBhbGwgcHJvcGVydGllcy4qL1xuICAgIEFsbFZhbHVlcyA9ICdhbGwtdmFsdWVzJyxcblxuICAgIC8qKiBEYXRhVmFsdWVzIHdpbGwgb25seSBpbmNsdWRlIHZhbHVlIGFuZCBuYXRpdmVWYWx1ZSBwcm9wZXJ0aWVzLiovXG4gICAgT25seU5hdGl2ZVZhbHVlcyA9ICdvbmx5LW5hdGl2ZS12YWx1ZXMnLFxuXG4gICAgLyoqIERhdGFWYWx1ZXMgd2lsbCBvbmx5IGluY2x1ZGUgZm9ybWF0dGVkVmFsdWUgcHJvcGVydGllcy4gKi9cbiAgICBPbmx5Rm9ybWF0dGVkVmFsdWVzID0gJ29ubHktZm9ybWF0dGVkLXZhbHVlcycsXG4gIH1cblxuICAvKipcbiAgICogVHlwZSBvZiBtYXJrIGZvciBhIGdpdmVuIG1hcmtzIGNhcmQgaW4gYSB2aXouXG4gICAqL1xuICBleHBvcnQgZW51bSBNYXJrVHlwZSB7XG4gICAgQmFyID0gJ2JhcicsXG4gICAgTGluZSA9ICdsaW5lJyxcbiAgICBBcmVhID0gJ2FyZWEnLFxuICAgIFNxdWFyZSA9ICdzcXVhcmUnLFxuICAgIENpcmNsZSA9ICdjaXJjbGUnLFxuICAgIFNoYXBlID0gJ3NoYXBlJyxcbiAgICBUZXh0ID0gJ3RleHQnLFxuICAgIE1hcCA9ICdtYXAnLFxuICAgIFBpZSA9ICdwaWUnLFxuICAgIEdhbnR0QmFyID0gJ2dhbnR0LWJhcicsXG4gICAgUG9seWdvbiA9ICdwb2x5Z29uJyxcbiAgICBIZWF0bWFwID0gJ2hlYXRtYXAnLFxuICAgIFZpekV4dGVuc2lvbiA9ICd2aXotZXh0ZW5zaW9uJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIERhdGFGb3JtYXRUeXBlIHtcbiAgICBBdXRvRm9ybWF0ID0gJ2F1dG8tZm9ybWF0JyxcbiAgICBTeXN0ZW1OdW1iZXIgPSAnc3lzdGVtLW51bWJlcicsXG4gICAgU3lzdGVtQ3VycmVuY3kgPSAnc3lzdGVtLWN1cnJlbmN5JyxcbiAgICBTeXN0ZW1Mb25nRGF0ZSA9ICdzeXN0ZW0tbG9uZy1kYXRlJyxcbiAgICBTeXN0ZW1TaG9ydERhdGUgPSAnc3lzdGVtLXNob3J0LWRhdGUnLFxuICAgIFN5c3RlbVRpbWUgPSAnc3lzdGVtLXRpbWUnLFxuICAgIEN1c3RvbSA9ICdjdXN0b20nLFxuICAgIEN1c3RvbU51bWJlciA9ICdjdXN0b20tbnVtYmVyJyxcbiAgICBDdXN0b21DdXJyZW5jeSA9ICdjdXN0b20tY3VycmVuY3knLFxuICAgIEN1c3RvbVNjaWVudGlmaWMgPSAnY3VzdG9tLXNjaWVudGlmaWMnLFxuICAgIEN1c3RvbVBlcmNlbnRhZ2UgPSAnY3VzdG9tLXBlcmNlbnRhZ2UnLFxuICB9XG5cbiAgZXhwb3J0IGVudW0gTnVtYmVyRm9ybWF0VW5pdHMge1xuICAgIE5vbmUgPSAndW5pdHMtbm9uZScsXG4gICAgVGhvdXNhbmRzID0gJ3VuaXRzLXRob3VzYW5kcycsXG4gICAgTWlsbGlvbnMgPSAndW5pdHMtbWlsbGlvbnMnLFxuICAgIEJpbGxpb25zRW5nbGlzaCA9ICd1bml0cy1iaWxsaW9ucy1lbmdsaXNoJyxcbiAgICBCaWxsaW9uc1N0YW5kYXJkID0gJ3VuaXRzLWJpbGxpb25zLXN0YW5kYXJkJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIE5lZ2F0aXZlTnVtYmVyRm9ybWF0IHtcbiAgICBBdXRvbWF0aWMgPSAnYXV0b21hdGljJyxcbiAgICBQYXJlbnRoZXNlcyA9ICdwYXJlbnRoZXNlcycsXG4gICAgT3V0ZXJQcmVmaXggPSAnb3V0ZXItcHJlZml4JyxcbiAgICBPdXRlclN1ZmZpeCA9ICdvdXRlci1zdWZmaXgnLFxuICAgIElubmVyUHJlZml4ID0gJ2lubmVyLXByZWZpeCcsXG4gICAgSW5uZXJTdWZmaXggPSAnaW5uZXItc3VmZml4JyxcbiAgfVxuXG4gIC8qKlxuICAgKiBBbiBlbnVtZXJhdGlvbiBkZXNjcmliaW5nIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgYWxsb3dhYmxlIHZhbHVlcy5cbiAgICogVGhpcyBpcyB1c2VkIGZvciByZXN0cmljdGluZyB0aGUgZG9tYWluIG9mIGEgcGFyYW1ldGVyXG4gICAqL1xuICBleHBvcnQgZW51bSBQYXJhbWV0ZXJWYWx1ZVR5cGUge1xuICAgIEFsbCA9ICdhbGwnLFxuICAgIExpc3QgPSAnbGlzdCcsXG4gICAgUmFuZ2UgPSAncmFuZ2UnLFxuICB9XG5cbiAgLyoqXG4gICAqIERhdGUgcGVyaW9kIHVzZWQgaW4gZmlsdGVycyBhbmQgaW4gcGFyYW1ldGVycy5cbiAgICovXG4gIGV4cG9ydCBlbnVtIFBlcmlvZFR5cGUge1xuICAgIFllYXJzID0gJ3llYXJzJyxcbiAgICBRdWFydGVycyA9ICdxdWFydGVycycsXG4gICAgTW9udGhzID0gJ21vbnRocycsXG4gICAgV2Vla3MgPSAnd2Vla3MnLFxuICAgIERheXMgPSAnZGF5cycsXG4gICAgSG91cnMgPSAnaG91cnMnLFxuICAgIE1pbnV0ZXMgPSAnbWludXRlcycsXG4gICAgU2Vjb25kcyA9ICdzZWNvbmRzJyxcbiAgICBJc29ZZWFycyA9ICdpc28teWVhcnMnLFxuICAgIElzb1F1YXJ0ZXJzID0gJ2lzby1xdWFydGVycycsXG4gICAgSXNvV2Vla3MgPSAnaXNvLXdlZWtzJyxcbiAgfVxuXG4gIGV4cG9ydCBlbnVtIFF1aWNrVGFibGVDYWxjVHlwZSB7XG4gICAgUnVubmluZ1RvdGFsID0gJ3J1bm5pbmctdG90YWwnLFxuICAgIERpZmZlcmVuY2UgPSAnZGlmZmVyZW5jZScsXG4gICAgUGVyY2VudERpZmZlcmVuY2UgPSAncGVyY2VudC1kaWZmZXJlbmNlJyxcbiAgICBQZXJjZW50T2ZUb3RhbCA9ICdwZXJjZW50LW9mLXRvdGFsJyxcbiAgICBSYW5rID0gJ3JhbmsnLFxuICAgIFBlcmNlbnRpbGUgPSAncGVyY2VudGlsZScsXG4gICAgTW92aW5nQXZlcmFnZSA9ICdtb3ZpbmctYXZlcmFnZScsXG4gICAgWVREVG90YWwgPSAneXRkLXRvdGFsJyxcbiAgICBDb21wb3VuZEdyb3d0aFJhdGUgPSAnY29tcG91bmQtZ3Jvd3RoLXJhdGUnLFxuICAgIFllYXJPdmVyWWVhckdyb3d0aCA9ICd5ZWFyLW92ZXIteWVhci1ncm93dGgnLFxuICAgIFlUREdyb3d0aCA9ICd5dGQtZ3Jvd3RoJyxcbiAgICBVbmRlZmluZWQgPSAndW5kZWZpbmVkJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Rpb24gdHlwZSBmb3Igc2VsZWN0IG1hcmtzIGFwaS5cbiAgICovXG4gIGV4cG9ydCBlbnVtIFNlbGVjdGlvblVwZGF0ZVR5cGUge1xuICAgIFJlcGxhY2UgPSAnc2VsZWN0LXJlcGxhY2UnLFxuICAgIEFkZCA9ICdzZWxlY3QtYWRkJyxcbiAgICBSZW1vdmUgPSAnc2VsZWN0LXJlbW92ZScsXG4gIH1cblxuICAvKipcbiAgICogRW51bSBmb3Igc3BlY2lmeWluZyB0aGUgc2VsZWN0IG9wdGlvbiBmb3IgdGhlIGBleHRlbnNpb25zLldvcmtzaGVldC5zZWxlY3RUdXBsZXNBc3luY2AgbWV0aG9kLlxuICAgKi9cbiAgZXhwb3J0IGVudW0gU2VsZWN0T3B0aW9ucyB7XG4gICAgLyoqXG4gICAgICogQ2xlYXJzIGV4aXN0aW5nIHNlbGVjdGlvbiBiZWZvcmUgc2VsZWN0aW5nIHRoZSB0dXBsZXMgc3BlY2lmaWVkXG4gICAgICovXG4gICAgU2ltcGxlID0gJ3NlbGVjdC1vcHRpb25zLXNpbXBsZScsXG4gICAgLyoqXG4gICAgICogQWRkcyBzcGVjaWZpZWQgdHVwbGVzIHRvIHRoZSBleGlzdGluZyBzZWxlY3Rpb25cbiAgICAgKi9cbiAgICBUb2dnbGUgPSAnc2VsZWN0LW9wdGlvbnMtdG9nZ2xlJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBzaGVldCBhIFtbU2hlZXRdXSBvYmplY3QgcmVwcmVzZW50c1xuICAgKi9cbiAgZXhwb3J0IGVudW0gU2hlZXRUeXBlIHtcbiAgICBEYXNoYm9hcmQgPSAnZGFzaGJvYXJkJyxcbiAgICBTdG9yeSA9ICdzdG9yeScsXG4gICAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG4gIH1cblxuICBleHBvcnQgZW51bSBTb3J0RGlyZWN0aW9uIHtcbiAgICBJbmNyZWFzaW5nID0gJ2luY3JlYXNpbmcnLFxuICAgIERlY3JlYXNpbmcgPSAnZGVjcmVhc2luZycsXG4gIH1cblxuICBleHBvcnQgZW51bSBUcmVuZExpbmVNb2RlbFR5cGUge1xuICAgIExpbmVhciA9ICdsaW5lYXInLFxuICAgIExvZ2FyaXRobWljID0gJ2xvZ2FyaXRobWljJyxcbiAgICBFeHBvbmVudGlhbCA9ICdleHBvbmVudGlhbCcsXG4gICAgUG9seW5vbWlhbCA9ICdwb2x5bm9taWFsJyxcbiAgfVxuXG4gIC8qKlxuICAgKiBFbnVtIHRoYXQgcmVwcmVzZW50cyB0aGUgcmVwbGF5IHNwZWVkIG9mIGFuIGFuaW1hdGlvbi5cbiAgICogQHNpbmNlIDEuNy4wXG4gICAqL1xuICBleHBvcnQgZW51bSBSZXBsYXlTcGVlZFR5cGUge1xuICAgIC8qKiBVc2VkIGZvciBzZXR0aW5nIHRoZSByZXBsYXkgc3BlZWQgb2YgYW4gYW5pbWF0aW9uIHRvIDAuNXguKi9cbiAgICBTbG93ID0gJ3Nsb3cnLFxuXG4gICAgLyoqIFVzZWQgZm9yIHNldHRpbmcgdGhlIHJlcGxheSBzcGVlZCBvZiBhbiBhbmltYXRpb24gdG8gMS4weC4qL1xuICAgIE5vcm1hbCA9ICdub3JtYWwnLFxuXG4gICAgLyoqIFVzZWQgZm9yIHNldHRpbmcgdGhlIHJlcGxheSBzcGVlZCBvZiBhbiBhbmltYXRpb24gdG8gMi4weC4qL1xuICAgIEZhc3QgPSAnZmFzdCcsXG4gIH1cblxuICAvKipcbiAgICogRW51bSB0aGF0IHJlcHJlc2VudHMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiBhIGxldmVsIGluIGEgaGllcmFyY2hpY2FsIGZpbHRlclxuICAgKiBAc2luY2UgRXh0ZW5zaW9ucyAxLjEwLjBcbiAgICovXG4gIGV4cG9ydCBlbnVtIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUge1xuICAgIEFsbFNlbGVjdGVkID0gJ2FsbC1zZWxlY3RlZCcsXG4gICAgTm9uZVNlbGVjdGVkID0gJ25vbmUtc2VsZWN0ZWQnLFxuICAgIFNvbWVTZWxlY3RlZCA9ICdzb21lLXNlbGVjdGVkJyxcbiAgICBVbmtub3duU2VsZWN0ZWQgPSAndW5rbm93bi1zZWxlY3RlZCcsXG4gIH1cblxuICAvKipcbiAgICogWm9uZVZpc2liaWxpdHlUeXBlXG4gICAqIEBkZXByZWNhdGVkIHVzZSBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZVxuICAgKi9cbiAgZXhwb3J0IGRlY2xhcmUgdHlwZSBab25lVmlzaWJpbGl0eVR5cGUgPSBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZTtcbiAgZXhwb3J0IGNvbnN0IFpvbmVWaXNpYmlsaXR5VHlwZSA9IHsgLi4uRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUgfTtcbn1cbmV4cG9ydCA9IFRhYmxlYXU7XG4iLCJpbXBvcnQgeyBQb2ludCB9IGZyb20gJy4uL0V4dGVuc2lvbnMvU2hlZXRJbnRlcmZhY2VzJztcbmltcG9ydCB7IERhdGFUYWJsZSB9IGZyb20gJy4vRGF0YVRhYmxlSW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBGaWx0ZXJOdWxsT3B0aW9uLCBNYXJrVHlwZSB9IGZyb20gJy4vTmFtZXNwYWNlcy9UYWJsZWF1JztcblxuLyoqXG4gKiBSZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBtYXJrcyBvbiBhIHZpei4gVGhpcyBjb2xsZWN0aW9uIGNvdWxkIGJlXG4gKiBtYXJrcyB0aGF0IGFyZSBlaXRoZXIgc2VsZWN0ZWQgb3IgaGlnaGxpZ2h0ZWQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTWFya3NDb2xsZWN0aW9uIHtcbiAgLyoqXG4gICAqIEByZXR1cm5zICBBIGNvbGxlY3Rpb24gb2YgZGF0YSB0YWJsZXMuIEVhY2ggcm93IGluIGVhY2ggZGF0YSB0YWJsZSByZXByZXNlbnRzIGEgc2luZ2xlXG4gICAqICAgICAgICAgICBtYXJrIG9uIHRoZSB2aXouIFNpbmNlIG1hcmtzIGNhbiBjb250YWluIGNvbHVtbnMgZGlmZmVyZW50IHRoYW4gdGhlIGNvbHVtbnMgb2YgYW5vdGhlciBtYXJrLFxuICAgKiAgICAgICAgICAgZm9yIGV4YW1wbGUsIGEgZHVhbCBheGlzIGNoYXJ0LCBlYWNoIHRhYmxlIHJlcHJlc2VudHMgb25lIHNwZWNpZmljIHNjaGVtYSBvZiBhIG1hcmsuXG4gICAqL1xuICByZWFkb25seSBkYXRhOiBBcnJheTxEYXRhVGFibGU+O1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgYSBtYXJrIGluIGEgd29ya3NoZWV0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtJbmZvIHtcbiAgLyoqXG4gICAqIEBiZXRhXG4gICAqIEByZXR1cm5zICBUaGUgdHlwZSBvZiB0aGlzIG1hcmsuXG4gICAqL1xuICByZWFkb25seSB0eXBlOiBNYXJrVHlwZTtcblxuICAvKipcbiAgICogQGJldGFcbiAgICogQHJldHVybnMgIFRoZSBSR0JBIHZhbHVlIG9mIHRoaXMgbWFyay5cbiAgICovXG4gIHJlYWRvbmx5IGNvbG9yOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zICBVbmlxdWUgdHVwbGUgcmVwcmVzZW50aW5nIHRoaXMgbWFyayBpbiBhIGRyYXduIHZpc3VhbGl6YXRpb24uXG4gICAqL1xuICB0dXBsZUlkPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFNlbGVjdGlvbkNyaXRlcmlhIGludGVyZmFjZSBpcyB1c2VkIHRvIHNwZWNpZnkgdG8gdGhlIGZpZWxkTmFtZSB0byB2YWx1ZXMgZm9yIEhpZXJhcmNoaWNhbCwgQ2F0ZWdvcmljYWwgYW5kIFJhbmdlIGJhc2VkIHNlbGVjdGlvbnMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0aW9uQ3JpdGVyaWEge1xuICAvKipcbiAgICogQGhpZGRlblxuICAgKiB0dXBsZUlkcyBhcmUgb2YgbnVtYmVyIHR5cGUuXG4gICAqL1xuICByZWFkb25seSB0dXBsZUlkPzogbnVtYmVyO1xuICAvKipcbiAgICogRmllbGRuYW1lIG9mIHRoZSBtYXJrIHRoYXQgaXMgaW50ZW5kZWQgdG8gYmUgc2VsZWN0ZWQuXG4gICAqIEhpZXJhcmNoaWNhbCBmaWVsZHMgZm9sbG93IHRoZSBjb252ZW50aW9uIG9mIFwiW3twYXJlbnRGaWVsZH1dLlt7c2VsZWN0aW5nRmllbGR9XVwiXG4gICAqL1xuICByZWFkb25seSBmaWVsZE5hbWU6IHN0cmluZztcbiAgLyogdHNsaW50OmRpc2FibGU6bm8tYW55ICovXG4gIC8qKlxuICAgKiBWYWx1ZSB0aGF0IGlzIGludGVuZGVkIHRvIGJlIHNlbGVjdGVkLiBUaGlzIGNhbiBiZSBzcGVjaWZpZWQgYXMgdGhlIGxpc3Qgb2YgdmFsdWVzIG9yIGEgc2luZ2xlIHZhbHVlLlxuICAgKiBSYW5nZS1iYXNlZCBzZWxlY3Rpb25zIG5lZWQgdG8gcHJvdmlkZSB0aGUgdmFsdWUgaW4gdGhlIGZvcm1hdCBvZiBSYW5nZVZhbHVlIGludGVyZmFjZS5cbiAgICogVG8gc2VsZWN0IGEgc2luZ2xlIHF1YW50aXRhdGl2ZSB2YWx1ZSwgdXNlIHRoZSBSYW5nZVZhbHVlIGludGVyZmFjZSB3aGVyZSBib3RoIG1heCBhbmQgbWluIGFyZSB0aGUgdmFsdWUgeW91IHdhbnQgdG8gc2VsZWN0LlxuICAgKi9cbiAgcmVhZG9ubHkgdmFsdWU6IENhdGVnb3JpY2FsVmFsdWUgfCBSYW5nZVZhbHVlO1xufVxuXG4vKipcbiAqIENhdGVnb3JpY2FsIHZhbHVlcyBmb3Igc2VsZWN0aW9uLlxuICovXG5leHBvcnQgdHlwZSBDYXRlZ29yaWNhbFZhbHVlID0gc3RyaW5nIHwgQXJyYXk8c3RyaW5nPjtcblxuLyoqXG4gKiBSYW5nZVZhbHVlIGludGVyZmFjZSB0byBwcm92aWRlIHNlbGVjdGlvbiB2YWx1ZSBmb3IgcmFuZ2UgYmFzZWQgc2VsZWN0aW9ucy5cbiAqIFRoZSBhc3NvY2lhdGVkIGZpZWxkIHNob3VsZCBiZSBhIHF1YW50aXRhdGl2ZSBmaWVsZC5cbiAqIEZvciBEYXRlIFZhbHVlcywgVVRDIERhdGUgb2JqZWN0cyBhcmUgZXhwZWN0ZWQuIChpLmUuLCBgdmFyIG1pbiA9IG5ldyBEYXRlKERhdGUuVVRDKDE5OTksIDAsIDEpKWApLlxuICogV2hpbGUgZGF0ZSBzdHJpbmcgaW5wdXRzIHdvcmssIFVUQyBkYXRlIGlucHV0cyBhcmUgb2ZmaWNpYWxseSBzdXBwb3J0ZWQgZ29pbmcgZm9yd2FyZCBmb3IgUmFuZ2VWYWx1ZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSYW5nZVZhbHVlIHtcbiAgLyoqXG4gICAqIG1pbiByYW5nZSB2YWx1ZSBmb3IgdGhlIHJhbmdlIGJhc2VkIHNlbGVjdGlvblxuICAgKi9cbiAgcmVhZG9ubHkgbWluOiBudW1iZXIgfCBEYXRlO1xuICAvKipcbiAgICogbWF4IHJhbmdlIHZhbHVlIGZvciB0aGUgcmFuZ2UgYmFzZWQgc2VsZWN0aW9uXG4gICAqL1xuICByZWFkb25seSBtYXg6IG51bWJlciB8IERhdGU7XG4gIC8qKlxuICAgKiBJbmNsdWRpbmcgbnVsbG9wdGlvbnMgcGFyYW1ldGVyLlxuICAgKi9cbiAgcmVhZG9ubHkgbnVsbE9wdGlvbj86IEZpbHRlck51bGxPcHRpb247XG59XG5cbi8qKlxuICogUHJvdmlkZXMgdGhlIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiBmb3IgaG93IHRvIGRpc3BsYXkgYSBUYWJsZWF1IHRvb2x0aXAuXG4gKiBAc2luY2UgMS4xMi4wIGFuZCBUYWJsZWF1IDIwMjQuMlxuICogQGNhdGVnb3J5IFZpeiBFeHRlbnNpb25zXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVG9vbHRpcENvbnRleHQge1xuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXJlIHRoZSB0b29sdGlwIHNob3VsZCBiZSBkaXNwbGF5ZWQgcmVsYXRpdmUgdG8gdGhlIHRvcCBsZWZ0IG9mIHRoZSB2aXN1YWxpemF0aW9uLlxuICAgKi9cbiAgcmVhZG9ubHkgdG9vbHRpcEFuY2hvclBvaW50OiBQb2ludDtcbn1cbiIsIi8qKlxuICogUmVwcmVzZW50cyBhIHdpZHRoIGFuZCBoZWlnaHQgaW4gcGl4ZWxzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNpemUge1xuICAvKipcbiAgICogQHJldHVybnMgIEhlaWdodCBvZiB0aGUgc2l6ZSBvYmplY3QuXG4gICAqL1xuICByZWFkb25seSBoZWlnaHQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQHJldHVybnMgIFdpZHRoIG9mIHRoZSBzaXplIG9iamVjdC5cbiAgICovXG4gIHJlYWRvbmx5IHdpZHRoOiBudW1iZXI7XG59XG4iLCJpbXBvcnQgeyBGaWVsZEJhc2UgfSBmcm9tICcuL0RhdGFTb3VyY2VJbnRlcmZhY2VzJztcbmltcG9ydCB7IEVuY29kaW5nVHlwZSwgTWFya1R5cGUgfSBmcm9tICcuL05hbWVzcGFjZXMvVGFibGVhdSc7XG5cbi8qKlxuICogQHNpbmNlIDEuMTEuMFxuICogUmVwcmVzZW50cyBhIGNvbGxlY3Rpb24gb2YgZmllbGRzIG9uIHZhcmlvdXMgZW5jb2RpbmdzIGFzIHdlbGwgYXMgb3RoZXIgdml6IHNwZWNpZmljIGluZm9ybWF0aW9uIGZvciBhIHdvcmtzaGVldFxuICovXG5leHBvcnQgaW50ZXJmYWNlIFZpc3VhbFNwZWNpZmljYXRpb24ge1xuICByZWFkb25seSByb3dGaWVsZHM6IEZpZWxkSW5zdGFuY2VbXTtcbiAgcmVhZG9ubHkgY29sdW1uRmllbGRzOiBGaWVsZEluc3RhbmNlW107XG4gIHJlYWRvbmx5IGFjdGl2ZU1hcmtzU3BlY2lmaWNhdGlvbkluZGV4OiBudW1iZXI7XG4gIHJlYWRvbmx5IG1hcmtzU3BlY2lmaWNhdGlvbnM6IE1hcmtzU3BlY2lmaWNhdGlvbltdO1xufVxuXG4vKipcbiAqIEBzaW5jZSAxLjExLjBcbiAqIFJlcHJlc2VudHMgYSBjb2xsZWN0aW9uIG9mIGZpZWxkcyBvbiB2YXJpb3VzIGVuY29kaW5ncyBmb3IgYSBzaW5nbGUgbWFya3MgY2FyZFxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1hcmtzU3BlY2lmaWNhdGlvbiB7XG4gIHJlYWRvbmx5IHByaW1pdGl2ZVR5cGU6IE1hcmtUeXBlO1xuICByZWFkb25seSBlbmNvZGluZ3M6IEVuY29kaW5nW107XG59XG5cbi8qKlxuICogQHNpbmNlIDEuMTEuMFxuICogUmVwcmVzZW50cyBhIHNpbmdsZSBmaWVsZCBhbmQgaXRzIGFzc29jaWF0ZWQgZW5jb2Rpbmcgb24gYSBtYXJrcyBjYXJkXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRW5jb2Rpbmcge1xuICAvKipcbiAgICogQHJldHVybnMgaW5idWlsdCBlbmNvZGluZyB0eXBlIG9yIHRoZSBjdXN0b20gZW5jb2RpbmdcbiAgICovXG4gIHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEByZXR1cm5zIFRoZSB1bmlxdWUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVuY29kaW5ncyxcbiAgICogVGhpcyBhbGxvd3MgdG8gaWRlbnRpZnkgdGhlIGR1cGxpY2F0ZSBmaWVsZHMgdGhhdCBhcmUgYWRkZWQgdG8gZW5jb2RpbmdzLlxuICAgKiBAc2luY2UgMS4xMy4wXG4gICAqL1xuICByZWFkb25seSBmaWVsZEVuY29kaW5nSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQHJldHVybnMgdHlwZSBvZiB0aGUgZW5jb2RpbmdcbiAgICovXG4gIHJlYWRvbmx5IHR5cGU6IEVuY29kaW5nVHlwZTtcblxuICAvKipcbiAgICogQHJldHVybnMgRmllbGQgYW5kIGl0cyBwcm9wZXJ0aWVzXG4gICAqL1xuICByZWFkb25seSBmaWVsZDogRmllbGRJbnN0YW5jZTtcbn1cblxuLyoqXG4gKiBAc2luY2UgMS4xMS4wXG4gKiBSZXByZXNlbnRzIGEgZmllbGQgYW5kIGl0cyBwcm9wZXJ0aWVzXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRJbnN0YW5jZSBleHRlbmRzIEZpZWxkQmFzZSB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyBUaGUgdW5pcXVlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmaWVsZCBhY3Jvc3MgYWxsIGRhdGEgc291cmNlcyBpbiB0aGUgd29ya2Jvb2suIEluIHN1bW1hcnkgZGF0YSwgdGhpcyBpbmNsdWRlcyBhZ2dyZWdhdGlvbi5cbiAgICogTm90ZSB0aGF0IHRoZSBmaWVsZElkIGNvdWxkIGNoYW5nZSBpZiB5b3UgY2hhbmdlIHRoZSBkYXRhIHNvdXJjZS5cbiAgICogRm9yIGV4YW1wbGUgYWZ0ZXIgcmVwbGFjaW5nIHRoZSBkYXRhIHNvdXJjZSBbQ2xpcGJvYXJkXzIwMjEwMzA1VDE2NDAwMF0uW3N1bTpTYWxlczpxa10gY291bGQgYmVjb21lXG4gICAqIFtmZWRlcmF0ZWQuMTJ1c3VvcTExNzFvMWIxZWJkeWg2MGZqbmV2MV0uW3N1bTpTYWxlczpxa10uXG4gICAqL1xuICByZWFkb25seSBmaWVsZElkOiBzdHJpbmc7XG59XG4iLCJpbXBvcnQgeyBDbGFzc05hbWVLZXkgfSBmcm9tICcuL05hbWVzcGFjZXMvVGFibGVhdSc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya3NoZWV0Rm9ybWF0dGluZyB7XG4gIC8qKlxuICAgKiBAcmV0dXJucyAgQW4gYXJyYXkgb2YgZm9ybWF0dGluZyBzaGVldHMgdGhhdCBjb250YWluIHRoZSBjc3MgcHJvcGVydGllcyBmb3IgYSB3b3Jrc2hlZXQuXG4gICAqIEBzaW5jZSAxLjI5LjAgYW5kIFRhYmxlYXUgMjAyNS4zXG4gICAqL1xuICByZWFkb25seSBmb3JtYXR0aW5nU2hlZXRzOiBBcnJheTxGb3JtYXR0aW5nU2hlZXQ+O1xufVxuXG4vKipcbiAqIFRoZSBXb3JrYm9vayBmb3JtYXR0aW5nIGNvbnRhaW5zIGFuIGFycmF5IG9mIEZvcm1hdHRpbmcgc2hlZXRzLlxuICogRWFjaCBvZiB0aGVzZSBzaGVldHMgY2FuIGJlIGlkZW50aWZpZWQgYnkgdGhlIENsYXNzTmFtZUtleSBhbmRcbiAqIGNvbnRhaW5zIHRoZSBDU1MgcHJvcGVydGllcyBuZWVkZWQgdG8gbWltaWMgdGhlIGZvcm1hdHRpbmcgb24geW91ciB3b3JrYm9vay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBXb3JrYm9va0Zvcm1hdHRpbmcge1xuICAvKipcbiAgICogQHJldHVybnMgIEFuIGFycmF5IG9mIGZvcm1hdHRpbmcgc2hlZXRzIHRoYXQgY29udGFpbiB0aGUgY3NzIHByb3BlcnRpZXMgZm9yIGEgdGFibGVhdSB3b3JrYm9vay5cbiAgICogQHNpbmNlIDEuNy4wIGFuZCBUYWJsZWF1IDIwMjEuNFxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybWF0dGluZ1NoZWV0czogQXJyYXk8Rm9ybWF0dGluZ1NoZWV0Pjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGb3JtYXR0aW5nU2hlZXQge1xuICAvKipcbiAgICogQHJldHVybnMgIElzIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGEgQ2xhc3NOYW1lS2V5IHdoaWNoIHJlcHJlc2VudHMgYSB0eXBlIG9mXG4gICAqIGZvcm1hdHRpbmcgaW4gYSB3b3JrYm9vazogV29ya3NoZWV0VGl0bGUsIFdvcmtzaGVldCwgVG9vbHRpcCwgU3RvcnlUaXRsZSwgYW5kIERhc2hib2FyZFRpdGxlLlxuICAgKiBAc2luY2UgMS43LjAgYW5kIFRhYmxlYXUgMjAyMS40XG4gICAqL1xuICByZWFkb25seSBjbGFzc05hbWVLZXk6IENsYXNzTmFtZUtleTtcbiAgcmVhZG9ubHkgY3NzUHJvcGVydGllczogUmVhY3QuQ1NTUHJvcGVydGllcztcbn1cbiIsIi8vIFRoaXMgZmlsZSByZS1leHBvcnRzIGV2ZXJ5dGhpbmcgd2hpY2ggaXMgcGFydCBvZiB0aGUgc2hhcmVkIGFwaSBwdWJsaWMgaW50ZXJmYWNlXG5cbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvQW5ub3RhdGlvbkludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9EYXRhU291cmNlSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0RhdGFUYWJsZUludGVyZmFjZXMnO1xuZXhwb3J0ICogZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0L1NoYXJlZC9FbnVtcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0Vudmlyb25tZW50SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL0ZpbHRlckludGVyZmFjZXMnO1xuZXhwb3J0IHtcbiAgQW5hbHl0aWNzT2JqZWN0VHlwZSxcbiAgQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLFxuICBEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZSxcbiAgRGF0YUZvcm1hdFR5cGUsXG4gIERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlLFxuICBEaWFsb2dTdHlsZSxcbiAgRW5jb2RpbmdUeXBlLFxuICBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSxcbiAgRmlsdGVyRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbixcbiAgRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSxcbiAgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gIE1hcmtUeXBlLFxuICBOZWdhdGl2ZU51bWJlckZvcm1hdCxcbiAgTnVtYmVyRm9ybWF0VW5pdHMsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgUGVyaW9kVHlwZSxcbiAgUXVpY2tUYWJsZUNhbGNUeXBlLFxuICBSZXBsYXlTcGVlZFR5cGUsXG4gIFNlbGVjdGlvblVwZGF0ZVR5cGUsXG4gIFNlbGVjdE9wdGlvbnMsXG4gIFNoZWV0VHlwZSxcbiAgU29ydERpcmVjdGlvbixcbiAgVHJlbmRMaW5lTW9kZWxUeXBlLFxuICBab25lVmlzaWJpbGl0eVR5cGUsXG59IGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvU2VsZWN0aW9uSW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL1NoZWV0SW50ZXJmYWNlcyc7XG5leHBvcnQgKiBmcm9tICcuL0V4dGVybmFsQ29udHJhY3QvU2hhcmVkL1Zpc3VhbE1vZGVsSW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvV29ya2Jvb2tGb3JtYXR0aW5nSW50ZXJmYWNlcyc7XG4iLCIvKipcbiAqIFRoaXMgaXMgeW91ciBtYWluLiBUaGlzIGlzIHdoZXJlIHlvdSByZS1leHBvcnQgZXZlcnl0aGluZyB5b3Ugd2FudCB0byBiZSBwdWJsaWNseSBhdmFpbGFibGUuXG4gKlxuICogVGhlIGJ1aWxkIGVuZm9yY2VzIHRoYXQgdGhlIGZpbGUgaGFzIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGdsb2JhbCB2YXJpYWJsZSB0aGF0IGlzIGV4cG9ydGVkLlxuICovXG5cbi8vIEV4cG9ydCB0aGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdG8gYmUgYXZhaWxhYmxlIGF0IHJ1bnRpbWVcbi8vICBUaGlzIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IHlhcm4gcHVibGlzaDpidW1wIHZpYSBzY3JpcHRzL3B1Ymxpc2gtY2hlY2sudHNcbi8vICB1cGRhdGVJbnRlcm5hbENvbnRyYWN0UnVudGltZVZlcnNpb24gaW4gdGhlIG1vbm9yZXBvIHJvb3QuXG5pbXBvcnQgKiBhcyBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbiBmcm9tICcuLi9pbnRlcm5hbC1jb250cmFjdC12ZXJzaW9uLmpzb24nO1xuZXhwb3J0IGNvbnN0IElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04gPSBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbjtcblxuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9EYXRhVHlwZUNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L0VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvTW9kZWxzJztcbmV4cG9ydCAqIGZyb20gJy4vY29udHJhY3QvTm90aWZpY2F0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2NvbnRyYWN0L1BhcmFtZXRlcnMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb250cmFjdC9WZXJicyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9Bc2tEYXRhSW50ZXJmYWNlJztcbmV4cG9ydCAqIGZyb20gJy4vaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucyc7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9JbnRlcm5hbEFwaURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvUHVsc2VJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9pbnRlcmZhY2UvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgKiBmcm9tICcuL2ludGVyZmFjZS9WcWxJbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvQ3Jvc3NGcmFtZU1lc3Nlbmdlcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZURpc3BhdGNoZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL01lc3NhZ2VMaXN0ZW5lcic7XG5leHBvcnQgKiBmcm9tICcuL21lc3NhZ2luZy9pbnRlcmZhY2UvTWVzc2FnZVR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vbWVzc2FnaW5nL2ludGVyZmFjZS9NZXNzZW5nZXInO1xuZXhwb3J0ICogZnJvbSAnLi9tZXNzYWdpbmcvaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvZXh0ZXJuYWwvRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uaW5nL2V4dGVybmFsL0V4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9leHRlcm5hbC9FeHRlcm5hbFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5JztcbmV4cG9ydCAqIGZyb20gJy4vdmVyc2lvbmluZy9JbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5leHBvcnQgKiBmcm9tICcuL3ZlcnNpb25pbmcvVmVyc2lvbkNvbnZlcnRlckZhY3RvcnknO1xuXG4vLyBFeHBvcnQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIG1lc3NhZ2luZyBmb3IgY29uc3VtZXJzIHRvIHVzZS5cbi8vIEJlIHZlcnkgY2FyZWZ1bCBtYWtpbmcgYW55IHVwZGF0ZXMgdG8gdGhpcyBjb250cmFjdCB3aGljaCBicmVhayB2ZXJzaW9uIGNvbXBhdGliaWxpdHkuXG5leHBvcnQgY29uc3QgTUVTU0FHSU5HX1ZFUlNJT04gPSB7XG4gIG1ham9yOiAxLFxuICBtaW5vcjogMCxcbiAgZml4OiAwLFxufTtcbiIsImltcG9ydCB7IERhdGFUeXBlIH0gZnJvbSAnLi9FbnVtcyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhVHlwZUNvbnZlcnRlciB7XG4gIHByaXZhdGUgc3RhdGljIGlzU3BlY2lhbCh2YWx1ZUFzU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAvLyBQcmlvciB0byBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyBjb21lIHRvIHVzIGFzXG4gICAgLy8gJyVudWxsJScsICclYWxsJScsICcld2lsZGNhcmQlJywgJyVtaXNzaW5nJScuLi5cbiAgICAvLyBXaGlsZSB0aGlzIGZ1bmN0aW9uIHdpbGwgbmV2ZXIgcmV0dXJuIHRydWUgZm9yIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgY29udmVyc2lvbixcbiAgICAvLyBpdCBpcyBhcyBjaGVhcCBhcyBwYXNzaW5nIGFyb3VuZCBhIHZlcnNpb24gYW5kIGNoZWNraW5nIHRoYXQuXG4gICAgLy8gKFNlZSBEYXRhVmFsdWVGb3JtYXR0ZXIuY3BwKVxuXG4gICAgaWYgKHZhbHVlQXNTdHJpbmcubGVuZ3RoID4gMiAmJiB2YWx1ZUFzU3RyaW5nWzBdID09PSAnJScgJiYgdmFsdWVBc1N0cmluZ1t2YWx1ZUFzU3RyaW5nLmxlbmd0aCAtIDFdID09PSAnJScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBzcGVjaWFsVmFsdWVJbmRpY2F0b3IgPSAnJW51bGwlJztcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHByaXZhdGUgc3RhdGljIHBhcnNlQm9vbGVhbihib29sZWFuU3RyaW5nOiBzdHJpbmcpOiBib29sZWFuIHwgc3RyaW5nIHtcbiAgICAvLyBib29sZWFuIHZhbHVlcyBjb21lIHRvIHVzIGFzICd0cnVlJ3wnZmFsc2UnXG4gICAgY29uc3Qgbm9ybWFsaXplZEJvb2xlYW46IHN0cmluZyA9IGJvb2xlYW5TdHJpbmcudG9Mb3dlckNhc2UoKTtcbiAgICByZXR1cm4gbm9ybWFsaXplZEJvb2xlYW4gIT09ICd0cnVlJyAmJiBub3JtYWxpemVkQm9vbGVhbiAhPT0gJ2ZhbHNlJyA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogbm9ybWFsaXplZEJvb2xlYW4gPT09ICd0cnVlJztcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHJpdmF0ZSBzdGF0aWMgcGFyc2VOdW1iZXIodmFsdWVBc1N0cmluZzogc3RyaW5nKTogbnVtYmVyIHwgc3RyaW5nIHtcbiAgICBjb25zdCB2YWx1ZSA9IE51bWJlcih2YWx1ZUFzU3RyaW5nKTtcbiAgICByZXR1cm4gaXNOYU4odmFsdWUpID8gdGhpcy5zcGVjaWFsVmFsdWVJbmRpY2F0b3IgOiB2YWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIHBhcnNlRGF0ZShkYXRlQXNTdHJpbmc6IHN0cmluZyk6IERhdGUgfCBudWxsIHtcbiAgICAvLyBOb3RlIHRoYXQgd2l0aG91dCBhIHRpbWUsIHRoZSBkYXRlIGlzIGFzc3VtZWQgdG8gYmUgVVRDXG4gICAgLy8gSW5wdXQgb2YgMjAyMC0wMy0yNSBpcyBwcmludGVkIGFzOiBNYXIgMjQgMjAyMCAxNzowMDowMCBHTVQtMDcwMFxuICAgIC8vIFRoaXMgbWF0Y2hlcyBzdHlsZSB1c2VkIGluIGV4aXN0aW5nIGNvbnZlcnRGaWx0ZXJWYWx1ZVByZXNNb2RlbFxuICAgIGNvbnN0IHZhbHVlID0gbmV3IERhdGUoZGF0ZUFzU3RyaW5nKTtcbiAgICByZXR1cm4gTnVtYmVyLmlzTmFOKHZhbHVlLmdldFRpbWUoKSkgPyBudWxsIDogdmFsdWU7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZURhdGVUaW1lKGRhdGVBc1N0cmluZzogc3RyaW5nKTogRGF0ZSB8IG51bGwge1xuICAgIC8vIFdpdGggYSB0aW1lLCB0aGUgZGF0ZSBpcyBhc3N1bWVkIHRvIGJlIFVUQy5cbiAgICAvLyBPdXIgZGF0ZSBmb3JtYXQgaXMgYWx3YXlzOiB5eXl5LW1tLWRkIGhoOm1tOnNzXG4gICAgLy8gVW5mb3J0dW5hdGVseSwgSUUxMSBjYW4ndCBwYXJzZSB0aGF0IGZvcm1hdCBzbyB3ZSBhZGQgYSBUIGJldHdlZW4gdGhlIGRheSBhbmQgdGltZS5cbiAgICAvLyBXZSBhbHNvIGFkZCBhIFogc28gdGhhdCBpdCBpcyBVVEMuIChXaXRob3V0IHRoZSBaLCBzb21lIGJyb3dzZXJzIGFzc3VtZSBsb2NhbCwgYW5kIG90aGVycyBVVEMpXG4gICAgLy8gRXZlbiB0aG91Z2ggd2UndmUgZHJvcHBlZCBzdXBwb3J0IGZvciBJRTExLCBpdCdzIHJpc2tpZXIvY29zdGxpZXIgdG8gbWFrZSB1cGRhdGVzIGhlcmUuXG4gICAgY29uc3QgZm9ybWF0dGVkRGF0ZVN0cmluZzogc3RyaW5nID0gZGF0ZUFzU3RyaW5nLnJlcGxhY2UoJyAnLCAnVCcpLmNvbmNhdCgnWicpO1xuICAgIGNvbnN0IHZhbHVlID0gbmV3IERhdGUoZm9ybWF0dGVkRGF0ZVN0cmluZyk7XG4gICAgcmV0dXJuIE51bWJlci5pc05hTih2YWx1ZS5nZXRUaW1lKCkpID8gbnVsbCA6IHZhbHVlO1xuICB9XG5cbiAgLy8gSXQgd291bGQgYmUgbmljZSB0byBtZXJnZSB0aGlzIGFuZCB0aGUgbWV0aG9kIEZpbHRlckNvbnZlcnRlcjo6Y29udmVydEZpbHRlclZhbHVlUHJlc01vZGVsIGluIGFwaS1wbGF0Zm9ybS1qc1xuICBwdWJsaWMgc3RhdGljIGNvbnZlcnRWYWx1ZUFzU3RyaW5nVG9WYWx1ZSh2YWx1ZUFzU3RyaW5nOiBzdHJpbmcsIHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgLy8gVGhpcyBpcyBib3RoIERhdGFEaWN0aW9uYXJ5IGFuZCBTaG93RGF0YVRhYmxlUHJlc01vZGVsIGNvbXBhdGlibGUuXG4gICAgLy8gSW4gdGhlIERhdGFEaWN0aW9uYXJ5LCB2YWx1ZUFzU3RyaW5nIGNhbiBiZSAnJW51bGwlJyBvciAnJW1pc3NpbmclJywgd2hpbGUgaW5cbiAgICAvLyBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCB3ZSBjYW4gZ2V0ICdudWxsJyBvciAnbWlzc2luZycsIG9yICclbnVsbCUnIGZvciBzdHJpbmcgc3BlY2lhbCB2YWx1ZXMuXG4gICAgLy8gRm9yIGVpdGhlciBvZiB0aGVzZSBjYXNlcywgd2UgcmV0dXJuIHNwZWNpYWxWYWx1ZUluZGljYXRvciAob3IgdGhlIG9yaWdpbmFsIHNwZWNpYWwgc3RyaW5nKS5cbiAgICAvLyBUbyBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbHR5LCB0aGlzIGNvbnZlcnRlcjpcbiAgICAvLyAxLiByZXR1cm5zIGEgc3RyaW5nIGZvciBhbnkgc3BlY2lhbCB2YWx1ZXNcbiAgICAvLyAyLiByZXR1cm5zIGEgc3RyaW5nIGZvciBhbnkgZGF0ZVxuXG4gICAgLy8gUGFyYW1ldGVyIG1pbi9tYXggdmFsdWVzIGNhbiBiZSB1bmRlZmluZWQsIHNvIHJlc3VsdCBpcyBhbHNvIHVuZGVmaW5lZFxuICAgIGlmICh2YWx1ZUFzU3RyaW5nID09PSB1bmRlZmluZWQgfHwgdmFsdWVBc1N0cmluZyA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5pc1NwZWNpYWwodmFsdWVBc1N0cmluZykpIHtcbiAgICAgIHJldHVybiB2YWx1ZUFzU3RyaW5nO1xuICAgIH1cblxuICAgIHN3aXRjaCAodHlwZSkge1xuICAgICAgY2FzZSBEYXRhVHlwZS5Cb29sOlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZUJvb2xlYW4odmFsdWVBc1N0cmluZyk7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuSW50OlxuICAgICAgY2FzZSBEYXRhVHlwZS5GbG9hdDpcbiAgICAgICAgLy8gUmV0dXJuIHNwZWNpYWwgdmFsdWUgJyVudWxsJScgZm9yIGFueSBmYWlsdXJlIGluIHBhcnNpbmcuXG4gICAgICAgIC8vIFdlIG5lZWQgdG8gZG8gdGhhdCBiZWNhdXNlIFNob3dEYXRhVGFibGVQcmVzTW9kZWwgd2lsbCBnaXZlIHVzIHN0cmluZ3MgbGlrZSAnbnVsbCdcbiAgICAgICAgLy8gZm9yIHNwZWNpYWwgdmFsdWVzLlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZU51bWJlcih2YWx1ZUFzU3RyaW5nKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlOlxuICAgICAgICAvLyBGb3IgU2hvd0RhdGFUYWJsZVByZXNNb2RlbCwgc3BlY2lhbCB2YWx1ZXMgd2lsbCBiZSBcIm51bGxcIiB3aGljaCB3aWxsIGZhaWwgdG8gcGFyc2UuXG4gICAgICAgIC8vIEluIHRoYXQgY2FzZSwgd2UgcmV0dXJuICclbnVsbCUnLlxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGUodmFsdWVBc1N0cmluZykgPT09IG51bGwgPyB0aGlzLnNwZWNpYWxWYWx1ZUluZGljYXRvciA6IHZhbHVlQXNTdHJpbmc7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuRGF0ZVRpbWU6XG4gICAgICAgIC8vIEZvciBTaG93RGF0YVRhYmxlUHJlc01vZGVsLCBzcGVjaWFsIHZhbHVlcyB3aWxsIGJlIFwibnVsbFwiIHdoaWNoIHdpbGwgZmFpbCB0byBwYXJzZS5cbiAgICAgICAgLy8gSW4gdGhhdCBjYXNlLCB3ZSByZXR1cm4gJyVudWxsJSdcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlVGltZSh2YWx1ZUFzU3RyaW5nKSA9PT0gbnVsbCA/IHRoaXMuc3BlY2lhbFZhbHVlSW5kaWNhdG9yIDogdmFsdWVBc1N0cmluZztcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TcGF0aWFsOlxuICAgICAgY2FzZSBEYXRhVHlwZS5TdHJpbmc6XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gdmFsdWVBc1N0cmluZztcbiAgICB9XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSh2YWx1ZTogYW55LCB0eXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4gfCBudW1iZXIgfCBEYXRlIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVGhpcyBjb252ZXJ0cyBmcm9tIG91ciAxLjIgQVBJIHRoYXQgcmV0dXJucyBzdHJpbmdzIGZvciBzcGVjaWFscywgYW5kIGRhdGVzIGFzIHN0cmluZ3MuXG4gICAgLy8gSXQgdGFrZXMgdGhlIHNwZWNpYWwgY2FzZSBvZiAnJW51bGwlJyBhbmQgcmV0dXJucyBhIG51bGwuXG4gICAgLy8gRm9yIGRhdGVzLCBpdCByZXR1cm5zIGEgRGF0ZSBvYmplY3QgcmF0aGVyIHRoYW4gYSBzdHJpbmcuXG4gICAgLy8gY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSBzaG91bGQgYmUgdXNlZCB0byBidWlsZCBhIERhdGFWYWx1ZS5uYXRpdmVWYWx1ZSBmaWVsZC5cblxuICAgIC8vIFBhcmFtZXRlciBtaW4vbWF4IGNhbiBiZSB1bmRlZmluZWQuIElmIHRoYXQgaXMgdGhlIGNhc2UsIG5hdGl2ZVZhbHVlIGlzIHRyZWF0ZWQgbGlrZSBhIHNwZWNpYWxcbiAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCB8fCB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlIERhdGFUeXBlLkJvb2w6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gbnVsbCA6IHZhbHVlO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkludDpcbiAgICAgIGNhc2UgRGF0YVR5cGUuRmxvYXQ6XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gbnVsbCA6IHZhbHVlO1xuXG4gICAgICBjYXNlIERhdGFUeXBlLkRhdGU6XG4gICAgICAgIC8vIENvbnZlcnQgdGhlIHN0cmluZyB0byBEYXRlIG9iamVjdCAob3IgbnVsbCBpZiBwYXJzaW5nIGZhaWxzIC4uLiB3ZSBhc3N1bWUgc3BlY2lhbClcbiAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VEYXRlKHZhbHVlKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5EYXRlVGltZTpcbiAgICAgICAgLy8gQ29udmVydCB0aGUgc3RyaW5nIHRvIERhdGUgb2JqZWN0IChvciBudWxsIGlmIHBhcnNpbmcgZmFpbHMgLi4uIHdlIGFzc3VtZSBzcGVjaWFsKVxuICAgICAgICByZXR1cm4gdGhpcy5wYXJzZURhdGVUaW1lKHZhbHVlKTtcblxuICAgICAgY2FzZSBEYXRhVHlwZS5TdHJpbmc6XG4gICAgICAgIHJldHVybiB0aGlzLmlzU3BlY2lhbCh2YWx1ZSkgPyBudWxsIDogdmFsdWU7XG5cbiAgICAgIGNhc2UgRGF0YVR5cGUuU3BhdGlhbDpcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHB1YmxpYyBzdGF0aWMgY29udmVydFN0cmluZ1ZhbHVlVG9OYXRpdmVWYWx1ZSh2YWx1ZTogc3RyaW5nLCB0eXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4gfCBudW1iZXIgfCBEYXRlIHwgc3RyaW5nIHwgbnVsbCB7XG4gICAgLy8gVGhpcyBoYW5kbGVzIHRoZSBjb252ZXJzaW9uIGZyb20gc3RyaW5nIGRpcmVjdGx5IHRvIG5hdGl2ZSB2YWx1ZSBmb3IgYWxsIHR5cGVzXG4gICAgcmV0dXJuIHRoaXMuY29udmVydFZhbHVlVG9OYXRpdmVWYWx1ZSh0aGlzLmNvbnZlcnRWYWx1ZUFzU3RyaW5nVG9WYWx1ZSh2YWx1ZSwgdHlwZSksIHR5cGUpO1xuICB9XG59XG4iLCJleHBvcnQgZW51bSBFeHRlbnNpb25Db250ZXh0IHtcbiAgRGVza3RvcCA9ICdkZXNrdG9wJyxcbiAgU2VydmVyID0gJ3NlcnZlcicsXG4gIFVua25vd24gPSAndW5rbm93bicsXG4gIENsb3VkID0gJ2Nsb3VkJyxcbiAgUHVibGljV2ViID0gJ3B1YmxpYy13ZWInLFxuICBQdWJsaWNEZXNrdG9wID0gJ3B1YmxpYy1kZXNrdG9wJyxcbn1cblxuZXhwb3J0IGVudW0gRXh0ZW5zaW9uTW9kZSB7XG4gIEF1dGhvcmluZyA9ICdhdXRob3JpbmcnLFxuICBWaWV3aW5nID0gJ3ZpZXdpbmcnLFxuICBVbmtub3duID0gJ3Vua25vd24nLFxufVxuXG5leHBvcnQgZW51bSBFeHBvcnRlZE1lZGlhVHlwZSB7XG4gIEltYWdlID0gJ2ltYWdlJyxcbiAgUGRmID0gJ3BkZicsXG4gIFN2ZyA9ICdzdmcnLFxuICBIdG1sID0gJ2h0bWwnLFxuICBQb3dlclBvaW50ID0gJ3Bvd2VycG9pbnQnLFxuICBFeGNlbCA9ICdleGNlbCcsXG59XG5cbmV4cG9ydCBlbnVtIEFubm90YXRlRW51bSB7XG4gIE1hcmsgPSAnbWFyaycsXG4gIFBvaW50ID0gJ3BvaW50JyxcbiAgQXJlYSA9ICdhcmVhJyxcbn1cblxuZXhwb3J0IGVudW0gQ29sdW1uVHlwZSB7XG4gIERpc2NyZXRlID0gJ2Rpc2NyZXRlJyxcbiAgQ29udGludW91cyA9ICdjb250aW51b3VzJyxcbiAgVW5rbm93biA9ICd1bmtub3duJyxcbn1cblxuZXhwb3J0IGVudW0gRGFzaGJvYXJkT2JqZWN0VHlwZSB7XG4gIEJsYW5rID0gJ2JsYW5rJyxcbiAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG4gIFF1aWNrRmlsdGVyID0gJ3F1aWNrLWZpbHRlcicsXG4gIFBhcmFtZXRlckNvbnRyb2wgPSAncGFyYW1ldGVyLWNvbnRyb2wnLFxuICBQYWdlRmlsdGVyID0gJ3BhZ2UtZmlsdGVyJyxcbiAgTGVnZW5kID0gJ2xlZ2VuZCcsXG4gIFRpdGxlID0gJ3RpdGxlJyxcbiAgVGV4dCA9ICd0ZXh0JyxcbiAgSW1hZ2UgPSAnaW1hZ2UnLFxuICBXZWJQYWdlID0gJ3dlYi1wYWdlJyxcbiAgRXh0ZW5zaW9uID0gJ2V4dGVuc2lvbicsXG59XG5cbmV4cG9ydCBlbnVtIERhdGFUeXBlIHtcbiAgU3RyaW5nID0gJ3N0cmluZycsXG4gIEludCA9ICdpbnQnLFxuICBGbG9hdCA9ICdmbG9hdCcsXG4gIEJvb2wgPSAnYm9vbCcsXG4gIERhdGUgPSAnZGF0ZScsXG4gIERhdGVUaW1lID0gJ2RhdGUtdGltZScsXG4gIFNwYXRpYWwgPSAnc3BhdGlhbCcsXG4gIFVua25vd24gPSAndW5rbm93bicsXG59XG5cbmV4cG9ydCBlbnVtIERpYWxvZ1N0eWxlIHtcbiAgV2luZG93ID0gJ3dpbmRvdycsXG4gIE1vZGFsID0gJ21vZGFsJyxcbiAgTW9kZWxlc3MgPSAnbW9kZWxlc3MnLFxufVxuXG5leHBvcnQgZW51bSBFbmNvZGVkRGF0YVR5cGUge1xuICBOdW1iZXIgPSAnbnVtYmVyJyxcbiAgU3RyaW5nID0gJ3N0cmluZycsXG4gIERhdGUgPSAnZGF0ZScsXG4gIEJvb2xlYW4gPSAnYm9vbGVhbicsXG59XG5cbmV4cG9ydCBlbnVtIEVycm9yQ29kZXMge1xuICBJTklUSUFMSVpBVElPTl9FUlJPUiA9ICdpbml0aWFsaXphdGlvbi1lcnJvcicsXG4gIElOVEVSTkFMX0VSUk9SID0gJ2ludGVybmFsLWVycm9yJyxcbiAgTUlTU0lOR19FTlVNX01BUFBJTkcgPSAnbWlzc2luZy1lbnVtLW1hcHBpbmcnLFxuICBNSVNTSU5HX1BBUkFNRVRFUiA9ICdtaXNzaW5nLXBhcmFtZXRlcicsXG4gIFBFUk1JU1NJT05fREVOSUVEID0gJ3Blcm1pc3Npb24tZGVuaWVkJyxcbiAgUFJFU19NT0RFTF9QQVJTSU5HX0VSUk9SID0gJ3ByZXMtbW9kZWwtcGFyc2luZy1lcnJvcicsXG4gIFZFUlNJT05fTk9UX0NPTkZJR1VSRUQgPSAndmVyc2lvbi1ub3QtY29uZmlndXJlZCcsXG4gIFZJU0lCSUxJVFlfRVJST1IgPSAndmlzaWJpbGl0eS1lcnJvcicsXG4gIFVOS05PV05fVkVSQl9JRCA9ICd1bmtub3duLXZlcmItaWQnLFxufVxuXG5leHBvcnQgZW51bSBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSB7XG4gIFN1bSA9ICdzdW0nLFxuICBBdmcgPSAnYXZnJyxcbiAgTWluID0gJ21pbicsXG4gIE1heCA9ICdtYXgnLFxuICBTdGRldiA9ICdzdGRldicsXG4gIFN0ZGV2cCA9ICdzdGRldnAnLFxuICBWYXIgPSAndmFyJyxcbiAgVmFycCA9ICd2YXJwJyxcbiAgQ29sbGVjdCA9ICdjb2xsZWN0JyxcbiAgQ291bnQgPSAnY291bnQnLFxuICBDb3VudGQgPSAnY291bnRkJyxcbiAgTWVkaWFuID0gJ21lZGlhbicsXG4gIEF0dHIgPSAnYXR0cicsXG4gIE5vbmUgPSAnbm9uZScsXG4gIFllYXIgPSAneWVhcicsXG4gIFF0ciA9ICdxdHInLFxuICBNb250aCA9ICdtb250aCcsXG4gIERheSA9ICdkYXknLFxuICBIb3VyID0gJ2hvdXInLFxuICBNaW51dGUgPSAnbWludXRlJyxcbiAgU2Vjb25kID0gJ3NlY29uZCcsXG4gIFdlZWsgPSAnd2VlaycsXG4gIFdlZWtkYXkgPSAnd2Vla2RheScsXG4gIE1vbnRoWWVhciA9ICdtb250aC15ZWFyJyxcbiAgTWR5ID0gJ21keScsXG4gIEVuZCA9ICdlbmQnLFxuICBUcnVuY1llYXIgPSAndHJ1bmMteWVhcicsXG4gIFRydW5jUXRyID0gJ3RydW5jLXF0cicsXG4gIFRydW5jTW9udGggPSAndHJ1bmMtbW9udGgnLFxuICBUcnVuY1dlZWsgPSAndHJ1bmMtd2VlaycsXG4gIFRydW5jRGF5ID0gJ3RydW5jLWRheScsXG4gIFRydW5jSG91ciA9ICd0cnVuYy1ob3VyJyxcbiAgVHJ1bmNNaW51dGUgPSAndHJ1bmMtbWludXRlJyxcbiAgVHJ1bmNTZWNvbmQgPSAndHJ1bmMtc2Vjb25kJyxcbiAgUXVhcnQxID0gJ3F1YXJ0MScsXG4gIFF1YXJ0MyA9ICdxdWFydDMnLFxuICBTa2V3bmVzcyA9ICdza2V3bmVzcycsXG4gIEt1cnRvc2lzID0gJ2t1cnRvc2lzJyxcbiAgSW5PdXQgPSAnaW4tb3V0JyxcbiAgVXNlciA9ICd1c2VyJyxcbn1cblxuZXhwb3J0IGVudW0gRmllbGRSb2xlVHlwZSB7XG4gIERpbWVuc2lvbiA9ICdkaW1lbnNpb24nLFxuICBNZWFzdXJlID0gJ21lYXN1cmUnLFxuICBVbmtub3duID0gJ3Vua25vd24nLFxufVxuXG4vKipcbiAqICBUaGUgZGlmZmVyZW50IHVwZGF0ZSB0eXBlcyBmb3IgYXBwbHlpbmcgZmlsdGVyLlxuICovXG5leHBvcnQgZW51bSBGaWx0ZXJVcGRhdGVUeXBlIHtcbiAgQWRkID0gJ2FkZCcsXG4gIEFsbCA9ICdhbGwnLFxuICBSZXBsYWNlID0gJ3JlcGxhY2UnLFxuICBSZW1vdmUgPSAncmVtb3ZlJyxcbn1cblxuZXhwb3J0IGVudW0gU2hlZXRUeXBlIHtcbiAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gIFN0b3J5ID0gJ3N0b3J5JyxcbiAgV29ya3NoZWV0ID0gJ3dvcmtzaGVldCcsXG59XG5cbmV4cG9ydCBlbnVtIERvbWFpblJlc3RyaWN0aW9uVHlwZSB7XG4gIEFsbCA9ICdhbGwnLFxuICBMaXN0ID0gJ2xpc3QnLFxuICBSYW5nZSA9ICdyYW5nZScsXG59XG5cbmV4cG9ydCBlbnVtIERhdGVTdGVwUGVyaW9kIHtcbiAgWWVhcnMgPSAneWVhcnMnLFxuICBRdWFydGVycyA9ICdxdWFydGVycycsXG4gIE1vbnRocyA9ICdtb250aHMnLFxuICBXZWVrcyA9ICd3ZWVrcycsXG4gIERheXMgPSAnZGF5cycsXG4gIEhvdXJzID0gJ2hvdXJzJyxcbiAgTWludXRlcyA9ICdtaW51dGVzJyxcbiAgU2Vjb25kcyA9ICdzZWNvbmRzJyxcbiAgSXNvWWVhcnMgPSAnaXNvLXllYXJzJyxcbiAgSXNvUXVhcnRlcnMgPSAnaXNvLXF1YXJ0ZXJzJyxcbiAgSXNvV2Vla3MgPSAnaXNvLXdlZWtzJyxcbn1cblxuLyoqXG4gKiBUaGUgb3B0aW9uIGZvciBzcGVjaWZ5aW5nIHdoaWNoIHZhbHVlcyB0byBpbmNsdWRlIGZvciBmaWx0ZXJpbmcuXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlck51bGxPcHRpb24ge1xuICBOdWxsVmFsdWVzID0gJ251bGx2YWx1ZXMnLFxuICBOb25OdWxsVmFsdWVzID0gJ25vbm51bGx2YWx1ZXMnLFxuICBBbGxWYWx1ZXMgPSAnYWxsdmFsdWVzJyxcbn1cblxuLyoqXG4gKiBUaGUgdHlwZSBvZiBmaWx0ZXIgZG9tYWluXG4gKi9cbmV4cG9ydCBlbnVtIEZpbHRlckRvbWFpblR5cGUge1xuICBSZWxldmFudCA9ICdyZWxldmFudCcsXG4gIERhdGFiYXNlID0gJ2RhdGFiYXNlJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Rpb24gdHlwZSBmb3Igc2VsZWN0IG1hcmtzIGFwaS5cbiAqL1xuZXhwb3J0IGVudW0gU2VsZWN0aW9uVXBkYXRlVHlwZSB7XG4gIFJlcGxhY2UgPSAnc2VsZWN0LXJlcGxhY2UnLFxuICBBZGQgPSAnc2VsZWN0LWFkZCcsXG4gIFJlbW92ZSA9ICdzZWxlY3QtcmVtb3ZlJyxcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCBlbnVtIGZvciBzcGVjaWZ5aW5nIHRoZSBzZWxlY3Qgb3B0aW9uIGZvciB0aGUgc2VsZWN0IHR1cGxlcyBhcGkuXG4gKi9cbmV4cG9ydCBlbnVtIFNlbGVjdE9wdGlvbnMge1xuICBTaW1wbGUgPSAnc2VsZWN0LW9wdGlvbnMtc2ltcGxlJyxcbiAgVG9nZ2xlID0gJ3NlbGVjdC1vcHRpb25zLXRvZ2dsZScsXG4gIE1lbnUgPSAnc2VsZWN0LW9wdGlvbnMtbWVudScsIC8vIG5vdCBpbXBsZW1lbnRlZCBpbiB0aGUgZXh0ZXJuYWwgY29udHJhY3RcbiAgUmFuZ2UgPSAnc2VsZWN0LW9wdGlvbnMtcmFuZ2UnLCAvLyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dGVybmFsIGNvbnRyYWN0XG4gIFNlYXJjaCA9ICdzZWxlY3Qtb3B0aW9ucy1zZWFyY2gnLCAvLyBub3QgaW1wbGVtZW50ZWQgaW4gdGhlIGV4dGVybmFsIGNvbnRyYWN0XG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgaW5jbHVkZWQgdmFsdWVzIHR5cGUgZm9yIHJhbmdlIHNlbGVjdGlvbi5cbiAqL1xuZXhwb3J0IGVudW0gUXVhbnRpdGF0aXZlSW5jbHVkZWRWYWx1ZXMge1xuICBJbmNsdWRlTnVsbCA9ICdpbmNsdWRlLW51bGwnLFxuICBJbmNsdWRlTm9uTnVsbCA9ICdpbmNsdWRlLW5vbi1udWxsJyxcbiAgSW5jbHVkZUFsbCA9ICdpbmNsdWRlLWFsbCcsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyBhIGhpZXJhcmNoaWNhbCBsZXZlbCBzZWxlY3Rpb24gc3RhdGUuXG4gKi9cbmV4cG9ydCBlbnVtIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUge1xuICBBbGxTZWxlY3RlZCA9ICdhbGwtc2VsZWN0ZWQnLFxuICBOb25lU2VsZWN0ZWQgPSAnbm9uZS1zZWxlY3RlZCcsXG4gIFNvbWVTZWxlY3RlZCA9ICdzb21lLXNlbGVjdGVkJyxcbiAgVW5rbm93blNlbGVjdGVkID0gJ3Vua25vd24tc2VsZWN0ZWQnLFxufVxuXG4vKipcbiAqIFR5cGUgb2YgbWFyayBmb3IgYSBnaXZlbiBtYXJrcyBjYXJkIGluIGEgdml6LlxuICovXG5leHBvcnQgZW51bSBNYXJrVHlwZSB7XG4gIEJhciA9ICdiYXInLFxuICBMaW5lID0gJ2xpbmUnLFxuICBBcmVhID0gJ2FyZWEnLFxuICBTcXVhcmUgPSAnc3F1YXJlJyxcbiAgQ2lyY2xlID0gJ2NpcmNsZScsXG4gIFNoYXBlID0gJ3NoYXBlJyxcbiAgVGV4dCA9ICd0ZXh0JyxcbiAgTWFwID0gJ21hcCcsXG4gIFBpZSA9ICdwaWUnLFxuICBHYW50dEJhciA9ICdnYW50dC1iYXInLFxuICBQb2x5Z29uID0gJ3BvbHlnb24nLFxuICBIZWF0bWFwID0gJ2hlYXRtYXAnLFxuICBWaXpFeHRlbnNpb24gPSAndml6LWV4dGVuc2lvbicsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgdHlwZSBvZiBmaWx0ZXJcbiAqL1xuZXhwb3J0IGVudW0gRmlsdGVyVHlwZSB7XG4gIENhdGVnb3JpY2FsID0gJ2NhdGVnb3JpY2FsJyxcbiAgUmFuZ2UgPSAncmFuZ2UnLFxuICBSZWxhdGl2ZURhdGUgPSAncmVsYXRpdmVEYXRlJyxcbiAgSGllcmFyY2hpY2FsID0gJ2hpZXJhcmNoaWNhbCcsXG59XG5cbi8qKlxuICogSW50ZXJuYWwgZW51bSBmb3Igc3BlY2lmeWluZyB0aGUgRGF0ZVJhbmdlVHlwZSBvZiBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyXG4gKi9cbmV4cG9ydCBlbnVtIERhdGVSYW5nZVR5cGUge1xuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBsYXN0IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTGFzdCA9ICdsYXN0JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbGFzdCBOIGRheXMsIHdlZWtzLCBtb250aHMsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTGFzdE4gPSAnbGFzdE4nLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBuZXh0IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTmV4dCA9ICduZXh0JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byB0aGUgbmV4dCBOIGRheXMsIHdlZWtzLCBtb250aHMsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgTmV4dE4gPSAnbmV4dE4nLFxuICAvKipcbiAgICogUmVmZXJzIHRvIHRoZSBjdXJyZW50IGRheSwgd2VlaywgbW9udGgsIGV0Yy4gb2YgdGhlIGRhdGUgcGVyaW9kLlxuICAgKi9cbiAgQ3VycmVudCA9ICdjdXJyZW50JyxcbiAgLyoqXG4gICAqIFJlZmVycyB0byBldmVyeXRoaW5nIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGN1cnJlbnQgZGF5LCB3ZWVrLCBtb250aCwgZXRjLiBvZiB0aGUgZGF0ZSBwZXJpb2QuXG4gICAqL1xuICBUb0RhdGUgPSAndG9EYXRlJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGRldGVybWluZSBpZiB0aGUgbGF1bmNoaW5nIG9mIGFuIGV4dGVuc2lvbiBkaWFsb2cgc3VjY2VlZGVkIG9yIGZhaWxlZC5cbiAqL1xuZXhwb3J0IGVudW0gRXh0ZW5zaW9uRGlhbG9nUmVzdWx0IHtcbiAgRGlhbG9nQWxyZWFkeU9wZW4gPSAnZGlhbG9nLWFscmVhZHktb3BlbicsXG4gIEludmFsaWREb21haW4gPSAnaW52YWxpZC1kb21haW4nLFxuICBTdWNjZXNzID0gJ3N1Y2Nlc3MnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gb3B0aW1pemUgdGhlIGdldFN1bW1hcnlEYXRhL2dldFVuZGVybHlpbmdUYWJsZURhdGEgcmVzdWx0c1xuICogTWFwcGVkIGZyb20gZXh0ZXJuYWwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb25cbiAqL1xuZXhwb3J0IGVudW0gQXBpU2hvd0RhdGFUYWJsZUZvcm1hdCB7XG4gIE5hdGl2ZVZhbHVlc09ubHkgPSAnbmF0aXZlLXZhbHVlcy1vbmx5JyxcbiAgRm9ybWF0dGVkVmFsdWVzT25seSA9ICdmb3JtYXR0ZWQtdmFsdWVzLW9ubHknLFxuICBOYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMgPSAnbmF0aXZlLWFuZC1mb3JtYXR0ZWQtdmFsdWVzJyxcbn1cblxuLyoqXG4gKiBVc2VkIHRvIGRlbm90ZSB0aGUgc2VjdGlvbnMgb2YgZm9ybWF0dGluZyB3aXRoaW4gdGFibGVhdVxuICovXG5leHBvcnQgY29uc3QgZW51bSBDbGFzc05hbWVLZXkge1xuICBXb3Jrc2hlZXRUaXRsZSA9ICd0YWJsZWF1LXdvcmtzaGVldC10aXRsZScsXG4gIFdvcmtzaGVldCA9ICd0YWJsZWF1LXdvcmtzaGVldCcsXG4gIFRvb2x0aXAgPSAndGFibGVhdS10b29sdGlwJyxcbiAgU3RvcnlUaXRsZSA9ICd0YWJsZWF1LXN0b3J5LXRpdGxlJyxcbiAgRGFzaGJvYXJkVGl0bGUgPSAndGFibGVhdS1kYXNoYm9hcmQtdGl0bGUnLFxuICBQYW5lID0gJ3RhYmxlYXUtcGFuZScsXG4gIFJvd0RpdmlkZXJzID0gJ3RhYmxlYXUtcm93LWRpdmlkZXJzJyxcbiAgQ29sdW1uRGl2aWRlcnMgPSAndGFibGVhdS1jb2x1bW4tZGl2aWRlcnMnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gc2V0IHBhZ2Ugc2l6ZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBQYWdlU2l6ZU9wdGlvbiB7XG4gIExldHRlciA9ICdsZXR0ZXInLFxuICBMZWdhbCA9ICdsZWdhbCcsXG4gIE5vdGUgPSAnbm90ZScsXG4gIEZvbGlvID0gJ2ZvbGlvJyxcbiAgVGFibG9pZCA9ICd0YWJsb2lkJyxcbiAgTGVkZ2VyID0gJ2xlZGdlcicsXG4gIFN0YXRlbWVudCA9ICdzdGF0ZW1lbnQnLFxuICBFeGVjdXRpdmUgPSAnZXhlY3V0aXZlJyxcbiAgQTMgPSAnYTMnLFxuICBBNCA9ICdhNCcsXG4gIEE1ID0gJ2E1JyxcbiAgQjQgPSAnYjQnLFxuICBCNSA9ICdiNScsXG4gIFF1YXJ0byA9ICdxdWFydG8nLFxuICBVbnNwZWNpZmllZCA9ICd1bnNwZWNpZmllZCcsXG59XG5cbi8qKlxuICogVXNlZCB0byBzZXQgdGhlIHBhZ2Ugb3JpZW50YXRpb24gbW9kZSBmb3IgZXhwb3J0IGxheW91dCBvcHRpb25zLlxuICovXG5leHBvcnQgZW51bSBQYWdlT3JpZW50YXRpb24ge1xuICBQcmludGVyID0gJ3ByaW50ZXInLFxuICBQb3J0cmFpdCA9ICdwb3J0cmFpdCcsXG4gIExhbmRzY2FwZSA9ICdsYW5kc2NhcGUnLFxufVxuXG4vKipcbiAqIFVzZWQgdG8gc2V0IHNjYWxlIG1vZGUgZm9yIGV4cG9ydCBsYXlvdXQgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGVudW0gU2NhbGVNb2RlIHtcbiAgU2NhbGVBdXRvID0gJ2F1dG8nLFxuICBTY2FsZVBlcmNlbnRhZ2UgPSAncGVyY2VudCcsXG4gIFNjYWxlRml0UGFnZXMgPSAnZml0LXBhZ2VzJyxcbn1cblxuLyoqXG4gKiBVc2VkIGJ5IHNldEZpdEFuZFNjYWxlVmFsdWVzIHRvIHNjYWxlIHBlcmNlbnQgdmFsdWVzXG4gKi9cbmV4cG9ydCBlbnVtIFBhZ2VTY2FsaW5nT3B0aW9uIHtcbiAgU2NhbGVQY3RBdXRvID0gJ2F1dG8nLFxuICBTY2FsZVBjdDQwMCA9ICdwY3Q0MDAnLFxuICBTY2FsZVBjdDIwMCA9ICdwY3QyMDAnLFxuICBTY2FsZVBjdDEwMCA9ICdwY3QxMDAnLFxuICBTY2FsZVBjdDkwID0gJ3BjdDkwJyxcbiAgU2NhbGVQY3Q4MCA9ICdwY3Q4MCcsXG4gIFNjYWxlUGN0NzUgPSAncGN0NzUnLFxuICBTY2FsZVBjdDYwID0gJ3BjdDYwJyxcbiAgU2NhbGVQY3Q1MCA9ICdwY3Q1MCcsXG4gIFNjYWxlUGN0MjUgPSAncGN0MjUnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgc2V0Rml0QW5kU2NhbGVWYWx1ZXMgdG8gc2NhbGUgZml0IHBhZ2UgdmFsdWVzXG4gKi9cbmV4cG9ydCBlbnVtIEZpdFBhZ2VzIHtcbiAgRml0T25lSGlnaCA9ICdmaXQweDEnLFxuICBGaXRUd29IaWdoID0gJ2ZpdDB4MicsXG4gIEZpdE9uZVdpZGUgPSAnZml0MXgwJyxcbiAgRml0VHdvV2lkZSA9ICdmaXQyeDAnLFxufVxuXG4vKipcbiAqIFVzZWQgYnkgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jXG4gKi9cbmV4cG9ydCBlbnVtIEVuY29kaW5nVHlwZSB7XG4gIENvbG9yID0gJ2NvbG9yJyxcbiAgU2l6ZSA9ICdzaXplJyxcbiAgTGFiZWwgPSAnbGFiZWwnLFxuICBEZXRhaWwgPSAnZGV0YWlsJyxcbiAgVG9vbHRpcCA9ICd0b29sdGlwJyxcbiAgU2hhcGUgPSAnc2hhcGUnLFxuICBQYXRoID0gJ3BhdGgnLFxuICBBbmdsZSA9ICdhbmdsZScsXG4gIEdlb21ldHJ5ID0gJ2dlb21ldHJ5JyxcbiAgQ3VzdG9tID0gJ2N1c3RvbScsXG59XG5cbmV4cG9ydCBlbnVtIFB1bHNlVGltZURpbWVuc2lvbiB7XG4gIFRvZGF5ID0gJ1RvZGF5JyxcbiAgWWVzdGVyZGF5ID0gJ1llc3RlcmRheScsXG4gIFdlZWtUb0RhdGUgPSAnV2Vla1RvRGF0ZScsXG4gIExhc3RXZWVrID0gJ0xhc3RXZWVrJyxcbiAgTW9udGhUb0RhdGUgPSAnTW9udGhUb0RhdGUnLFxuICBMYXN0TW9udGggPSAnTGFzdE1vbnRoJyxcbiAgUXVhcnRlclRvRGF0ZSA9ICdRdWFydGVyVG9EYXRlJyxcbiAgTGFzdFF1YXJ0ZXIgPSAnTGFzdFF1YXJ0ZXInLFxuICBZZWFyVG9EYXRlID0gJ1llYXJUb0RhdGUnLFxuICBMYXN0WWVhciA9ICdMYXN0WWVhcicsXG59XG5cbmV4cG9ydCBlbnVtIFB1bHNlRXJyb3JNZXNzYWdlVmlzaWJpbGl0eSB7XG4gIFZpc2libGUgPSAndmlzaWJsZScsXG4gIEhpZGRlbiA9ICdoaWRkZW4nLFxuICBTdXBwcmVzc2VkID0gJ3N1cHByZXNzZWQnLFxufVxuXG5leHBvcnQgZW51bSBEYXRhRm9ybWF0VHlwZSB7XG4gIEF1dG9Gb3JtYXQgPSAnYXV0by1mb3JtYXQnLFxuICBTeXN0ZW1OdW1iZXIgPSAnc3lzdGVtLW51bWJlcicsXG4gIFN5c3RlbUN1cnJlbmN5ID0gJ3N5c3RlbS1jdXJyZW5jeScsXG4gIFN5c3RlbUxvbmdEYXRlID0gJ3N5c3RlbS1sb25nLWRhdGUnLFxuICBTeXN0ZW1TaG9ydERhdGUgPSAnc3lzdGVtLXNob3J0LWRhdGUnLFxuICBTeXN0ZW1UaW1lID0gJ3N5c3RlbS10aW1lJyxcbiAgQ3VzdG9tID0gJ2N1c3RvbScsXG4gIEN1c3RvbU51bWJlciA9ICdjdXN0b20tbnVtYmVyJyxcbiAgQ3VzdG9tQ3VycmVuY3kgPSAnY3VzdG9tLWN1cnJlbmN5JyxcbiAgQ3VzdG9tU2NpZW50aWZpYyA9ICdjdXN0b20tc2NpZW50aWZpYycsXG4gIEN1c3RvbVBlcmNlbnRhZ2UgPSAnY3VzdG9tLXBlcmNlbnRhZ2UnLFxufVxuXG5leHBvcnQgZW51bSBOdW1iZXJGb3JtYXRVbml0cyB7XG4gIE5vbmUgPSAndW5pdHMtbm9uZScsXG4gIFRob3VzYW5kcyA9ICd1bml0cy10aG91c2FuZHMnLFxuICBNaWxsaW9ucyA9ICd1bml0cy1taWxsaW9ucycsXG4gIEJpbGxpb25zRW5nbGlzaCA9ICd1bml0cy1iaWxsaW9ucy1lbmdsaXNoJyxcbiAgQmlsbGlvbnNTdGFuZGFyZCA9ICd1bml0cy1iaWxsaW9ucy1zdGFuZGFyZCcsXG59XG5cbmV4cG9ydCBlbnVtIE5lZ2F0aXZlTnVtYmVyRm9ybWF0IHtcbiAgQXV0b21hdGljID0gJ2F1dG9tYXRpYycsXG4gIFBhcmVudGhlc2VzID0gJ3BhcmVudGhlc2VzJyxcbiAgT3V0ZXJQcmVmaXggPSAnb3V0ZXItcHJlZml4JyxcbiAgT3V0ZXJTdWZmaXggPSAnb3V0ZXItc3VmZml4JyxcbiAgSW5uZXJQcmVmaXggPSAnaW5uZXItcHJlZml4JyxcbiAgSW5uZXJTdWZmaXggPSAnaW5uZXItc3VmZml4Jyxcbn1cbiIsImltcG9ydCB7IERhdGFGb3JtYXRUeXBlLCBOZWdhdGl2ZU51bWJlckZvcm1hdCwgTnVtYmVyRm9ybWF0VW5pdHMsIFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0ICogYXMgRW51bXMgZnJvbSAnLi9FbnVtcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWwge31cblxuZXhwb3J0IGludGVyZmFjZSBGaWx0ZXJhYmxlTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIC8vIFVzZWQgZm9yIGV2ZW50IG1vZGVscyB0aGF0IHNob3VsZCBiZSBmaWx0ZXJlZCBvbiB0aGUgY2xpZW50IHNpZGUuXG4gIC8vIFRoaXMgcHJldmVudHMgZXh0ZW5zaW9ucyBmcm9tIHNlZWluZyBldmVudHMgcmVsZXZhbnQgb25seSB0byBhbm90aGVyIGV4dGVuc2lvblxuICAvLyAoZm9yIGV4YW1wbGUsIGEgc2V0dGluZ3MgY2hhbmdlZCBldmVudCkuICBOb3RlOiB0aGlzIGRvZXMgbm90IHByb3RlY3QgYWdhaW5zdFxuICAvLyBhbiBleHRlbnNpb24gbW9kaWZ5aW5nIG91ciBsaWJyYXJ5IGFuZCBzZWVpbmcgZXZlbnRzIGZvciBvdGhlciBleHRlbnNpb25zLCBzbyBkb1xuICAvLyBub3QgdHJlYXQgdGhpcyBhcyBhIHNlY3VyaXR5IG1lYXN1cmUuICBJZiB0aGVyZSBhcmUgZXZlbnRzIHRoYXQgbXVzdCBiZSBwcm90ZWN0ZWRcbiAgLy8gZnJvbSBsZWFraW5nIGJldHdlZW4gZXh0ZW5zaW9ucywgdGhhdCBtdXN0IGJlIGRvbmUgYXQgdGhlIGMrKyBsYXllci5cbiAgZmlsdGVyQnlMb2NhdG9yOiBib29sZWFuO1xuICBsb2NhdG9yOiBFeHRlbnNpb25Mb2NhdG9yO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlcmFibGVCeURpYWxvZ01vZGVsIGV4dGVuZHMgRmlsdGVyYWJsZU1vZGVsIHtcbiAgZmlsdGVyQnlEaWFsb2c6IGJvb2xlYW47XG4gIHRhcmdldERpYWxvZ1VybD86IHN0cmluZztcbn1cblxuLy8vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vLy8gV29ya2Jvb2sgT2JqZWN0XG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIFNoZWV0UGF0aCBleHRlbmRzIE1vZGVsIHtcbiAgc2hlZXROYW1lOiBzdHJpbmc7XG4gIGlzRGFzaGJvYXJkOiBib29sZWFuO1xuICBzdG9yeWJvYXJkPzogc3RyaW5nO1xuICBmbGlwYm9hcmRab25lSUQ/OiBudW1iZXI7XG4gIHN0b3J5UG9pbnRJRD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWaXN1YWxJZCBleHRlbmRzIE1vZGVsIHtcbiAgd29ya3NoZWV0OiBzdHJpbmc7XG4gIGRhc2hib2FyZD86IHN0cmluZztcbiAgc3Rvcnlib2FyZD86IHN0cmluZztcbiAgZmxpcGJvYXJkWm9uZUlEPzogbnVtYmVyO1xuICBzdG9yeVBvaW50SUQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkWm9uZSBleHRlbmRzIE1vZGVsIHtcbiAgbmFtZTogc3RyaW5nO1xuICB6b25lSWQ6IG51bWJlcjtcbiAgem9uZVR5cGU6IEVudW1zLkRhc2hib2FyZE9iamVjdFR5cGU7XG4gIGhlaWdodDogbnVtYmVyO1xuICB3aWR0aDogbnVtYmVyO1xuICB4OiBudW1iZXI7XG4gIHk6IG51bWJlcjtcbiAgc2hlZXRJbmZvPzogU2hlZXRJbmZvO1xuICBpc0Zsb2F0aW5nPzogYm9vbGVhbjsgLy8gYWRkZWQgaW4gdmVyc2lvbiAxLjYuMFxuICBpc1Zpc2libGU/OiBib29sZWFuOyAvLyBhZGRlZCBpbiB2ZXJzaW9uIDEuNi4wXG4gIGZpZWxkSWQ/OiBzdHJpbmc7IC8vIGZpZWxkIElEIGdpdmVuIG9ubHkgd2hlbiB6b25lVHlwZSBpcyBGaWx0ZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGVldEluZm8gZXh0ZW5kcyBNb2RlbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgc2hlZXRUeXBlOiBFbnVtcy5TaGVldFR5cGU7XG4gIHVybD86IHN0cmluZzsgLy8gY3VycmVudGx5IHVzZWQgb25seSBieSBFbWJlZGRpbmdcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRpbmdTaGVldEluZm8gZXh0ZW5kcyBTaGVldEluZm8ge1xuICBzaXplQ29uc3RyYWludDogU2l6ZUNvbnN0cmFpbnQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29udGFpbmVkU2hlZXRJbmZvTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgc2hlZXRUeXBlOiBFbnVtcy5TaGVldFR5cGUuRGFzaGJvYXJkIHwgRW51bXMuU2hlZXRUeXBlLldvcmtzaGVldDsgLy8gQ29udGFpbmVkIHNoZWV0IGNhbm5vdCBiZSBhIHN0b3J5XG4gIGRhc2hib2FyZFpvbmVzOiBBcnJheTxEYXNoYm9hcmRab25lPjtcbiAgem9uZUlkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUGFyYW1ldGVySW5mbyBleHRlbmRzIE1vZGVsIHtcbiAgbmFtZTogc3RyaW5nO1xuICBmaWVsZE5hbWU6IHN0cmluZztcbiAgZGF0YVR5cGU6IEVudW1zLkRhdGFUeXBlO1xuICBjdXJyZW50VmFsdWU6IERhdGFWYWx1ZTtcbiAgYWxsb3dhYmxlVmFsdWVzVHlwZTogRW51bXMuRG9tYWluUmVzdHJpY3Rpb25UeXBlO1xuICBhbGxvd2FibGVWYWx1ZXM/OiBBcnJheTxEYXRhVmFsdWU+O1xuICBtaW5WYWx1ZT86IERhdGFWYWx1ZTtcbiAgbWF4VmFsdWU/OiBEYXRhVmFsdWU7XG4gIHN0ZXBTaXplPzogbnVtYmVyO1xuICBkYXRlU3RlcFBlcmlvZD86IEVudW1zLkRhdGVTdGVwUGVyaW9kO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSBleHRlbmRzIE1vZGVsIHtcbiAgZGFzaGJvYXJkT2JqZWN0SUQ6IG51bWJlcjtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuZXhwb3J0IGludGVyZmFjZSBGb250TmFtZUFuZEluZm8gZXh0ZW5kcyBNb2RlbCB7XG4gIGZvbnROYW1lOiBzdHJpbmc7XG4gIGZvbnRCaW5hcnlJbmZvOiBVaW50OEFycmF5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpcnN0Vml6U2l6ZUtub3duRXZlbnQgZXh0ZW5kcyBNb2RlbCB7XG4gIHNoZWV0U2l6ZTogU2l6ZUNvbnN0cmFpbnQ7XG4gIGNocm9tZUhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpcnN0UHVsc2VNZXRyaWNTaXplS25vd25FdmVudCBleHRlbmRzIE1vZGVsIHtcbiAgd2lkdGg6IG51bWJlcjtcbiAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmlsdGVyRXZlbnQgZXh0ZW5kcyBNb2RlbCB7XG4gIGZpZWxkTmFtZTogc3RyaW5nO1xuICB2aXN1YWxJZDogVmlzdWFsSWQ7XG4gIGZpZWxkSWQ/OiBzdHJpbmc7IC8vIEZpZWxkSWQgd2lsbCBiZSB1bmRlZmluZWQgaW4gb2xkZXIgdGFibGVhdSBzZXJ2ZXJzLlxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFN1bW1hcnlEYXRhRXZlbnQgZXh0ZW5kcyBNb2RlbCB7XG4gIHZpc3VhbElkOiBWaXN1YWxJZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDdXN0b21NYXJrQ2xpY2tlZENvbnRleHRNZW51RXZlbnQgZXh0ZW5kcyBNb2RlbCB7XG4gIHZpc3VhbElkOiBWaXN1YWxJZDtcbiAgY29udGV4dE1lbnVJZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERpYWxvZ1VwZGF0ZUV2ZW50IGV4dGVuZHMgRmlsdGVyYWJsZUJ5RGlhbG9nTW9kZWwge1xuICBpc0Nsb3NlRXZlbnQ6IGJvb2xlYW47XG4gIGNsb3NlUGF5bG9hZD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEaWFsb2dNZXNzYWdlRXZlbnQgZXh0ZW5kcyBGaWx0ZXJhYmxlQnlEaWFsb2dNb2RlbCB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgc291cmNlRGlhbG9nVXJsPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbnRleHRNZW51RXZlbnQgZXh0ZW5kcyBGaWx0ZXJhYmxlTW9kZWwge1xuICBpZDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldHRpbmdzRXZlbnQgZXh0ZW5kcyBGaWx0ZXJhYmxlTW9kZWwge1xuICBuZXdTZXR0aW5nczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXNoYm9hcmRMYXlvdXRFdmVudCBleHRlbmRzIEZpbHRlcmFibGVNb2RlbCB7XG4gIHpvbmVzOiBBcnJheTxEYXNoYm9hcmRab25lPjtcbiAgYWN0aXZlWm9uZUlkPzogbnVtYmVyO1xuICBhY3RpdmVEYXNoYm9hcmROYW1lPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xiYXJTdGF0ZUV2ZW50IGV4dGVuZHMgTW9kZWwge1xuICB0b29sYmFyU3RhdGU6IFRvb2xiYXJTdGF0ZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZUZpbHRlcnNDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBNb2RlbCB7XG4gIGZpZWxkTmFtZXM6IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHVsc2VNZXRyaWNTaXplQ2hhbmdlZEV2ZW50IGV4dGVuZHMgTW9kZWwge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZUluc2lnaHREaXNjb3ZlcmVkRXZlbnQgZXh0ZW5kcyBNb2RlbCB7XG4gIGlkOiBzdHJpbmc7XG4gIGNoYXJhY3Rlcml6YXRpb246IHN0cmluZztcbiAgbWFya3VwOiBzdHJpbmc7XG4gIHF1ZXN0aW9uOiBzdHJpbmc7XG4gIHNjb3JlOiBudW1iZXI7XG4gIHR5cGU6IHN0cmluZztcbiAgdmVyc2lvbjogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFB1bHNlVXJsQ2hhbmdlZEV2ZW50IGV4dGVuZHMgTW9kZWwge1xuICBvbGRVcmw6IHN0cmluZztcbiAgbmV3VXJsOiBzdHJpbmc7XG4gIGNvbnRleHQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZVRpbWVEaW1lbnNpb25DaGFuZ2VkRXZlbnQgZXh0ZW5kcyBNb2RlbCB7XG4gIHRpbWVEaW1lbnNpb246IEVudW1zLlB1bHNlVGltZURpbWVuc2lvbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQdWxzZUVycm9yRXZlbnQgZXh0ZW5kcyBNb2RlbCB7XG4gIG1lc3NhZ2U6IHN0cmluZztcbiAgaHR0cFN0YXR1czogbnVtYmVyO1xuICBtZXNzYWdlVmlzaWJpbGl0eTogRW51bXMuUHVsc2VFcnJvck1lc3NhZ2VWaXNpYmlsaXR5O1xufVxuXG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8vLyBEYXRhIFRhYmxlc1xuLy8vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhVmFsdWUge1xuICAvLyBUaGVzZSBhcmUgb3B0aW9uYWwgYmVjYXVzZSBvZiBTaG93RGF0YVRhYmxlRm9ybWF0IG9wdGlvbnNcbiAgLyogdHNsaW50OmRpc2FibGU6bm8tYW55ICovXG4gIHZhbHVlPzogYW55O1xuICAvKiB0c2xpbnQ6ZW5hYmxlOm5vLWFueSAqL1xuICBmb3JtYXR0ZWRWYWx1ZT86IHN0cmluZztcbiAgYWxpYXNlZFZhbHVlPzogc3RyaW5nO1xuICBoYXNBbGlhcz86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVRhYmxlIHtcbiAgZGF0YVRhYmxlOiBBcnJheTxBcnJheTxEYXRhVmFsdWU+PjtcbiAgaGVhZGVyczogQXJyYXk8RGF0YUhlYWRlcj47XG4gIG1hcmtzPzogQXJyYXk8TWFya0luZm8+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFUYWJsZVJlYWRlciB7XG4gIGlkOiBzdHJpbmc7XG4gIHRvdGFsUm93Q291bnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXJrSW5mbyB7XG4gIHR5cGU6IEVudW1zLk1hcmtUeXBlO1xuICBjb2xvcjogc3RyaW5nO1xuICB0dXBsZUlkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFIZWFkZXIge1xuICBkYXRhVHlwZTogRW51bXMuRGF0YVR5cGU7XG4gIGZpZWxkTmFtZTogc3RyaW5nO1xuICBpc1JlZmVyZW5jZWQ6IGJvb2xlYW47XG4gIGluZGV4OiBudW1iZXI7XG4gIGZpZWxkQ2FwdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFVuZGVybHlpbmdEYXRhVGFibGUge1xuICBkYXRhOiBEYXRhVGFibGU7XG4gIGlzU3VtbWFyeTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTZWxlY3RlZE1hcmtzVGFibGUge1xuICAvLyBJZiBtYXJrcyBhcmUgc2VsZWN0ZWQgYWNyb3NzIHBhbmVzLCB0aGVyZSBtYXkgYmUgbXVsdGlwbGUgdGFibGVzIG9mIGRhdGEgcmVwcmVzZW50aW5nIHRoZSBtYXJrc1xuICBkYXRhOiBBcnJheTxEYXRhVGFibGU+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhpZ2hsaWdodGVkTWFya3NUYWJsZSB7XG4gIC8vIElmIG1hcmtzIGFyZSBoaWdobGlnaHRlZCBhY3Jvc3MgcGFuZXMsIHRoZXJlIG1heSBiZSBtdWx0aXBsZSB0YWJsZXMgb2YgZGF0YSByZXByZXNlbnRpbmcgdGhlIG1hcmtzXG4gIGRhdGE6IEFycmF5PERhdGFUYWJsZT47XG59XG5cbi8vLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLy8vIEFubm90YXRpb24gTW9kZWxzXG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5leHBvcnQgaW50ZXJmYWNlIEFubm90YXRpb24gZXh0ZW5kcyBNb2RlbCB7XG4gIGFubm90YXRlRW51bTogRW51bXMuQW5ub3RhdGVFbnVtO1xuICBhbm5vdGF0aW9uSWQ6IG51bWJlcjtcbiAgYW5ub3RhdGlvblBsYWluVGV4dDogc3RyaW5nO1xuICBhbm5vdGF0aW9uVGV4dDogc3RyaW5nO1xuICB0dXBsZUlkPzogbnVtYmVyO1xufVxuXG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8vLyBGcmVsYXJkIE5hbWVzcGFjZSBNb2RlbHNcbi8vLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvciBleHRlbmRzIE1vZGVsIHtcbiAgaW5zdGFuY2VJZDogc3RyaW5nO1xuICBkYXNoYm9hcmRQYXRoOiBTaGVldFBhdGg7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya3NoZWV0RXh0ZW5zaW9uTG9jYXRvciBleHRlbmRzIE1vZGVsIHtcbiAgaW5zdGFuY2VJZDogc3RyaW5nO1xuICB2aXN1YWxJZDogVmlzdWFsSWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW52YWxpZEV4dGVuc2lvbkxvY2F0b3IgZXh0ZW5kcyBNb2RlbCB7XG4gIGluc3RhbmNlSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IHR5cGUgRXh0ZW5zaW9uTG9jYXRvciA9IERhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3IgfCBXb3Jrc2hlZXRFeHRlbnNpb25Mb2NhdG9yIHwgSW52YWxpZEV4dGVuc2lvbkxvY2F0b3I7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5zaW9uSW5zdGFuY2UgZXh0ZW5kcyBNb2RlbCB7XG4gIHVybDogc3RyaW5nO1xuICBsb2NhdG9yOiBFeHRlbnNpb25Mb2NhdG9yO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVuc2lvbkVudmlyb25tZW50IGV4dGVuZHMgTW9kZWwge1xuICBpc0V4cG9ydGluZzogYm9vbGVhbjtcbiAgZXhwb3J0ZWRNZWRpYVR5cGU/OiBFbnVtcy5FeHBvcnRlZE1lZGlhVHlwZTtcbiAgZXh0ZW5zaW9uQ29udGV4dDogRW51bXMuRXh0ZW5zaW9uQ29udGV4dDtcbiAgZXh0ZW5zaW9uTW9kZTogRW51bXMuRXh0ZW5zaW9uTW9kZTtcbiAgZXh0ZW5zaW9uTG9jYWxlOiBzdHJpbmc7XG4gIGV4dGVuc2lvbkxhbmd1YWdlOiBzdHJpbmc7XG4gIGV4dGVuc2lvbkNvdW50cnk6IHN0cmluZyB8IHVuZGVmaW5lZDsgLy8gVGhpcyB3YXMgaW50cm9kdWNlZCBpbiAyMDIyLjJcbiAgd29ya2Jvb2tGb3JtYXR0aW5nPzogV29ya2Jvb2tGb3JtYXR0aW5nIHwgdW5kZWZpbmVkO1xuICB3b3JrYm9va0xvY2FsZTogc3RyaW5nO1xuICB0YWJsZWF1VmVyc2lvbjogc3RyaW5nO1xuICBvcGVyYXRpbmdTeXN0ZW06IHN0cmluZztcbiAgYXBpVmVyc2lvbjogc3RyaW5nO1xuICB1c2VySWQ/OiBzdHJpbmc7XG4gIHNpdGVJZD86IHN0cmluZztcbiAgc2l0ZU5hbWVzcGFjZT86IHN0cmluZztcbiAgd29ya2Jvb2tJZD86IHN0cmluZztcbiAgdW5pcXVlVXNlcklkOiBzdHJpbmcgfCB1bmRlZmluZWQ7IC8vIFRoaXMgd2FzIGludHJvZHVjZWQgaW4gMjAyMy4xXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcbiAgZmVhdHVyZUZsYWdzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvIGV4dGVuZHMgTW9kZWwge1xuICBzZXR0aW5nc1ZhbHVlczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXb3JrYm9va0Zvcm1hdHRpbmcgZXh0ZW5kcyBNb2RlbCB7XG4gIGZvcm1hdHRpbmdTaGVldHM6IEFycmF5PEZvcm1hdHRpbmdTaGVldD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV29ya2Jvb2tGb3JtYXR0aW5nRXZlbnQgZXh0ZW5kcyBGaWx0ZXJhYmxlTW9kZWwge1xuICBmb3JtYXR0aW5nU2hlZXRzOiBBcnJheTxGb3JtYXR0aW5nU2hlZXQ+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtzaGVldEZvcm1hdHRpbmdFdmVudCBleHRlbmRzIE1vZGVsIHtcbiAgZm9ybWF0dGluZ1NoZWV0czogQXJyYXk8Rm9ybWF0dGluZ1NoZWV0PjtcbiAgdmlzdWFsSWQ6IFZpc3VhbElkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZvcm1hdHRpbmdTaGVldCBleHRlbmRzIE1vZGVsIHtcbiAgY2xhc3NOYW1lS2V5OiBFbnVtcy5DbGFzc05hbWVLZXk7XG4gIGNzc1Byb3BlcnRpZXM6IFJlYWN0LkNTU1Byb3BlcnRpZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUZvcm1hdCBleHRlbmRzIE1vZGVsIHtcbiAgZGVmYXVsdE9wdGlvbnM6IERhdGFGb3JtYXR0aW5nT3B0aW9ucztcbiAgc3VidG90YWxzT3B0aW9ucz86IERhdGFGb3JtYXR0aW5nT3B0aW9ucztcbiAgdG90YWxzT3B0aW9ucz86IERhdGFGb3JtYXR0aW5nT3B0aW9ucztcbiAgYXhpc09wdGlvbnM/OiBEYXRhRm9ybWF0dGluZ09wdGlvbnM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YUZvcm1hdHRpbmdPcHRpb25zIGV4dGVuZHMgTW9kZWwge1xuICBmb3JtYXRUeXBlOiBEYXRhRm9ybWF0VHlwZTtcbiAgbG9jYWxlOiBzdHJpbmc7XG4gIGRlY2ltYWxzOiBudW1iZXI7XG4gIGRlY2ltYWxDaGFyYWN0ZXI6IHN0cmluZztcbiAgc2hvd1NlcGFyYXRvcnM6IGJvb2xlYW47XG4gIHNlcGFyYXRvckNoYXJhY3Rlcjogc3RyaW5nO1xuICBwcmVmaXg6IHN0cmluZztcbiAgc3VmZml4OiBzdHJpbmc7XG4gIHVuaXRzOiBOdW1iZXJGb3JtYXRVbml0cztcbiAgbmVnYXRpdmVGb3JtYXQ6IE5lZ2F0aXZlTnVtYmVyRm9ybWF0O1xuICBjdXN0b21Gb3JtYXRTdHJpbmc6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRlRm9ybWF0dGluZ09wdGlvbnMgZXh0ZW5kcyBNb2RlbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgdHlwZTogc3RyaW5nO1xuICBmb3JtYXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHRlbnNpb25EYXNoYm9hcmRJbmZvIGV4dGVuZHMgTW9kZWwge1xuICBleHRlbnNpb25ab25lSWQ6IG51bWJlcjtcbiAgbmFtZTogc3RyaW5nO1xuICB6b25lczogQXJyYXk8RGFzaGJvYXJkWm9uZT47XG4gIHNpemU6IFNpemVJbmZvO1xuICBhY3RpdmVEYXNoYm9hcmRPYmplY3RJZDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVuc2lvbldvcmtzaGVldEluZm8gZXh0ZW5kcyBNb2RlbCB7XG4gIHZpc3VhbElkOiBWaXN1YWxJZDtcbiAgc2l6ZTogU2l6ZUluZm87XG4gIGJhY2tncm91bmRDb2xvcjogc3RyaW5nO1xuICBmb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbyBleHRlbmRzIE1vZGVsIHtcbiAgZXh0ZW5zaW9uSW5zdGFuY2U6IEV4dGVuc2lvbkluc3RhbmNlO1xuICBleHRlbnNpb25FbnZpcm9ubWVudDogRXh0ZW5zaW9uRW52aXJvbm1lbnQ7XG4gIGV4dGVuc2lvbkRhc2hib2FyZEluZm8/OiBFeHRlbnNpb25EYXNoYm9hcmRJbmZvO1xuICBleHRlbnNpb25Xb3Jrc2hlZXRJbmZvPzogRXh0ZW5zaW9uV29ya3NoZWV0SW5mbztcbiAgZXh0ZW5zaW9uU2V0dGluZ3NJbmZvOiBFeHRlbnNpb25TZXR0aW5nc0luZm87XG4gIGV4dGVuc2lvbkRpYWxvZ1BheWxvYWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaXplSW5mbyBleHRlbmRzIE1vZGVsIHtcbiAgaDogbnVtYmVyO1xuICB3OiBudW1iZXI7XG59XG5cbi8vLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLy8vIERhdGFTb3VyY2UgTW9kZWxzXG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IHR5cGUgRGF0YVNvdXJjZU1hcCA9IHsgW2tleTogc3RyaW5nXTogRGF0YVNvdXJjZSB9O1xuZXhwb3J0IHR5cGUgV29ya3NoZWV0RGF0YVNjaGVtYU1hcCA9IHsgW2tleTogc3RyaW5nXTogV29ya3NoZWV0RGF0YVNvdXJjZUluZm8gfTtcblxuZXhwb3J0IGludGVyZmFjZSBEYXRhU2NoZW1hIGV4dGVuZHMgTW9kZWwge1xuICBkYXRhU291cmNlczogRGF0YVNvdXJjZU1hcDtcbiAgd29ya3NoZWV0RGF0YVNjaGVtYU1hcDogV29ya3NoZWV0RGF0YVNjaGVtYU1hcDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhU291cmNlIGV4dGVuZHMgTW9kZWwge1xuICBuYW1lOiBzdHJpbmc7XG4gIGlkOiBzdHJpbmc7XG4gIGV4dHJhY3RVcGRhdGVUaW1lPzogc3RyaW5nO1xuICBpc0V4dHJhY3Q6IGJvb2xlYW47XG4gIGZpZWxkczogQXJyYXk8RmllbGQ+O1xuICBpc1B1Ymxpc2hlZD86IGJvb2xlYW47XG4gIHB1Ymxpc2hlZFVybD86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZEJhc2UgZXh0ZW5kcyBNb2RlbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgZGVzY3JpcHRpb246IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgZGF0YVR5cGU6IEVudW1zLkRhdGFUeXBlIHwgdW5kZWZpbmVkO1xuICBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdDtcbiAgYWdncmVnYXRpb246IEVudW1zLkZpZWxkQWdncmVnYXRpb25UeXBlO1xuICByb2xlOiBFbnVtcy5GaWVsZFJvbGVUeXBlO1xuICBzZW1hbnRpY1JvbGU/OiBzdHJpbmc7XG4gIGNvbHVtblR5cGU6IEVudW1zLkNvbHVtblR5cGU7XG4gIGlzQ2FsY3VsYXRlZEZpZWxkOiBib29sZWFuO1xuICBpc0NvbWJpbmVkRmllbGQ6IGJvb2xlYW47XG4gIGlzR2VuZXJhdGVkOiBib29sZWFuO1xuICBpc0dlb3NwYXRpYWw6IGJvb2xlYW47XG4gIGlzSGlkZGVuOiBib29sZWFuO1xuICBpc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2U6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmllbGRJbnN0YW5jZSBleHRlbmRzIEZpZWxkQmFzZSB7XG4gIGZpZWxkSWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWVsZCBleHRlbmRzIEZpZWxkQmFzZSB7XG4gIGlkOiBzdHJpbmc7XG59XG5cbi8vIFJlcHJlc2VudHMgYWxsIHRhYmxlcyB1c2VkIGluIHRoZSBjdXJyZW50IGRhdGEgcHJlcCBjYW52YXMgZm9yIGEgZGF0YXNvdXJjZS5cbi8vIFRoaXMgbWF5IGNvbnRhaW4gdGFibGVzIGZyb20gc2VwYXJhdGUgY29ubmVjdGlvbnMuXG5leHBvcnQgaW50ZXJmYWNlIEpvaW5EZXNjcmlwdGlvbiBleHRlbmRzIE1vZGVsIHtcbiAgdGFibGVzOiBBcnJheTxUYWJsZUluZm8+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlSW5mb3MgZXh0ZW5kcyBNb2RlbCB7XG4gIHRhYmxlczogQXJyYXk8VGFibGVJbmZvPjtcbn1cblxuLy8gSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYSB0YWJsZVxuZXhwb3J0IGludGVyZmFjZSBUYWJsZUluZm8gZXh0ZW5kcyBNb2RlbCB7XG4gIG5hbWU6IHN0cmluZztcbiAgaWQ6IHN0cmluZztcbiAgY3VzdG9tU1FMOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gIGNvbm5lY3Rpb25DbGFzc05hbWU6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgY29ubmVjdGlvbklkOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSBleHRlbmRzIE1vZGVsIHtcbiAgbmFtZTogc3RyaW5nO1xuICBpZDogc3RyaW5nO1xuICB0eXBlOiBzdHJpbmc7XG4gIHNlcnZlclVSSTogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBXb3Jrc2hlZXRGaWVsZCA9IEZpZWxkO1xuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtzaGVldERhdGFTb3VyY2VJbmZvIGV4dGVuZHMgTW9kZWwge1xuICBwcmltYXJ5RGF0YVNvdXJjZTogc3RyaW5nO1xuICByZWZlcmVuY2VkRGF0YVNvdXJjZUxpc3Q6IEFycmF5PHN0cmluZz47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTG9naWNhbFRhYmxlSW5mbyBleHRlbmRzIE1vZGVsIHtcbiAgaWQ6IHN0cmluZztcbiAgY2FwdGlvbjogc3RyaW5nO1xufVxuXG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8vLyBFcnJvcnNcbi8vLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgaW50ZXJmYWNlIEludGVybmFsVGFibGVhdUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBlcnJvckNvZGU6IEVudW1zLkVycm9yQ29kZXM7XG59XG5cbi8vLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLy8vIEZpbHRlciBNb2RlbHNcbi8vLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5leHBvcnQgaW50ZXJmYWNlIEZpbHRlciBleHRlbmRzIE1vZGVsIHtcbiAgZmlsdGVyVHlwZTogRW51bXMuRmlsdGVyVHlwZTtcbiAgZmllbGRDYXB0aW9uOiBzdHJpbmc7XG4gIGZpZWxkTmFtZTogc3RyaW5nO1xuICB2aXN1YWxJZDogVmlzdWFsSWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ2F0ZWdvcmljYWxGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIge1xuICB2YWx1ZXM6IEFycmF5PERhdGFWYWx1ZT47XG4gIGlzRXhjbHVkZTogYm9vbGVhbjtcbiAgaXNBbGxTZWxlY3RlZD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGllcmFyY2hpY2FsRmlsdGVyIGV4dGVuZHMgRmlsdGVyIHtcbiAgZGltZW5zaW9uTmFtZTogc3RyaW5nO1xuICBoaWVyYXJjaHlDYXB0aW9uOiBzdHJpbmc7XG4gIHZhbHVlczogQXJyYXk8SGllcmFyY2hpY2FsRGF0YVZhbHVlPjtcbiAgbGV2ZWxzOiBudW1iZXI7XG4gIGxldmVsSW5mbzogQXJyYXk8SGllcmFyY2hpY2FsTGV2ZWxJbmZvPjtcbiAgaXNBbGxTZWxlY3RlZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBIaWVyYXJjaGljYWxEYXRhVmFsdWUge1xuICB2YWx1ZTogRGF0YVZhbHVlO1xuICBoaWVyYXJjaGljYWxQYXRoOiBzdHJpbmc7XG4gIGxldmVsOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSGllcmFyY2hpY2FsTGV2ZWxJbmZvIHtcbiAgbmFtZTogc3RyaW5nO1xuICBsZXZlbFNlbGVjdGlvblN0YXRlOiBFbnVtcy5IaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlRmlsdGVyIGV4dGVuZHMgRmlsdGVyIHtcbiAgbWluOiBEYXRhVmFsdWU7XG4gIG1heDogRGF0YVZhbHVlO1xuICBpbmNsdWRlTnVsbFZhbHVlczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZWxhdGl2ZURhdGVGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIge1xuICBhbmNob3JEYXRlOiBEYXRhVmFsdWU7XG4gIHBlcmlvZFR5cGU6IEVudW1zLkRhdGVTdGVwUGVyaW9kO1xuICByYW5nZVR5cGU6IEVudW1zLkRhdGVSYW5nZVR5cGU7XG4gIHJhbmdlTjogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIENhdGVnb3JpY2FsRG9tYWluIHtcbiAgdmFsdWVzOiBBcnJheTxEYXRhVmFsdWU+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlRG9tYWluIHtcbiAgbWluOiBEYXRhVmFsdWU7XG4gIG1heDogRGF0YVZhbHVlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlc3RDb252ZXJzaW9uTW9kZWwge1xuICB2YWx1ZTogbnVtYmVyO1xufVxuXG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8vLyBFbWJlZGRpbmcgTW9kZWxzXG4vLy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRpbmdCb290c3RyYXBJbmZvIHtcbiAgd29ya2Jvb2tOYW1lOiBzdHJpbmc7XG4gIGN1cnJXb3Jrc2hlZXROYW1lOiBzdHJpbmc7XG4gIG9sZFNoZWV0TmFtZT86IHN0cmluZzsgLy8gb25seSB1c2VkIGJ5IFRhYlN3aXRjaGVkLiBBZGRlZCBpbiAxLjk2LjBcbiAgcHVibGlzaGVkU2hlZXRzOiBBcnJheTxFbWJlZGRpbmdTaGVldEluZm8+O1xuICBkYXNoYm9hcmRab25lczogQXJyYXk8RGFzaGJvYXJkWm9uZT47XG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcbiAgY2FuRG93bmxvYWRXb3JrYm9vazogYm9vbGVhbjtcbiAgc3Rvcnk/OiBTdG9yeU1vZGVsOyAvLyBBZGRlZCBpbiAxLjEwOC4wXG4gIHZpenFsRGF0YVNlcnZpY2VTZXNzaW9uSW5mbz86IFZpelFMRGF0YVNlcnZpY2VTZXNzaW9uSW5mbzsgLy8gQWRkZWQgaW4gMS4xOTUuMFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFZpelFMRGF0YVNlcnZpY2VTZXNzaW9uSW5mbyB7XG4gIHZpenFsU2VydmVyU2Vzc2lvbklkOiBzdHJpbmc7XG4gIGdsb2JhbFNlc3Npb25IZWFkZXI6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRpbmdQdWxzZUJvb3RzdHJhcEluZm8ge1xuICBpZnJhbWVUaXRsZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNpemVDb25zdHJhaW50IHtcbiAgbWluV2lkdGg6IG51bWJlcjtcbiAgbWluSGVpZ2h0OiBudW1iZXI7XG4gIG1heFdpZHRoOiBudW1iZXI7XG4gIG1heEhlaWdodDogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFdvcmtib29rUHVibGlzaGVkQXNNb2RlbCB7XG4gIG5ld1VybDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvb2xiYXJTdGF0ZSB7XG4gIGNhblJlZG86IGJvb2xlYW47XG4gIGNhblVuZG86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXJsQWN0aW9uTW9kZWwgZXh0ZW5kcyBNb2RlbCB7XG4gIHVybDogc3RyaW5nO1xuICB0YXJnZXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGFyZWRGaWx0ZXJXb3Jrc2hlZXRNb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAgd29ya3NoZWV0TmFtZTogc3RyaW5nO1xuICBpc0FjdGl2ZTogYm9vbGVhbjtcbiAgaXNFbmFibGVkOiBib29sZWFuO1xuICBpc1NlbGVjdGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNoYXJlZEZpbHRlck1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICB3b3Jrc2hlZXRzOiBBcnJheTxTaGFyZWRGaWx0ZXJXb3Jrc2hlZXRNb2RlbD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXNlck1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICB1c2VySWQ6IG51bWJlcjtcbiAgdXNlck5hbWU6IHN0cmluZztcbiAgdXNlckZyaWVuZGx5TmFtZTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEN1c3RvbVZpZXdNb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAgaWQ/OiBudW1iZXI7XG4gIG5hbWU6IHN0cmluZztcbiAgdXJsSWQ6IHN0cmluZztcbiAgdXJsOiBzdHJpbmc7XG4gIHN0YXJ0Vmlld0lkOiBzdHJpbmc7XG4gIHNoYXJlZDogYm9vbGVhbjtcbiAgb3duZXI6IFVzZXJNb2RlbDtcbiAgbHVpZDogc3RyaW5nO1xuICBpc0RlZmF1bHQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tVmlld0luZm9Nb2RlbCBleHRlbmRzIE1vZGVsIHtcbiAgY3VycmVudFZpZXc/OiBDdXN0b21WaWV3TW9kZWw7XG4gIGN1c3RvbVZpZXdzTGlzdDogQXJyYXk8Q3VzdG9tVmlld01vZGVsPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdG9yeU1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICBhY3RpdmVTdG9yeVBvaW50SW5kZXg6IG51bWJlcjtcbiAgc3RvcnlQb2ludHM6IEFycmF5PFN0b3J5UG9pbnRNb2RlbD47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RvcnlQb2ludE1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICBjYXB0aW9uOiBzdHJpbmc7XG4gIGluZGV4OiBudW1iZXI7XG4gIHVwZGF0ZWQ6IGJvb2xlYW47XG4gIHN0b3J5UG9pbnRJZDogbnVtYmVyO1xuICBjb250YWluZWRTaGVldEluZm8/OiBDb250YWluZWRTaGVldEluZm9Nb2RlbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbWJlZGRpbmdBYnN0cmFjdFF1ZXJ5IHtcbiAgYWJzdHJhY3RRdWVyeTogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElzQW5hbHl0aWNzQXNzaXN0YW50QXZhaWxhYmxlIGV4dGVuZHMgTW9kZWwge1xuICBpc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZTogYm9vbGVhbjtcbn1cblxuLy8vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vLy8gRXhwb3J0IE1vZGVsc1xuLy8vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbmV4cG9ydCB0eXBlIEV4cG9ydENyb3NzdGFiU2hlZXRNYXAgPSB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9O1xuXG5leHBvcnQgdHlwZSBTY2FsaW5nU2VsZWN0aW9uID0gRW51bXMuRml0UGFnZXMgfCBFbnVtcy5QYWdlU2NhbGluZ09wdGlvbjtcblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRGaWxlIGV4dGVuZHMgTW9kZWwge1xuICByZXN1bHRLZXk6IHN0cmluZztcbiAgaGFzVXNlclNwZWNpZmljQ29udGVudDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeHBvcnRMYXlvdXRPcHRpb25zIGV4dGVuZHMgTW9kZWwge1xuICBwYWdlU2l6ZU9wdGlvbjogRW51bXMuUGFnZVNpemVPcHRpb247XG4gIHBhZ2VPcmllbnRhdGlvbk9wdGlvbjogRW51bXMuUGFnZU9yaWVudGF0aW9uO1xuICBwYWdlU2NhbGVNb2RlOiBFbnVtcy5TY2FsZU1vZGU7XG4gIHBhZ2VTY2FsZVBlcmNlbnQ6IG51bWJlcjtcbiAgcGFnZUZpdEhvcml6b250YWw6IG51bWJlcjtcbiAgcGFnZUZpdFZlcnRpY2FsOiBudW1iZXI7XG4gIGltYWdlSGVpZ2h0OiBudW1iZXI7XG4gIGltYWdlV2lkdGg6IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTaGVldE1vZGVsIGV4dGVuZHMgTW9kZWwge1xuICBzaGVldDogc3RyaW5nO1xuICBpc0Rhc2hib2FyZDogYm9vbGVhbjtcbiAgaXNTdG9yeTogYm9vbGVhbjtcbiAgbmFtZXNPZlN1YnNoZWV0czogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VydmVyU2hlZXRNb2RlbCBleHRlbmRzIFNoZWV0TW9kZWwge1xuICBpc1B1Ymxpc2hlZDogYm9vbGVhbjtcbiAgYmFzZVZpZXdUaHVtYkxpbms6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQREZTaGVldCBleHRlbmRzIFNlcnZlclNoZWV0TW9kZWwge1xuICBpc1NlbGVjdGVkOiBib29sZWFuO1xuICBleHBvcnRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4cG9ydFBERk9wdGlvbnMgZXh0ZW5kcyBNb2RlbCB7XG4gIGN1cnJlbnRTaGVldDogc3RyaW5nO1xuICBleHBvcnRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zO1xuICBzaGVldE9wdGlvbnM6IFBERlNoZWV0W107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVmlzdWFsU3BlY2lmaWNhdGlvbiB7XG4gIHJvd0ZpZWxkczogRmllbGRJbnN0YW5jZVtdO1xuICBjb2x1bW5GaWVsZHM6IEZpZWxkSW5zdGFuY2VbXTtcbiAgYWN0aXZlTWFya3NTcGVjaWZpY2F0aW9uSW5kZXg6IG51bWJlcjtcbiAgbWFya3NTcGVjaWZpY2F0aW9uczogTWFya3NTcGVjaWZpY2F0aW9uW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTWFya3NTcGVjaWZpY2F0aW9uIHtcbiAgcHJpbWl0aXZlVHlwZTogRW51bXMuTWFya1R5cGU7XG4gIGVuY29kaW5nczogRW5jb2RpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFbmNvZGluZyB7XG4gIGlkOiBzdHJpbmc7XG4gIGZpZWxkRW5jb2RpbmdJZDogc3RyaW5nO1xuICB0eXBlOiBFbnVtcy5FbmNvZGluZ1R5cGU7XG4gIGZpZWxkOiBGaWVsZEluc3RhbmNlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRvb2x0aXBUZXh0UmVxdWVzdCBleHRlbmRzIE1vZGVsIHtcbiAgdmlzdWFsSWRQcmVzTW9kZWw6IFZpc3VhbElkO1xuICB0dXBsZUlkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb24gZXh0ZW5kcyBNb2RlbCB7XG4gIHZpc3VhbElkUHJlc01vZGVsOiBWaXN1YWxJZDtcbiAgdHVwbGVJZHM6IEFycmF5PG51bWJlcj47XG4gIHNlbGVjdE9wdGlvbnM6IEVudW1zLlNlbGVjdE9wdGlvbnM7XG4gIHRvb2x0aXBDb250ZXh0PzogVG9vbHRpcENvbnRleHQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSG92ZXJUdXBsZUludGVyYWN0aW9uIGV4dGVuZHMgTW9kZWwge1xuICB2aXN1YWxJZFByZXNNb2RlbDogVmlzdWFsSWQ7XG4gIHR1cGxlSWQ6IG51bWJlcjtcbiAgdG9vbHRpcENvbnRleHQ/OiBUb29sdGlwQ29udGV4dCB8IG51bGw7XG4gIGFsbG93SG92ZXJBY3Rpb25zPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUb29sdGlwQ29udGV4dCBleHRlbmRzIE1vZGVsIHtcbiAgdG9vbHRpcEFuY2hvclBvaW50OiBQb2ludDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQb2ludCBleHRlbmRzIE1vZGVsIHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG59XG5cbi8qKlxuICogQSBQdWxzZUZpZWxkVmFsdWVBcnJheSBpcyBhbiBhcnJheSB0aGF0IGNhbiBjb250YWluIHN0cmluZ3MsIGJvb2xlYW5zLCBvciBudWxscywgYnV0IHdpbGwgbmV2ZXIgY29udGFpbiBib3RoIHN0cmluZ3MgYW5kIGJvb2xlYW5zIGF0IHRoZSBzYW1lIHRpbWUuXG4gKi9cbmV4cG9ydCB0eXBlIFB1bHNlRmllbGRWYWx1ZUFycmF5ID0gQXJyYXk8Ym9vbGVhbiB8IG51bGw+IHwgQXJyYXk8c3RyaW5nIHwgbnVsbD47XG4iLCJleHBvcnQgZW51bSBOb3RpZmljYXRpb25JZCB7XG4gIEN1c3RvbU1hcmtDb250ZXh0TWVudUNsaWNrZWQgPSAnY3VzdG9tLW1hcmstY29udGV4dC1tZW51LWNsaWNrZWQnLFxuICBDb250ZXh0TWVudUNsaWNrID0gJ2NvbnRleHQtbWVudS1jbGljaycsXG4gIEN1c3RvbVZpZXdSZW1vdmVkID0gJ2N1c3RvbS12aWV3LXJlbW92ZWQnLFxuICBDdXN0b21WaWV3U2F2ZWQgPSAnY3VzdG9tLXZpZXctc2F2ZWQnLFxuICBDdXN0b21WaWV3U2V0RGVmYXVsdCA9ICdjdXN0b20tdmlldy1zZXQtZGVmYXVsdCcsXG4gIEN1c3RvbVZpZXdzTG9hZGVkID0gJ2N1c3RvbS12aWV3cy1sb2FkZWQnLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VkID0gJ2Rhc2hib2FyZC1sYXlvdXQtY2hhbmdlZCcsXG4gIEVkaXRCdXR0b25DbGlja2VkID0gJ2VkaXQtYnV0dG9uLWNsaWNrZWQnLFxuICBFZGl0SW5EZXNrdG9wQnV0dG9uQ2xpY2tlZCA9ICdlZGl0LWluLWRlc2t0b3AtYnV0dG9uLWNsaWNrZWQnLFxuICBFeHRlbnNpb25EaWFsb2dVcGRhdGUgPSAnZXh0ZW5zaW9uLWRpYWxvZy11cGRhdGUnLFxuICBFeHRlbnNpb25EaWFsb2dNZXNzYWdlID0gJ2V4dGVuc2lvbi1kaWFsb2ctbWVzc2FnZScsXG4gIEZpbHRlckNoYW5nZWQgPSAnZmlsdGVyLWNoYW5nZWQnLFxuICBGaXJzdFZpelNpemVLbm93biA9ICdmaXJzdC12aXotc2l6ZS1rbm93bicsXG4gIEZpcnN0UHVsc2VNZXRyaWNTaXplS25vd24gPSAnZmlyc3QtcHVsc2UtbWV0cmljLXNpemUta25vd24nLFxuICBQYXJhbWV0ZXJDaGFuZ2VkID0gJ3BhcmFtZXRlci1jaGFuZ2VkJyxcbiAgUHVsc2VFcnJvciA9ICdwdWxzZS1lcnJvcicsXG4gIFB1bHNlRmlsdGVyc0NoYW5nZWQgPSAncHVsc2UtZmlsdGVycy1jaGFuZ2VkJyxcbiAgUHVsc2VNZXRyaWNTaXplQ2hhbmdlZCA9ICdwdWxzZS1tZXRyaWMtc2l6ZS1jaGFuZ2VkJyxcbiAgUHVsc2VJbnNpZ2h0RGlzY292ZXJlZCA9ICdwdWxzZS1pbnNpZ2h0LWRpc2NvdmVyZWQnLFxuICBQdWxzZUludGVyYWN0aXZlID0gJ3B1bHNlLWludGVyYWN0aXZlJyxcbiAgUHVsc2VUaW1lRGltZW5zaW9uQ2hhbmdlZCA9ICdwdWxzZS10aW1lLWRpbWVuc2lvbi1jaGFuZ2VkJyxcbiAgUHVsc2VVcmxDaGFuZ2VkID0gJ3B1bHNlLXVybC1jaGFuZ2VkJyxcbiAgU2VsZWN0ZWRNYXJrc0NoYW5nZWQgPSAnc2VsZWN0ZWQtbWFya3MtY2hhbmdlZCcsXG4gIFNldHRpbmdzQ2hhbmdlZCA9ICdzZXR0aW5ncy1jaGFuZ2VkJyxcbiAgU3VtbWFyeURhdGFDaGFuZ2VkID0gJ3N1bW1hcnktZGF0YS1jaGFuZ2VkJyxcbiAgVGVzdENvbnZlcnNpb25Ob3RpZmljYXRpb24gPSAndGVzdC1jb252ZXJzaW9uLW5vdGlmaWNhdGlvbicsXG4gIFRvb2xiYXJTdGF0ZUNoYW5nZWQgPSAndG9vbGJhci1zdGF0ZS1jaGFuZ2VkJyxcbiAgVml6SW50ZXJhY3RpdmUgPSAndml6LWludGVyYWN0aXZlJyxcbiAgQXNrRGF0YUludGVyYWN0aXZlID0gJ2Fzay1kYXRhLWludGVyYWN0aXZlJyxcbiAgV29ya2Jvb2tSZWFkeVRvQ2xvc2UgPSAnd29ya2Jvb2stcmVhZHktdG8tY2xvc2UnLFxuICBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkID0gJ3dvcmtib29rLWZvcm1hdHRpbmctY2hhbmdlZCcsXG4gIFdvcmtib29rUHVibGlzaGVkID0gJ3dvcmtib29rLXB1Ymxpc2hlZCcsXG4gIFdvcmtib29rUHVibGlzaGVkQXMgPSAnd29ya2Jvb2stcHVibGlzaGVkLWFzJyxcbiAgV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWQgPSAnd29ya3NoZWV0LWZvcm1hdHRpbmctY2hhbmdlZCcsXG4gIFVybEFjdGlvbiA9ICd1cmwtYWN0aW9uJyxcbiAgVGFiU3dpdGNoZWQgPSAndGFiLXN3aXRjaGVkJyxcbiAgU3RvcnlQb2ludFN3aXRjaGVkID0gJ3N0b3J5LXBvaW50LXN3aXRjaGVkJyxcbiAgUmVhZHlUb1JlY2VpdmVBdXRoVG9rZW4gPSAncmVhZHktdG8tcmVjZWl2ZS1hdXRoLXRva2VuJyxcbn1cbiIsIi8vIFBMRUFTRSBLRUVQIElOIEFMUEhBQkVUSUNBTCBPUkRFUi4gVGhpcyBoZWxwcyB3aXRoIHZpc3VhbGx5IGZpbmRpbmcgZW50cmllcywga25vd2luZyB3aGVyZSB0byBwdXRcbi8vIG5ldyBvbmVzLCBhbmQgbWVyZ2UgY29uZmxpY3RzLlxuZXhwb3J0IGVudW0gUGFyYW1ldGVySWQge1xuICBBY3RpdmVUYWJsZXNJbmZvID0gJ2FjdGl2ZS10YWJsZXMtaW5mbycsXG4gIEFuY2hvckRhdGUgPSAnYW5jaG9yLWRhdGUnLFxuICBBbm5vdGF0ZUVudW0gPSAnYW5ub3RhdGUtZW51bScsXG4gIEFubm90YXRpb25MaXN0ID0gJ2Fubm90YXRpb24tbGlzdCcsXG4gIEFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyA9ICdhcHBseS13b3Jrc2hlZXQtZm9ybWF0dGluZycsXG5cbiAgQ2F0ZWdvcmljYWxEb21haW4gPSAnY2F0ZWdvcmljYWwtZG9tYWluJyxcbiAgQ2xpY2tUaHJvdWdoRW5hYmxlZCA9ICdjbGljay10aHJvdWdoLWVuYWJsZWQnLFxuICBDb2x1bW5zID0gJ2NvbHVtbnMnLFxuICBDb2x1bW5zVG9JbmNsdWRlID0gJ2NvbHVtbnMtdG8taW5jbHVkZScsXG4gIENvbHVtbnNUb0luY2x1ZGVCeUlkID0gJ2NvbHVtbnMtdG8taW5jbHVkZS1ieS1pZCcsXG4gIENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcmllcyA9ICdjb25uZWN0aW9uLWRlc2NyaXB0aW9uLXN1bW1hcmllcycsXG4gIEN1cnJlbnRTaGVldFR5cGUgPSAnY3VycmVudC1zaGVldC10eXBlJyxcbiAgQ3VzdG9tVmlldyA9ICdjdXN0b20tdmlldycsXG4gIEN1c3RvbVZpZXdJc0RlZmF1bHQgPSAnY3VzdG9tLXZpZXctaXMtZGVmYXVsdCcsXG4gIEN1c3RvbVZpZXdJc1B1YmxpYyA9ICdjdXN0b20tdmlldy1pcy1wdWJsaWMnLFxuICBDdXN0b21WaWV3THVpZCA9ICdjdXN0b20tdmlldy1sdWlkJyxcbiAgQ3VzdG9tVmlld05hbWUgPSAnY3VzdG9tLXZpZXctbmFtZScsXG4gIEN1c3RvbVZpZXdzID0gJ2N1c3RvbS12aWV3cycsXG5cbiAgRGFzaGJvYXJkID0gJ2Rhc2hib2FyZCcsXG4gIERhc2hib2FyZEZpbHRlcnMgPSAnZGFzaGJvYXJkLWZpbHRlcnMnLFxuICBEYXNoYm9hcmROYW1lID0gJ2Rhc2hib2FyZCcsXG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSA9ICdkYXNoYm9hcmQtb2JqZWN0LXBvc2l0aW9uLWFuZC1zaXplLXVwZGF0ZScsXG4gIERhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUxpc3QgPSAnZGFzaGJvYXJkLW9iamVjdC1wb3NpdGlvbi1hbmQtc2l6ZS11cGRhdGUtbGlzdCcsXG4gIERhdGFSb3dJbmRleCA9ICdkYXRhLXJvdy1pbmRleCcsXG4gIERhdGFTY2hlbWEgPSAnZGF0YS1zY2hlbWEnLFxuICBEYXRhU291cmNlID0gJ2RhdGEtc291cmNlJyxcbiAgRGF0YVNvdXJjZURhdGFUYWJsZSA9ICdkYXRhLXNvdXJjZS1kYXRhLXRhYmxlJyxcbiAgRGF0YVNvdXJjZUlkID0gJ2RhdGEtc291cmNlLWlkJyxcbiAgRGF0YVNvdXJjZU5hbWUgPSAnZGF0YS1zb3VyY2UtbmFtZScsXG4gIERhdGFUYWJsZSA9ICdkYXRhLXRhYmxlJyxcbiAgRGF0YVRhYmxlUmVhZGVyID0gJ2RhdGEtdGFibGUtcmVhZGVyJyxcbiAgRGF0ZVJhbmdlVHlwZSA9ICdkYXRlLXJhbmdlLXR5cGUnLFxuICBEZWxldGVDb3VudCA9ICdkZWxldGUtY291bnQnLFxuICBEZWx0YVRpbWVNcyA9ICdkZWx0YS10aW1lLW1zJyxcbiAgRGltVmFsU2VsZWN0aW9uTW9kZWxzID0gJ2RpbWVuc2lvblZhbHVlU2VsZWN0aW9uTW9kZWxzJyxcbiAgRG9tYWluVHlwZSA9ICdkb21haW4tdHlwZScsXG5cbiAgRW1iZWRkaW5nQWJzdHJhY3RRdWVyeSA9ICdlbWJlZGRpbmctYWJzdHJhY3QtcXVlcnknLFxuICBFbWJlZGRpbmdCb290c3RyYXBJbmZvID0gJ2VtYmVkZGluZy1ib290c3RyYXAtaW5mbycsXG4gIEVuY29kaW5nVHlwZSA9ICdlbmNvZGluZy10eXBlJyxcbiAgRXhwb3J0Q3Jvc3N0YWJTaGVldE1hcCA9ICdleHBvcnQtY3Jvc3N0YWItc2hlZXQtbWFwJyxcbiAgRXhwb3J0RmlsZSA9ICdleHBvcnQtZmlsZScsXG4gIEV4cG9ydE9yaWdpblVybCA9ICdleHBvcnQtb3JpZ2luLXVybCcsXG4gIEV4cG9ydFBkZk9wdGlvbnMgPSAnZXhwb3J0LXBkZi1vcHRpb25zJyxcbiAgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbyA9ICdleHRlbnNpb24tYm9vdHN0cmFwLWluZm8nLFxuICBFeHRlbnNpb25Db250ZXh0TWVudUlkcyA9ICdleHRlbnNpb24tY29udGV4dC1tZW51LWlkcycsXG4gIEV4dGVuc2lvbkRpYWxvZ0ggPSAnZXh0ZW5zaW9uLWRpYWxvZy1oZWlnaHQnLFxuICBFeHRlbnNpb25EaWFsb2dNZXNzYWdlID0gJ2V4dGVuc2lvbi1kaWFsb2ctbWVzc2FnZScsXG4gIEV4dGVuc2lvbkRpYWxvZ1BheWxvYWQgPSAnZXh0ZW5zaW9uLWRpYWxvZy1wYXlsb2FkJyxcbiAgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0ID0gJ2V4dGVuc2lvbi1kaWFsb2ctcmVzdWx0JyxcbiAgRXh0ZW5zaW9uRGlhbG9nU3R5bGUgPSAnZXh0ZW5zaW9uLWRpYWxvZy1zdHlsZScsXG4gIEV4dGVuc2lvbkRpYWxvZ1VybCA9ICdleHRlbnNpb24tZGlhbG9nLXVybCcsXG4gIEV4dGVuc2lvbkRpYWxvZ1VybFNvdXJjZSA9ICdleHRlbnNpb24tZGlhbG9nLXVybC1zb3VyY2UnLFxuICBFeHRlbnNpb25EaWFsb2dXID0gJ2V4dGVuc2lvbi1kaWFsb2ctd2lkdGgnLFxuICBFeHRlbnNpb25Mb2NhdG9yID0gJ2V4dGVuc2lvbi1sb2NhdG9yJyxcbiAgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvID0gJ2V4dGVuc2lvbi1zZXR0aW5ncy1pbmZvJyxcbiAgRXh0ZW5zaW9uWm9uZUlkID0gJ2V4dGVuc2lvbi16b25lLWlkJyxcbiAgRXh0ZW5zaW9uTWVkaWFCbG9iID0gJ2V4dGVuc2lvbi1tZWRpYS1ibG9iJyxcbiAgSGFzRXh0ZW5zaW9uUmVuZGVyaW5nVGltZWRPdXQgPSAnaGFzLWV4dGVuc2lvbi1yZW5kZXJpbmctdGltZWQtb3V0JyxcbiAgRXh0ZXJuYWxNZW51RGVzY3JpcHRpb24gPSAnZXh0ZXJuYWwtbWVudS1kZXNjcmlwdGlvbicsXG4gIEV4dGVybmFsTWVudUhlYWRlciA9ICdleHRlcm5hbC1tZW51LWhlYWRlcicsXG4gIEV4dGVybmFsTWVudUl0ZW1EaXNwbGF5TmFtZSA9ICdleHRlcm5hbC1tZW51LWl0ZW0tZGlzcGxheS1uYW1lJyxcbiAgRXh0ZXJuYWxNZW51SXRlbUlkID0gJ2V4dGVybmFsLW1lbnUtaXRlbS1pZCcsXG5cbiAgRmllbGQgPSAnZmllbGQnLFxuICBGaWVsZENvdW50ID0gJ2ZpZWxkLWNvdW50JyxcbiAgRmllbGRJZCA9ICdmaWVsZC1pZCcsXG4gIEZpZWxkTmFtZSA9ICdmaWVsZC1uYW1lJyxcbiAgRmlsdGVyTGV2ZWxzID0gJ2ZpbHRlci1sZXZlbHMnLFxuICBGaWx0ZXJSYW5nZU1heCA9ICdmaWx0ZXItcmFuZ2UtbWF4JyxcbiAgRmlsdGVyUmFuZ2VNaW4gPSAnZmlsdGVyLXJhbmdlLW1pbicsXG4gIEZpbHRlclJhbmdlTnVsbE9wdGlvbiA9ICdmaWx0ZXItcmFuZ2UtbnVsbC1vcHRpb24nLFxuICBGaWx0ZXJVcGRhdGVUeXBlID0gJ2ZpbHRlci11cGRhdGUtdHlwZScsXG4gIEZpbHRlclZhbHVlcyA9ICdmaWx0ZXItdmFsdWVzJyxcbiAgRm9udE5hbWVMaXN0SXRlbXMgPSAnZm9udC1uYW1lLWxpc3QtaXRlbXMnLFxuICBGb3JtYXR0ZWRUZXh0ID0gJ2Zvcm1hdHRlZC10ZXh0JyxcbiAgRnVuY3Rpb25OYW1lID0gJ2Z1bmN0aW9uLW5hbWUnLFxuICBGcm9tSW5kZXggPSAnZnJvbS1pbmRleCcsXG5cbiAgSGllclZhbFNlbGVjdGlvbk1vZGVscyA9ICdoaWVyYXJjaGljYWxWYWx1ZVNlbGVjdGlvbk1vZGVscycsXG4gIEhpZ2hsaWdodGVkRGF0YSA9ICdoaWdobGlnaHRlZC1kYXRhJyxcbiAgSG92ZXJUdXBsZUludGVyYWN0aW9uID0gJ2hvdmVyLXR1cGxlLWludGVyYWN0aW9uJyxcblxuICBJZ25vcmVBbGlhc2VzID0gJ2lnbm9yZS1hbGlhc2VzJyxcbiAgSWdub3JlU2VsZWN0aW9uID0gJ2lnbm9yZS1zZWxlY3Rpb24nLFxuICBJbmNsdWRlQWxsQ29sdW1ucyA9ICdpbmNsdWRlLWFsbC1jb2x1bW5zJyxcbiAgSW52YWxpZEFnZ0ZpZWxkTmFtZSA9ICdpbnZhbGlkLWFnZy1maWVsZC1uYW1lJyxcbiAgSW52YWxpZERhdGVzID0gJ2ludmFsaWQtZGF0ZXMnLFxuICBJbnZhbGlkRmllbGRDYXB0aW9uID0gJ2ludmFsaWQtZmllbGQtY2FwdGlvbicsXG4gIEludmFsaWRGaWVsZHMgPSAnaW52YWxpZC1maWVsZHMnLFxuICBJbnZhbGlkVmFsdWVzID0gJ2ludmFsaWQtdmFsdWVzJyxcbiAgSXNBbmFseXRpY3NBc3Npc3RhbnRBdmFpbGFibGUgPSAnaXMtYW5hbHl0aWNzLWFzc2lzdGFudC1hdmFpbGFibGUnLFxuICBJc0V4Y2x1ZGVNb2RlID0gJ2lzLWV4Y2x1ZGUnLFxuICBJc0V4dGVuc2lvbkRpYWxvZyA9ICdpcy1leHRlbnNpb24tZGlhbG9nJyxcbiAgSXNGcm9tQ2FsY0RpYWxvZyA9ICdpcy1mcm9tLWNhbGMtZGlhbG9nJyxcblxuICBKb2luRGVzY3JpcHRpb24gPSAnam9pbi1kZXNjcmlwdGlvbicsXG5cbiAgTG9naWNhbFRhYmxlSWQgPSAnbG9naWNhbC10YWJsZS1pZCcsXG4gIExvZ2ljYWxUYWJsZUluZm9MaXN0ID0gJ2xvZ2ljYWwtdGFibGUtaW5mby1saXN0JyxcblxuICBNYXJrc0NhcmRJbmRleCA9ICdtYXJrcy1jYXJkLWluZGV4JyxcbiAgTWF4SGVpZ2h0ID0gJ21heC1oZWlnaHQnLFxuICBNYXhSb3dzID0gJ21heC1yb3dzJyxcbiAgTWF4V2lkdGggPSAnbWF4LXdpZHRoJyxcbiAgTWluSGVpZ2h0ID0gJ21pbi1oZWlnaHQnLFxuICBNaW5XaWR0aCA9ICdtaW4td2lkdGgnLFxuXG4gIFBhZ2VSb3dDb3VudCA9ICdwYWdlLXJvdy1jb3VudCcsXG4gIFBhcmFtZXRlckNhcHRpb24gPSAncGFyZW1ldGVyLWNhcHRpb24nLFxuICBQYXJhbWV0ZXJFcnJvciA9ICdwYXJhbWV0ZXItZXJyb3InLFxuICBQYXJhbWV0ZXJGaWVsZE5hbWUgPSAncGFyYW1ldGVyLWZpZWxkLW5hbWUnLFxuICBQYXJhbWV0ZXJJbmZvID0gJ3BhcmFtZXRlci1pbmZvJyxcbiAgUGFyYW1ldGVySW5mb3MgPSAncGFyYW1ldGVyLWluZm9zJyxcbiAgUGFyYW1ldGVyVmFsdWUgPSAncGFyYW1ldGVyLXZhbHVlJyxcbiAgUGVyaW9kVHlwZSA9ICdwZXJpb2QtdHlwZScsXG4gIFB1bHNlRmllbGROYW1lID0gJ2ZpZWxkTmFtZScsXG4gIFB1bHNlRmllbGROYW1lcyA9ICdmaWVsZE5hbWVzJyxcbiAgUHVsc2VGaWx0ZXJEb21haW5UeXBlID0gJ2RvbWFpblR5cGUnLFxuICBQdWxzZUZpbHRlckRvbWFpblNlYXJjaFRlcm0gPSAnc2VhcmNoVGVybScsXG4gIFB1bHNlUGFnZVNpemUgPSAncGFnZVNpemUnLFxuICBQdWxzZU5leHRQYWdlVG9rZW4gPSAnbmV4dFBhZ2VUb2tlbicsXG4gIFB1bHNlRmlsdGVycyA9ICdmaWx0ZXJzJyxcbiAgUHVsc2VUaW1lRGltZW5zaW9uID0gJ3RpbWVEaW1lbnNpb24nLFxuXG4gIFF1YW50aXRhdGl2ZURvbWFpbiA9ICdxdWFudGl0YXRpdmUtZG1haW4nLFxuICBRdWFudFJhbmdlU2VsZWN0aW9uTW9kZWxzID0gJ3F1YW50YXRpdmVSYW5nZVNlbGVjdGlvbk1vZGVscycsXG5cbiAgUmFuZ2VOID0gJ3JhbmdlLW4nLFxuICBSZXBsYXlTcGVlZCA9ICdyZXBsYXktc3BlZWQnLFxuXG4gIFNlbGVjdGVkRGF0YSA9ICdzZWxlY3RlZC1kYXRhJyxcbiAgU2VsZWN0ZWRTaGVldE5hbWVzID0gJ3NlbGVjdGVkLXNoZWV0LW5hbWVzJyxcbiAgU2VsZWN0aW9uID0gJ3NlbGVjdGlvbicsXG4gIFNlbGVjdGlvbkxpc3QgPSAnc2VsZWN0aW9uLWxpc3QnLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlID0gJ3NlbGVjdGlvblVwZGF0ZVR5cGUnLFxuICBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbiA9ICdzZWxlY3QtdHVwbGVzLWludGVyYWN0aW9uJyxcbiAgU2VuZE5vdGlmaWNhdGlvbnMgPSAnc2VuZC1ub3RpZmljYXRpb25zJyxcbiAgU2V0dGluZ3NWYWx1ZXMgPSAnc2V0dGluZ3MtdmFsdWVzJyxcbiAgU2hhcmVkRmlsdGVyU2hlZXRzID0gJ3NoYXJlZC1maWx0ZXItc2hlZXRzJyxcbiAgU2hhcmVkRmlsdGVyc0luZm8gPSAnc2hhcmVkLWZpbHRlcnMtaW5mbycsXG4gIFNoZWV0SWRlbnRpZmllciA9ICdzaGVldC1pZGVudGlmaWVyJyxcbiAgU2hlZXROYW1lID0gJ3NoZWV0LW5hbWUnLFxuICBTaGVldFBhdGggPSAnc2hlZXQtcGF0aCcsXG4gIFNob3VsZFJlZnJlc2hEUyA9ICdzaG91bGQtcmVmcmVzaC1kcycsXG4gIFNob3dEYXRhVGFibGVGb3JtYXQgPSAnc2hvdy1kYXRhLXRhYmxlLWZvcm1hdCcsXG4gIFN0YXJ0SW5kZXggPSAnc3RhcnQtaW5kZXgnLFxuICBTdGF0ZSA9ICdzdGF0ZScsXG4gIFN0b3J5UG9pbnRJbmRleCA9ICdzdG9yeS1wb2ludC1pbmRleCcsXG4gIFN0b3J5UG9pbnRJbmZvID0gJ3N0b3J5LXBvaW50LWluZm8nLFxuICBTd2l0Y2hUb1NoZWV0TmFtZSA9ICdzd2l0Y2gtdG8tc2hlZXQtbmFtZScsXG5cbiAgVGFyZ2V0UG9pbnQgPSAndGFyZ2V0LXBvaW50JyxcbiAgVGVzdENvbnZlcnNpb25QYXJhbWV0ZXIgPSAndGVzdC1jb252ZXJzaW9uLXBhcmFtZXRlcicsXG4gIFRleHQgPSAnZm9ybWF0dGVkLXRleHQnLFxuICBUb0luZGV4ID0gJ3RvLWluZGV4JyxcbiAgVG9vbHRpcENvbnRleHQgPSAndG9vbHRpcC1jb250ZXh0JyxcbiAgVG9vbHRpcFRleHRSZXF1ZXN0ID0gJ3Rvb2x0aXAtdGV4dC1yZXF1ZXN0JyxcbiAgVG9vbHRpcFRleHQgPSAndG9vbHRpcC10ZXh0JyxcblxuICBVbmRlcmx5aW5nRGF0YVRhYmxlID0gJ3VuZGVybHlpbmctZGF0YS10YWJsZScsXG4gIFVuZGVybHlpbmdTdW1tYXJ5RGF0YVRhYmxlID0gJ3VuZGVybHlpbmctc3VtbWFyeS1kYXRhLXRhYmxlJyxcbiAgVXJsID0gJ3VybCcsXG4gIFVzZVRhYkRlbGltaXRlcnMgPSAndXNlLXRhYi1kZWxpbWl0ZXJzJyxcblxuICBWaWV3RGF0YVRhYmxlQ2FjaGVJZCA9ICd2aWV3LWRhdGEtdGFibGUtY2FjaGUtaWQnLFxuICBWaWV3RGF0YVRhYmxlSWQgPSAndmlldy1kYXRhLXRhYmxlLWlkJyxcbiAgVmlzdWFsSWQgPSAndmlzdWFsLWlkJyxcbiAgVmlzdWFsU3BlY2lmaWNhdGlvbiA9ICd2aXN1YWwtc3BlY2lmaWNhdGlvbicsXG4gIFZpekFQSUlucHV0SnNvbiA9ICd2aXphcGktaW5wdXQtanNvbicsXG4gIFZpekFQSVN0YXRlV2l0aERhdGFNb2RlbCA9ICd2aXphcGktc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgVml6QVBJU3RhdGVXYXJuaW5nTXNnID0gJ3ZpemFwaS1zdGF0ZS13YXJuaW5nLW1zZycsXG4gIFZpekFQSVNWRyA9ICd2aXphcGktc3ZnJyxcblxuICBXb3Jrc2hlZXROYW1lID0gJ3dvcmtzaGVldC1uYW1lJyxcbiAgV29ya3NoZWV0RmlsdGVycyA9ICd3b3Jrc2hlZXQtZmlsdGVycycsXG5cbiAgWm9uZUlkc1Zpc2liaWxpdHlNYXAgPSAnem9uZS1pZHMtdmlzaWJpbGl0eS1tYXAnLFxufVxuIiwiLy8gRGVjbGFyZSB0aGlzIGtleSB0eXBlIGFuZCBleHBvcnQgdGhlIE5vdGlmaWNhdGlvbklkIHRvIG1ha2UgdGhpcyBiZWhhdmUgbGlrZSBhIHN0cmluZyBlbnVtLlxuLy9cbi8vIFBMRUFTRSBLRUVQIElOIEFMUEhBQkVUSUNBTCBPUkRFUi4gVGhpcyBoZWxwcyB3aXRoIHZpc3VhbGx5IGZpbmRpbmcgZW50cmllcywga25vd2luZyB3aGVyZSB0byBwdXRcbi8vIG5ldyBvbmVzLCBhbmQgbWVyZ2UgY29uZmxpY3RzLlxuZXhwb3J0IGVudW0gVmVyYklkIHtcbiAgQWN0aXZhdGVOZXh0U3RvcnlQb2ludCA9ICdhY3RpdmF0ZS1uZXh0LXN0b3J5LXBvaW50JyxcbiAgQWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnQgPSAnYWN0aXZhdGUtcHJldmlvdXMtc3RvcnktcG9pbnQnLFxuICBBY3RpdmF0ZVNoZWV0ID0gJ2FjdGl2YXRlU2hlZXQnLFxuICBBY3RpdmF0ZVN0b3J5UG9pbnQgPSAnYWN0aXZhdGUtc3RvcnktcG9pbnQnLFxuICBBZGRNYXJrc0NhcmRGaWVsZHMgPSAnYWRkLW1hcmtzLWNhcmQtZmllbGRzJyxcbiAgQXBwZW5kRXh0ZXJuYWxNZW51SXRlbSA9ICdhcHBlbmQtZXh0ZXJuYWwtbWVudS1pdGVtJyxcbiAgQXBwbHlDYXRlZ29yaWNhbEZpbHRlciA9ICdjYXRlZ29yaWNhbC1maWx0ZXInLFxuICBBcHBseVB1bHNlRmlsdGVycyA9ICdhcHBseS1wdWxzZS1maWx0ZXJzJyxcbiAgQXBwbHlQdWxzZVRpbWVEaW1lbnNpb24gPSAnYXBwbHktcHVsc2UtdGltZS1kaW1lbnNpb24nLFxuICBBcHBseVJhbmdlRmlsdGVyID0gJ3JhbmdlLWZpbHRlcicsXG4gIEFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyID0gJ2FwcGx5LXJlbGF0aXZlLWRhdGUtRmlsdGVyJyxcbiAgQXV0aGVudGljYXRlID0gJ2F1dGhlbnRpY2F0ZScsXG5cbiAgQmxvY2tFeHRlbnNpb24gPSAnYmxvY2stZXh0ZW5zaW9uJyxcblxuICBDaGFuZ2VQYXJhbWV0ZXJWYWx1ZSA9ICdjaGFuZ2UtcGFyYW1ldGVyLXZhbHVlJyxcbiAgQ2hhbmdlU2hhcmVkRmlsdGVyID0gJ2NoYW5nZS1zaGFyZWQtZmlsdGVyJyxcbiAgQ2xlYXJBbGxQdWxzZUZpbHRlcnMgPSAnY2xlYXItYWxsLXB1bHNlLWZpbHRlcnMnLFxuICBDbGVhckZpbHRlciA9ICdjbGVhci1maWx0ZXInLFxuICBDbGVhclB1bHNlRmlsdGVycyA9ICdjbGVhci1wdWxzZS1maWx0ZXJzJyxcbiAgQ2xlYXJTZWxlY3RlZE1hcmtzID0gJ2NsZWFyLXNlbGVjdGVkLW1hcmtzJyxcbiAgQ2xvc2VEaWFsb2cgPSAnY2xvc2UtZGlhbG9nJyxcbiAgQ3JlYXRlQW5ub3RhdGlvbiA9ICdjcmVhdGUtYW5ub3RhdGlvbicsXG5cbiAgRGFzaGJvYXJkQ2F0ZWdvcmljYWxGaWx0ZXIgPSAnZGFzaGJvYXJkLWNhdGVnb3JpY2FsLWZpbHRlcicsXG4gIERpc3BsYXlEaWFsb2cgPSAnZGlzcGxheS1kaWFsb2cnLFxuICBEb3dubG9hZFdvcmtib29rID0gJ2Rvd25sb2FkLXdvcmtib29rJyxcblxuICBFZGl0QWxpYXNlc0RpYWxvZyA9ICdlZGl0LWFsaWFzZXMtZGlhbG9nJyxcbiAgRXhlY3V0ZUV4dGVybmFsTWVudUl0ZW0gPSAnZXhlY3V0ZS1leHRlcm5hbC1tZW51LWl0ZW0nLFxuICBFeHBvcnRDcm9zc3RhYiA9ICdleHBvcnQtY3Jvc3N0YWInLFxuICBFeHBvcnRDcm9zc3RhYkNzdkRvd25sb2FkID0gJ2V4cG9ydC1jcm9zc3RhYi1jc3YtZG93bmxvYWQnLFxuICBFeHBvcnRDcm9zc3RhYkV4Y2VsRG93bmxvYWQgPSAnZXhwb3J0LWNyb3NzdGFiLWV4Y2VsLWRvd25sb2FkJyxcbiAgRXhwb3J0RGF0YSA9ICdleHBvcnQtZGF0YScsXG4gIEV4cG9ydERhdGFEb3dubG9hZCA9ICdleHBvcnQtZGF0YS1kb3dubG9hZCcsXG4gIEV4cG9ydEltYWdlID0gJ2V4cG9ydC1pbWFnZScsXG4gIEV4cG9ydFBkZiA9ICdleHBvcnQtcGRmJyxcbiAgRXhwb3J0UGRmRG93bmxvYWQgPSAnZXhwb3J0LXBkZi1kb3dubG9hZCcsXG4gIEV4cG9ydFBvd2VycG9pbnQgPSAnZXhwb3J0LXBvd2VycG9pbnQnLFxuICBFeHBvcnRQb3dlcnBvaW50RG93bmxvYWQgPSAnZXhwb3J0LXBvd2VycG9pbnQtZG93bmxvYWQnLFxuXG4gIEZpbmRQYXJhbWV0ZXIgPSAnZmluZC1wYXJhbWV0ZXInLFxuXG4gIEdldEFjdGl2ZVRhYmxlcyA9ICdnZXQtYWN0aXZlLXRhYmxlcycsXG4gIEdldEFsbERhdGFTb3VyY2VzID0gJ2dldC1hbGwtZGF0YS1zb3VyY2VzJyxcbiAgR2V0QW5ub3RhdGlvbnMgPSAnZ2V0LWFubm90YXRpb25zJyxcbiAgR2V0Q2F0ZWdvcmljYWxEb21haW4gPSAnZ2V0LWNhdGVnb3JpY2FsLWRvbWFpbicsXG4gIEdldENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcmllcyA9ICdnZXQtY29ubmVjdGlvbi1kZXNjcmlwdGlvbi1zdW1tYXJpZXMnLFxuICBHZXRDdXJyZW50U3JjID0gJ2dldC1jdXJyZW50LXNyYycsXG4gIEdldEN1c3RvbVZpZXdzID0gJ2dldC1jdXN0b20tdmlld3MnLFxuICBHZXREYXNoYm9hcmRGaWx0ZXJzID0gJ2dldC1kYXNoYm9hcmQtZmlsdGVycycsXG4gIEdldERhdGFTb3VyY2UgPSAnZ2V0LWRhdGFzb3VyY2UnLFxuICBHZXREYXRhU291cmNlRGF0YSA9ICdnZXQtZGF0YXNvdXJjZS1kYXRhJyxcbiAgR2V0RGF0YVNvdXJjZXMgPSAnZ2V0LWRhdGEtc291cmNlcycsXG4gIEdldERhdGFTdW1tYXJ5RGF0YSA9ICdnZXQtc3VtbWFyeS1kYXRhJyxcbiAgR2V0RGF0YVN1bW1hcnlEYXRhUmVhZGVyID0gJ2dldC1zdW1tYXJ5LWRhdGEtcmVhZGVyJyxcbiAgR2V0RGF0YVRhYmxlUmVhZGVyUGFnZSA9ICdnZXQtZGF0YS10YWJsZS1yZWFkZXItcGFnZScsXG4gIEdldEVtYmVkZGluZ0Fic3RyYWN0UXVlcnlXaXRoRGF0YU1vZGVsID0gJ2dldC1lbWJlZGRpbmctYWJzdHJhY3QtcXVlcnktd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RW1iZWRkaW5nQ2xpZW50SW5mbyA9ICdnZXQtZW1iZWRkaW5nLWNsaWVudC1pbmZvJyxcbiAgR2V0Vml6U3RhdGVXaXRoRGF0YU1vZGVsID0gJ2dldC12aXotc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgR2V0RXhwb3J0Q3Jvc3N0YWJTaGVldE1hcCA9ICdnZXQtZXhwb3J0LWNyb3NzdGFiLXNoZWV0LW1hcCcsXG4gIEdldEV4cG9ydFBkZk9wdGlvbnMgPSAnZ2V0LWV4cG9ydC1wZGYtb3B0aW9ucycsXG4gIEdldEZpZWxkID0gJ2dldC1maWVsZCcsXG4gIEdldEZpZWxkQW5kRGF0YVNvdXJjZSA9ICdnZXQtZmllbGQtYW5kLWRhdGFzb3VyY2UnLFxuICBHZXRWaXN1YWxTcGVjaWZpY2F0aW9uID0gJ2dldC12aXN1YWwtc3BlY2lmaWNhdGlvbicsXG4gIEdldEZpbHRlcnMgPSAnZ2V0LWZpbHRlcnMnLFxuICBHZXRGb250cyA9ICdnZXQtZm9udHMnLFxuICBHZXRIaWdobGlnaHRlZE1hcmtzID0gJ2dldC1oaWdobGlnaHRlZC1tYXJrcycsXG4gIEdldEpvaW5EZXNjcmlwdGlvbiA9ICdnZXQtam9pbi1kZXNjcmlwdGlvbicsXG4gIEdldExvZ2ljYWxUYWJsZURhdGEgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YScsXG4gIEdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXIgPSAnZ2V0LWxvZ2ljYWwtdGFibGUtZGF0YS1yZWFkZXInLFxuICBHZXRMb2dpY2FsVGFibGVzID0gJ2dldC1sb2dpY2FsLXRhYmxlcycsXG4gIEdldFBhcmFtZXRlcnNGb3JTaGVldCA9ICdnZXQtcGFyYW1ldGVycy1mb3Itc2hlZXQnLFxuICBHZXRQdWxzZUNhdGVnb3JpY2FsRG9tYWluID0gJ2dldC1wdWxzZS1jYXRlZ29yaWNhbC1kb21haW4nLFxuICBHZXRQdWxzZUZpbHRlcnMgPSAnZ2V0LXB1bHNlLWZpbHRlcnMnLFxuICBHZXRQdWxzZVRpbWVEaW1lbnNpb24gPSAnZ2V0LXB1bHNlLXRpbWUtZGltZW5zaW9uJyxcbiAgR2V0UmFuZ2VEb21haW4gPSAnZ2V0LXJhbmdlLWRvbWFpbicsXG4gIEdldFNlbGVjdGVkTWFya3MgPSAnZ2V0LXNlbGVjdGVkLW1hcmtzJyxcbiAgR2V0U2hhcmVkRmlsdGVyID0gJ2dldC1zaGFyZWQtZmlsdGVyJyxcbiAgR2V0VG9vbHRpcFRleHQgPSAnZ2V0LXRvb2x0aXAtdGV4dCcsXG4gIEdldFVuZGVybHlpbmdEYXRhID0gJ2dldC11bmRlcmx5aW5nLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVEYXRhID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlLWRhdGEnLFxuICBHZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyID0gJ2dldC11bmRlcmx5aW5nLXRhYmxlLWRhdGEtcmVhZGVyJyxcbiAgR2V0VW5kZXJseWluZ1RhYmxlcyA9ICdnZXQtdW5kZXJseWluZy10YWJsZXMnLFxuXG4gIEhpZXJhcmNoaWNhbEZpbHRlciA9ICdoaWVyYWNoaWNhbC1maWx0ZXInLFxuXG4gIEluaXRpYWxpemVFeHRlbnNpb24gPSAnaW5pdGlhbGl6ZS1leHRlbnNpb24nLFxuICBJc0FuYWx5dGljc0Fzc2lzdGFudEF2YWlsYWJsZSA9ICdpcy1hbmFseXRpY3MtYXNzaXN0YW50LWF2YWlsYWJsZScsXG5cbiAgTGF1bmNoQW5hbHl0aWNzQXNzaXN0YW50ID0gJ2xhdW5jaC1hbmFseXRpY3MtYXNzaXN0YW50JyxcblxuICBNb3ZlQW5kUmVzaXplWm9uZXMgPSAnbW92ZS1hbmQtcmVzaXplLXpvbmVzJyxcbiAgTW92ZU1hcmtzQ2FyZEZpZWxkID0gJ21vdmUtbWFya3MtY2FyZC1maWVsZCcsXG5cbiAgUmFpc2VMZWF2ZU1hcmtOYXZOb3RpZmljYXRpb24gPSAncmFpc2UtbGVhdmUtbWFyay1uYXYtbm90aWZpY2F0aW9uJyxcbiAgUmFpc2VIb3ZlclR1cGxlTm90aWZpY2F0aW9uID0gJ3JhaXNlLWhvdmVyLXR1cGxlLW5vdGlmaWNhdGlvbicsXG4gIFJhaXNlU2VsZWN0VHVwbGVzTm90aWZpY2F0aW9uID0gJ3JhaXNlLXNlbGVjdC10dXBsZXMtbm90aWZpY2F0aW9uJyxcbiAgUmVkbyA9ICdyZWRvJyxcbiAgUmVmcmVzaERhdGFTb3VyY2UgPSAncmVmcmVzaC1kYXRhLXNvdXJjZScsXG4gIFJlbGVhc2VEYXRhVGFibGVSZWFkZXIgPSAncmVsZWFzZS1kYXRhLXRhYmxlLXJlYWRlcicsXG4gIFJlbW92ZUFubm90YXRpb24gPSAncmVtb3ZlLWFubm90YXRpb24nLFxuICBSZW1vdmVDdXN0b21WaWV3ID0gJ3JlbW92ZS1jdXN0b20tdmlldycsXG4gIFJlbW92ZUV4dGVybmFsTWVudUl0ZW0gPSAncmVtb3ZlLWV4dGVybmFsLW1lbnUtaXRlbScsXG4gIFJlbmFtZUV4dGVybmFsTWVudSA9ICdyZW5hbWUtZXh0ZXJuYWwtbWVudScsXG4gIFJlcGxheUFuaW1hdGlvbiA9ICdyZXBsYXktYW5pbWF0aW9uJyxcbiAgUmVwb3J0RXh0ZW5zaW9uUmVuZGVyQ29tcGxldGUgPSAncmVwb3J0LWV4dGVuc2lvbi1yZW5kZXItY29tcGxldGUnLFxuICBSZXZlcnRTdG9yeVBvaW50ID0gJ3JldmVydC1zdG9yeS1wb2ludCcsXG4gIFJldmVydFdvcmtib29rID0gJ3JldmVydC13b3JrYm9vaycsXG5cbiAgU2F2ZUV4dGVuc2lvblNldHRpbmdzID0gJ3NhdmUtZXh0ZW5zaW9uLXNldHRpbmdzJyxcbiAgU2F2ZVdvcmtib29rQXNDdXN0b21WaWV3ID0gJ3NhdmUtd29ya2Jvb2stYXMtY3VzdG9tLXZpZXcnLFxuICBTZWxlY3RCeVZhbHVlID0gJ3NlbGVjdC1ieS12YWx1ZScsXG4gIFNldEFjdGl2ZUN1c3RvbVZpZXdBc0RlZmF1bHQgPSAnc2V0LWFjdGl2ZS1jdXN0b20tdmlldy1hcy1kZWZhdWx0JyxcbiAgU2V0QXV0b1VwZGF0ZSA9ICdzZXQtYXV0by11cGRhdGUnLFxuICBTZXRDbGlja1Rocm91Z2ggPSAnc2V0LWNsaWNrLXRocm91Z2gnLFxuICBTZW5kRGlhbG9nTWVzc2FnZSA9ICdzZW5kLWRpYWxvZy1tZXNzYWdlJyxcbiAgU2VuZE1lc3NhZ2VUb1BhcmVudCA9ICdzZW5kLW1lc3NhZ2UtdG8tcGFyZW50JyxcbiAgU2V0Vml6U3RhdGVXaXRoRGF0YU1vZGVsID0gJ3NldC12aXotc3RhdGUtd2l0aC1kYXRhLW1vZGVsJyxcbiAgU2V0U2hlZXRTaXplID0gJ3NldC1zaGVldC1zaXplJyxcbiAgU2V0Wm9uZVZpc2liaWxpdHkgPSAnc2V0LXpvbmUtdmlzaWJpbGl0eScsXG4gIFNoYXJlID0gJ3NoYXJlJyxcbiAgU2hvd0N1c3RvbVZpZXcgPSAnc2hvdy1jdXN0b20tdmlldycsXG4gIFNwbGljZU1hcmtzQ2FyZEZpZWxkcyA9ICdzcGxpY2UtbWFya3MtY2FyZC1maWVsZHMnLFxuXG4gIFRlc3RDb252ZXJzaW9uVmVyYiA9ICd0ZXN0LWNvbnZlcnNpb24tdmVyYicsXG5cbiAgVW5kbyA9ICd1bmRvJyxcbiAgVXBkYXRlQ3VzdG9tVmlldyA9ICd1cGRhdGUtY3VzdG9tLXZpZXcnLFxuXG4gIFZpekFQSSA9ICd2aXotYXBpJyxcbn1cbiIsImV4cG9ydCBlbnVtIEFza0RhdGFPcHRpb25OYW1lcyB7XG4gIHRva2VuID0gJ3Rva2VuJyxcbiAgb3JpZ2luID0gJ29yaWdpbicsXG4gIHNob3dFbWJlZCA9ICdzaG93RW1iZWQnLFxuICBzaG93UGluID0gJ3Nob3dQaW4nLFxuICBzaG93U2F2ZSA9ICdzaG93U2F2ZScsXG4gIHNob3dTaGFyZSA9ICdzaG93U2hhcmUnLFxuICBkZWJ1ZyA9ICc6anNkZWJ1ZycsXG4gIEFwaUlEID0gJzphcGlJRCcsXG4gIEFwaUV4dGVybmFsVmVyc2lvbiA9ICc6YXBpRXh0ZXJuYWxWZXJzaW9uJyxcbiAgQXBpSW50ZXJuYWxWZXJzaW9uID0gJzphcGlJbnRlcm5hbFZlcnNpb24nLFxuICBBc2tEYXRhV2ViQ29tcG9uZW50ID0gJzphc2tEYXRhV2ViQ29tcG9uZW50Jyxcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgSW5pdGlhbGl6YXRpb25PcHRpb25zIHtcbiAgaXNBbHBoYT86IGJvb2xlYW47XG4gIHBsYXRmb3JtSXNPZmZpY2lhbFJlbGVhc2U/OiBib29sZWFuO1xuICBpc0V4dGVuc2lvbkRpYWxvZz86IGJvb2xlYW47XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJy4uL2NvbnRyYWN0L01vZGVscyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25JZCB9IGZyb20gJy4uL2NvbnRyYWN0L05vdGlmaWNhdGlvbnMnO1xuaW1wb3J0IHsgVmVyYklkIH0gZnJvbSAnLi4vY29udHJhY3QvVmVyYnMnO1xuaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4vVmVyc2lvbk51bWJlcic7XG5cbmV4cG9ydCB0eXBlIE5vdGlmaWNhdGlvbkhhbmRsZXIgPSAobm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pID0+IHZvaWQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0ZVBhcmFtZXRlcnMge1xuICBba2V5OiBzdHJpbmddOiBNb2RlbDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRlUmVzcG9uc2Uge1xuICByZXN1bHQ6IE1vZGVsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5vdGlmaWNhdGlvbiB7XG4gIG5vdGlmaWNhdGlvbklkOiBOb3RpZmljYXRpb25JZDtcbiAgZGF0YTogTW9kZWw7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIHtcbiAgZXhlY3V0ZSh2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogUHJvbWlzZTxFeGVjdXRlUmVzcG9uc2U+O1xuICByZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQ7XG4gIHVucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKGhhbmRsZXI6IE5vdGlmaWNhdGlvbkhhbmRsZXIpOiB2b2lkO1xufVxuXG4vLyBUaGlzIGZhY3RvcnkgZnVuY3Rpb24gd2lsbCBnZXQgY2FsbGVkIGZyb20gdGhlIGV4dGVybmFsIHNpZGUgb2YgdGhpbmdzIHRvIGluc3RhbnRpYXRlIGEgcHJvcGVybHlcbi8vIHZlcnNpb25lZCBBUEkgZGlzcGF0Y2hlciB3aGljaCB0aGlzIHBhcnRpY3VsYXIgdmVyc2lvbiBvZiBleHRlcm5hbCBrbm93cyBob3cgdG8gdXNlXG5leHBvcnQgdHlwZSBJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5ID0gKGludGVybmFsQ29udHJhY3RWZXJzaW9uOiBWZXJzaW9uTnVtYmVyKSA9PiBJbnRlcm5hbEFwaURpc3BhdGNoZXI7XG4iLCJleHBvcnQgZW51bSBQdWxzZU9wdGlvbk5hbWVzIHtcbiAgZW1iZWQgPSAnZW1iZWQnLFxuICB0b2tlbiA9ICd0b2tlbicsXG4gIGRpc2FibGVFeHBsb3JlRmlsdGVyID0gJ2Rpc2FibGVFeHBsb3JlRmlsdGVyJyxcbiAgbGF5b3V0ID0gJ2VtYmVkX2xheW91dCcsXG4gIHRoZW1lID0gJ2VtYmVkX3RoZW1lJyxcbiAgQXBpRXh0ZXJuYWxWZXJzaW9uID0gJzphcGlFeHRlcm5hbFZlcnNpb24nLFxuICBBcGlJbnRlcm5hbFZlcnNpb24gPSAnOmFwaUludGVybmFsVmVyc2lvbicsXG4gIEVtYmVkQ291bnQgPSAnOmVtYmNvdW50JyxcbiAgUHVsc2VXZWJDb21wb25lbnQgPSAnOnB1bHNlV2ViQ29tcG9uZW50Jyxcbn1cbiIsImV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvbk51bWJlciB7XG4gIG1ham9yOiBudW1iZXI7XG4gIG1pbm9yOiBudW1iZXI7XG4gIGZpeDogbnVtYmVyO1xufVxuIiwiLyoqXG4gKiBUaGVzZSBzdHJpbmdzIHdlcmUgKm1hbnVhbGx5IGNvcGllZCogZnJvbSB0aGUgc2VydmVyLFxuICogd29ya2dyb3VwL3NyYy9zaWxvcy90YWJsZWF1LXNlcnZlci9saWJyYXJpZXMvdGFiLWNvbnRyb2xsZXItdml6cWwvc3JjL2NvbS90YWJsZWF1c29mdHdhcmUvXG4gKiBjb250cm9sbGVyL3ZpenFsL2NvbnN0YW50cy9QYXJhbWV0ZXJLZXlzLmphdmEjTDlcbiAqIHNob3VsZCBiZSBleHBvcnRlZCBpbnN0ZWFkXG4gKiBwYXJhbWV0ZXJzIHRoYXQgdml6cWwgd2lsbCBhY2NlcHQgaW4gYW4gZW1iZWRkaW5nIFVSTFxuICoqL1xuZW51bSBWcWxQYXJhbWV0ZXJOYW1lcyB7XG4gIE9ORSA9ICcxJyxcbiAgQUxFUlRTID0gJzphbGVydHMnLFxuICBBTElBUyA9ICdhbGlhcycsXG4gIEFMTE9XX0RFRkVSUkVEX0JPT1RTVFJBUCA9ICc6YWxsb3dEZWZlcnJlZEJvb3RzdHJhcCcsXG4gIEFMTE9XX0FVVE9HRU5fV09SS1NIRUVUX1BIT05FX0xBWU9VVFMgPSAnYWxsb3dBdXRvZ2VuV29ya3NoZWV0UGhvbmVMYXlvdXRzJyxcbiAgQVBJX0lEID0gJzphcGlJRCcsXG4gIEFQUCA9ICc6YXBwJyxcbiAgQVRUQUNITUVOVCA9ICdhdHRhY2htZW50JyxcbiAgSVNfSVBBRF9BUFAgPSAnYXBwJyxcbiAgQU5JTUFURV9UUkFOU0lUSU9OID0gJzphbmltYXRlX3RyYW5zaXRpb24nLFxuICBBU0NFTkRJTkcgPSAnYXNjZW5kaW5nJyxcbiAgQVVUSEVOVElDQVRJT04gPSAnYXV0aGVudGljYXRpb24nLFxuICBBVFRSSUJVVEVTID0gJ2F0dHJpYnV0ZXMnLFxuICBBVVRIT1JJTkdfU0hFRVQgPSAnOmF1dGhTaGVldCcsXG4gIEFYSVMgPSAnYXhpcycsXG4gIEJPT1RTVFJBUF9XSEVOX05PVElGSUVEID0gJzpib290c3RyYXBXaGVuTm90aWZpZWQnLFxuICBCUk9XU0VSX0JBQ0tfQlVUVE9OX1VORE8gPSAnOmJyb3dzZXJCYWNrQnV0dG9uVW5kbycsXG4gIEJST1dTRVJfUkVOREVSSU5HX09OID0gJ2lzQnJvd3NlclJlbmRlcmluZycsXG4gIEJST1dTRVJfUkVOREVSSU5HX1RIUkVTSE9MRCA9ICdicm93c2VyUmVuZGVyaW5nVGhyZXNob2xkJyxcbiAgQ0hBUlNFVCA9ICdjaGFyc2V0JyxcbiAgQ0xJRU5UX0RJTUVOU0lPTiA9ICdjbGllbnREaW1lbnNpb24nLFxuICBDTElFTlRfSVAgPSAnY2xpZW50X2lwJyxcbiAgQ0xJRU5UX05VTSA9ICdjbGllbnROdW0nLFxuICBDT0xPTl9FTUJFRERFRCA9ICc6ZW1iZWRkZWQnLFxuICBDT0xPTl9NT0JJTEUgPSAnOm1vYmlsZScsXG4gIENPTE9OX0RFRVBfTElOS0lOR19ESVNBQkxFRCA9ICc6ZGVlcExpbmtpbmdEaXNhYmxlZCcsXG4gIENPTE9OX1dBVEVSTUFSSyA9ICc6d2F0ZXJtYXJrJyxcbiAgQ09NTUVOVFMgPSAnOmNvbW1lbnRzJyxcbiAgQ09NTUVOVElOR19FTkFCTEVEID0gJzpjb21tZW50aW5nRW5hYmxlZCcsXG4gIENPTU1FTlRJTkdfTUVOVElPTlNfRU5BQkxFRCA9ICc6Y29tbWVudGluZ01lbnRpb25zJyxcbiAgQ09OTkVDVElPTiA9ICdjb25uZWN0aW9uJyxcbiAgQ1JFQVRFRF9CWV9GRUFUVVJFID0gJ2NyZWF0ZWRCeUZlYXR1cmUnLFxuICBDUllQVEVEX1BBU1NXT1JEID0gJ2NyeXB0ZWQnLFxuICBDU1NERUJVRyA9ICc6Y3NzZGVidWcnLFxuICBDU1YgPSAnY3N2JyxcbiAgQ1VTVE9NX1ZJRVdTID0gJzpjdXN0b21WaWV3cycsXG4gIENWID0gJzpjdicsXG4gIENWX0lEID0gJ2N2SWQnLFxuICBEQVNIQk9BUkRfUE9SVF9TSVpFID0gJ2Rhc2hib2FyZFBvcnRTaXplJyxcbiAgREFUQV9ERVRBSUxTID0gJzpkYXRhRGV0YWlscycsXG4gIERBVEFTT1VSQ0UgPSAnZGF0YXNvdXJjZScsXG4gIERFQlVHID0gJzpkZWJ1ZycsXG4gIERFTEFZID0gJzpkZWxheScsXG4gIERFUFRIID0gJ2RlcHRoJyxcbiAgREVWSUNFX1RZUEUgPSAnOmRldmljZScsXG4gIERFVklDRV9QSVhFTF9SQVRJTyA9ICdkZXZpY2VQaXhlbFJhdGlvJyxcbiAgREVWSUNFX1BSRVZJRVdfTU9ERSA9ICc6ZGV2aWNlcHJldmlld21vZGUnLFxuICBESU1FTlNJT05TID0gJzpkaW1lbnNpb25zJyxcbiAgRElTQUJMRV9TSEFSRURfU0VTU0lPTlMgPSAnOmRpc2FibGVfc2hhcmVkX3Nlc3Npb25zJyxcbiAgRElTQUJMRV9VUkxfQUNUSU9OU19QT1BVUFMgPSAnOmRpc2FibGVVcmxBY3Rpb25zUG9wdXBzJyxcbiAgRElSRUNUSU9OID0gJ2RpcmVjdGlvbicsXG4gIERJU1BMQVlfT1ZFUkxBWSA9ICc6ZGlzcGxheV9vdmVybGF5JyxcbiAgRElTUExBWV9TSEFSRSA9ICc6ZGlzcGxheV9zaGFyZScsXG4gIERJU1BMQVlfU1BJTk5FUiA9ICc6ZGlzcGxheV9zcGlubmVyJyxcbiAgRElTUExBWV9TVEFUSUNfSU1BR0UgPSAnOmRpc3BsYXlfc3RhdGljX2ltYWdlJyxcbiAgRElTUExBWV9UQUJTID0gJ2Rpc3BsYXlfdGFicycsXG4gIERJU1BMQVlfVklFV19DT1VOVCA9ICc6ZGlzcGxheV9jb3VudCcsXG4gIElHTk9SRV9TVElDS1lfU0VTU0lPTiA9ICc6aWdub3JlX3N0aWNreV9zZXNzaW9uJyxcbiAgSU5DUkVNRU5UX1ZJRVdfQ09VTlQgPSAnOmluY3JlbWVudF92aWV3X2NvdW50JyxcbiAgRE9DTU9ERSA9ICdkb2Ntb2RlJyxcbiAgRE9NQUlOID0gJ2RvbWFpbicsXG4gIERPX1dPUksgPSAnZG9fd29yaycsXG4gIERYID0gJ2R4JyxcbiAgRFkgPSAnZHknLFxuICBFRElUX0RBVEFfQUxFUlQgPSAnOmVkaXREYXRhQWxlcnQnLFxuICBFTUJFRF9DT1VOVCA9ICc6ZW1iY291bnQnLCAvLyB0aGlzIHdhcyBub3QgZXhwb3J0ZWQgZnJvbSBQYXJhbWV0ZXJLZXlzLmphdmFcbiAgRU1CRUQgPSAnOmVtYmVkJyxcbiAgRU1CRURERUQgPSAnZW1iZWRkZWQnLFxuICBFTkNSWVBURUQgPSAnZW5jcnlwdGVkJyxcbiAgQVBJX0VYVEVSTkFMX1ZFUlNJT04gPSAnOmFwaUV4dGVybmFsVmVyc2lvbicsXG4gIEFQSV9JTlRFUk5BTF9WRVJTSU9OID0gJzphcGlJbnRlcm5hbFZlcnNpb24nLFxuICBFWENMVURFID0gJ2V4Y2x1ZGUnLFxuICBFWFBPUlRfRk9STUFUID0gJzpleHBvcnRfZm9ybWF0JyxcbiAgRklFTEROQU1FID0gJ2ZpZWxkbmFtZScsXG4gIEZJRUxEX05BTUUgPSAnZmllbGRfbmFtZScsXG4gIEZJRUxEX1NFUCA9ICdmaWVsZF9zZXAnLFxuICBGSUxFID0gJ2ZpbGUnLFxuICBGSUxURVJfVElMRV9TSVpFID0gJ2ZpbHRlclRpbGVTaXplJyxcbiAgRk4gPSAnZm4nLFxuICBGT0NVUyA9ICdmb2N1cycsXG4gIEZPUkNFX0NBQ0hFID0gJ2ZvcmNlX2NhY2hlJyxcbiAgRk9STUFUID0gJ2Zvcm1hdCcsXG4gIEZPUk1BVF9EQVRBX1ZBTFVFX0xPQ0FMTFkgPSAnZm9ybWF0RGF0YVZhbHVlTG9jYWxseScsXG4gIEZST01fV0cgPSAnOmZyb21fd2cnLFxuICBHUkFQSFFMX0RBVEFCQVNFX0lEID0gJzpncmFwaFFMRGF0YWJhc2VJZCcsXG4gIEdSQVBIUUxfVEFCTEVfSUQgPSAnOmdyYXBoUUxUYWJsZUlkJyxcbiAgR1VJRCA9ICc6Z3VpZCcsXG4gIEggPSAnaCcsXG4gIEhJRERFTiA9ICdoaWRkZW4nLFxuICBISURFX0NMT1NFX0JVVFRPTiA9ICc6aGlkZUNsb3NlQnV0dG9uJyxcbiAgSElERV9FRElUX0JVVFRPTiA9ICc6aGlkZUVkaXRCdXR0b24nLFxuICBISURFX0VESVRfSU5fREVTS1RPUF9CVVRUT04gPSAnOmhpZGVFZGl0SW5EZXNrdG9wQnV0dG9uJyxcbiAgSElHSF9EUEkgPSAnOmhpZ2hkcGknLFxuICBJTUFHRV9TSVpFX0xJTUlUID0gJ2ltYWdlU2l6ZUxpbWl0JyxcbiAgVFJBTlNQQVJFTlRfTElORV9NQVJLU19MSU1JVCA9ICd0cmFuc3BhcmVudExpbmVNYXJrTGltaXQnLFxuICBDTElFTlRfUkVOREVSX1BJWEVMX0xJTUlUID0gJ2NsaWVudFJlbmRlclBpeGVsTGltaXQnLFxuICBJTiA9ICdpbicsXG4gIElOU1RBTkNFX0lEID0gJzppaWQnLFxuICBJU19HVUVTVF9SRURJUkVDVF9GUk9NX1ZJWlBPUlRBTCA9ICc6aXNHdWVzdFJlZGlyZWN0RnJvbVZpenBvcnRhbCcsXG4gIElTX01BUktfQU5JTUFUSU9OX0VOQUJMRUQgPSAnaXNNYXJrQW5pbWF0aW9uRW5hYmxlZCcsXG4gIElTX1ZJWlBPUlRBTCA9ICc6aXNWaXpQb3J0YWwnLFxuICBJTlBVVF8gPSAnaW5wdXRfc3RyaW5nJyxcbiAgSlNERUJVRyA9ICc6anNkZWJ1ZycsXG4gIEpTT04gPSAnanNvbicsXG4gIEpTT05fT05MWSA9ICc6anNvbk9ubHknLFxuICBLRUVQRklMRSA9ICdrZWVwZmlsZScsXG4gIEtFWSA9ICdrZXknLFxuICBMQU5HVUFHRSA9ICdsYW5ndWFnZScsXG4gIExBTkdVQUdFX1JFUVVFU1RFRCA9ICc6bGFuZ3VhZ2UnLFxuICBMSU5LVEFSR0VUID0gJzpsaW5rdGFyZ2V0JyxcbiAgTE9BRF9PUkRFUl9JRCA9ICc6bG9hZE9yZGVySUQnLCAvLyB1c2VkIGZvciBQdWJsaWNcbiAgTE9BRF9ORVdFU1RfUkVWSVNJT04gPSAnOmxvYWROZXdlc3RSZXZpc2lvbicsXG4gIExPQ0FMX1BBVEhTID0gJzpsb2NhbFBhdGhzJyxcbiAgTE9DQUxFID0gJ2xvY2FsZScsXG4gIExPQ0FUSU9OX0lEID0gJ2xvY2F0aW9uaWQnLFxuICBMT0NBVElPTl9UWVBFID0gJ2xvY2F0aW9udHlwZScsXG4gIFdPUktCT09LX0xPQ0FMRSA9ICd3b3JrYm9va0xvY2FsZScsXG4gIE1BWFJPV1MgPSAnbWF4cm93cycsXG4gIE1BWF9BR0UgPSAnbWF4QWdlJyxcbiAgTUFYX1JPV1MgPSAnbWF4Um93cycsXG4gIE1FVEhPRCA9ICdtZXRob2QnLFxuICBNT0JJTEUgPSAnbW9iaWxlJyxcbiAgTU9ESUZJRVIgPSAnbW9kaWZpZXInLFxuICBOQU1FID0gJ25hbWUnLFxuICBOQVZfVFlQRSA9ICduYXZUeXBlJyxcbiAgTkFWX1NSQyA9ICduYXZTcmMnLFxuICBOT0FUVEFDSE1FTlQgPSAnbm8tYXR0YWNobWVudCcsXG4gIE5PX09WRVJXUklURSA9ICdub19vdmVyd3JpdGUnLFxuICBPUEVOX0FVVEhPUklOR19JTl9UT1BfV0lORE9XID0gJzpvcGVuQXV0aG9yaW5nSW5Ub3BXaW5kb3cnLFxuICBPUEVOSURfSEQgPSAnOm9wZW5pZF9oZCcsXG4gIE9QRU5JRF9MT0dJTl9ISU5UID0gJzpvcGVuaWRfbG9naW5faGludCcsXG4gIE9BVVRIUkVRVUVTVCA9ICdvYXV0aHJlcXVlc3QnLFxuICBPQVVUSF9DUkVERU5USUFMX0lEUyA9ICdvYXV0aF9jcmVkZW50aWFsX2lkcycsXG4gIE9GRkxJTkVfTU9ERSA9ICc6b2ZmbGluZW1vZGUnLFxuICBPUklHSU4gPSAnOm9yaWdpbicsXG4gIE9WRVJMQVkgPSAnOm92ZXJsYXknLFxuICBQID0gJ3AnLFxuICBQQVRIID0gJ3BhdGgnLFxuICBQQU5FX1JFU09MVkVSX1ggPSAncGFuZVJlc29sdmVyWCcsXG4gIFBBTkVfUkVTT0xWRVJfWSA9ICdwYW5lUmVzb2x2ZXJZJyxcbiAgUEFSQU0gPSAncGFyYW0nLFxuICBQQVJFTlRfSUQgPSAncGFyZW50X2lkJyxcbiAgUEFTU1dPUkQgPSAncGFzc3dvcmQnLFxuICBQQVRURVJOID0gJ3BhdHRlcm4nLFxuICBQSVhFTF9SQVRJTyA9ICc6cGl4ZWxyYXRpbycsXG4gIFBSRUZJWCA9ICc6cHJlZml4JyxcbiAgUFJFVklFVyA9ICc6cHJldmlldycsXG4gIFBSSU1BUllfQ09OVEVOVF9VUkwgPSAncHJpbWFyeV9jb250ZW50X3VybCcsXG4gIFBST0pFQ1QgPSAncHJvamVjdCcsXG4gIFBST1RPQ09MID0gJ3Byb3RvY29sJyxcbiAgUFNFVURPID0gJzpwc2V1ZG8nLFxuICBRVUVSWSA9ICdxdWVyeScsXG4gIFIgPSAncicsXG4gIFJBTkdFX1RZUEUgPSAncmFuZ2VfdHlwZScsXG4gIFJFQ09SRF9TRVAgPSAncmVjb3JkX3NlcCcsXG4gIFJFQ09SRF9DTElFTlRfUEVSRk9STUFOQ0UgPSAnOnJlY29yZF9jbGllbnRfcGVyZm9ybWFuY2UnLFxuICBSRUNPUkRfUEVSRk9STUFOQ0UgPSAnOnJlY29yZF9wZXJmb3JtYW5jZScsXG4gIFJFQ09WRVJfT0xEX1NFU1NJT05fSUQgPSAnOnJlY292ZXJfb2xkX3Nlc3Npb25faWQnLFxuICBSRUNPVkVSX1NFU1NJT05fU1RBVEVfVElDS0VUUyA9ICc6cmVjb3Zlcl9zZXNzaW9uX3N0YXRlX3RpY2tldHMnLFxuICBSRUZSRVNIID0gJzpyZWZyZXNoJyxcbiAgUkVGUkVTSFVOTU9ESUZJRUQgPSAnOnJlZnJlc2h1bm1vZGlmaWVkJyxcbiAgUkVHSU9OID0gJ3JlZ2lvbicsXG4gIFJFTE9BRF9PTl9DVVNUT01fVklFV19TQVZFID0gJzpyZWxvYWRPbkN1c3RvbVZpZXdTYXZlJyxcbiAgUkVOREVSID0gJzpyZW5kZXInLFxuICBSRU5ERVJfTUFQU19DTElFTlRfU0lERSA9ICdyZW5kZXJNYXBzQ2xpZW50U2lkZScsXG4gIFJFVFJZID0gJzpyZXRyeScsXG4gIFJFVVNFID0gJ3JldXNlJyxcbiAgUkVVU0VfRk9SRVZFUiA9ICdyZXVzZV9mb3JldmVyJyxcbiAgUkVWRVJUID0gJzpyZXZlcnQnLFxuICBTQVZFX0RCX1BBU1NXT1JEUyA9ICdzYXZlX2RiX3Bhc3N3b3JkcycsXG4gIFNFTEVDVF9YID0gJ3NlbGVjdF94JyxcbiAgU0VMRUNUX1kgPSAnc2VsZWN0X3knLFxuICBTRVNTSU9OX0ZFQVRVUkVfUFJFRklYID0gJzpmZl8nLFxuICBTRVNTSU9OX0ZMQUdTID0gJzpzZXNzaW9uX2ZlYXR1cmVfZmxhZ3MnLFxuICBTSEFSRV9CVVRUT04gPSAnc2hhcmVfYnV0dG9uJyxcbiAgU0hFRVRfSUQgPSAnc2hlZXRfaWQnLFxuICBTSEFSRUQgPSAnc2hhcmVkJyxcbiAgU0hPV0FMTCA9ICdzaG93YWxsJyxcbiAgU0hPV19BUFBfQkFOTkVSID0gJzpzaG93QXBwQmFubmVyJyxcbiAgU0hPV19BU0tfREFUQSA9ICc6c2hvd0Fza0RhdGEnLFxuICBTSE9XX1BBUkFNUyA9ICdzaG93UGFyYW1zJyxcbiAgU0hPV19TSEFSRV9PUFRJT05TID0gJzpzaG93U2hhcmVPcHRpb25zJyxcbiAgU0laRSA9ICc6c2l6ZScsXG4gIFNPVVJDRSA9ICdzb3VyY2UnLFxuICBTVEFURSA9ICdzdGF0ZScsXG4gIFNUSUNLWV9TRVNTSU9OX0tFWSA9ICdzdGlja3lTZXNzaW9uS2V5JyxcbiAgU1VCU0NSSVBUSU9OUyA9ICc6c3Vic2NyaXB0aW9ucycsXG4gIFNVTU1BUlkgPSAnc3VtbWFyeScsXG4gIFNVUFBSRVNTX0RFRkFVTFRfRURJVF9CRUhBVklPUiA9ICc6c3VwcHJlc3NEZWZhdWx0RWRpdEJlaGF2aW9yJyxcbiAgU1lOQ19TRVNTSU9OID0gJzpzeW5jX3Nlc3Npb24nLFxuICBTWU5DX1NFU1NJT05fU1RBVEUgPSAnc3luY19zZXNzaW9uX3N0YXRlJyxcbiAgVEFCUyA9ICc6dGFicycsXG4gIFRBUkdFVCA9ICd0YXJnZXQnLFxuICBUQVJHRVRfU0lURSA9ICd0YXJnZXRfc2l0ZScsXG4gIFRPT0xCQVIgPSAnOnRvb2xiYXInLFxuICBUT09MVElQID0gJzp0b29sdGlwJyxcbiAgVFMgPSAndHMnLFxuICBVTkRFUkxZSU5HX1RBQkxFX0lEID0gJ3VuZGVybHlpbmdfdGFibGVfaWQnLFxuICBVTkRFUkxZSU5HX1RBQkxFX0NBUFRJT04gPSAndW5kZXJseWluZ190YWJsZV9jYXB0aW9uJyxcbiAgVVBEQVRFX1RZUEUgPSAndXBkYXRlX3R5cGUnLFxuICBVU0VfR1VFU1QgPSAnOnVzZUd1ZXN0JyxcbiAgVVNFX0lOTElORV9JTUFHRVMgPSAndXNlX2lubGluZV9pbWFnZXMnLFxuICBVU0VSQUdFTlQgPSAndXNlcmFnZW50JyxcbiAgVVNFUk5BTUUgPSAndXNlcm5hbWUnLFxuICBWQUxVRSA9ICd2YWx1ZScsXG4gIFZFUkJPU0VfTU9ERSA9ICd2ZXJib3NlTW9kZScsXG4gIFZJRVdfSUQgPSAndmlld3NfaWQnLFxuICBWSVpfU05BUFNIT1RfSUQgPSAndml6X3NuYXBzaG90X2lkJyxcbiAgVlcgPSAnOnZ3JyxcbiAgVyA9ICd3JyxcbiAgV09SS1NIRUVUX1BPUlRfU0laRSA9ICd3b3Jrc2hlZXRQb3J0U2l6ZScsXG4gIFdBVEVSTUFSSyA9ICd3YXRlcm1hcmsnLFxuICBXQVRFUk1BUktfTUFSR0lOID0gJzp3YXRlcm1hcmtfbWFyZ2luJyxcbiAgV0IgPSAnOndiJyxcbiAgV0hJQ0ggPSAnd2hpY2gnLFxuICBYID0gJ3gnLFxuICBZID0gJ3knLFxuICBaSUQgPSAnemlkJyxcbiAgWk9ORV9JRCA9ICd6b25lX2lkJyxcbiAgS0VZQ0hBSU5fVkVSU0lPTiA9ICdrZXljaGFpbl92ZXJzaW9uJyxcbiAgREFUQVNPVVJDRV9JRCA9ICdkYXRhc291cmNlX2lkJyxcbiAgREFUQVNPVVJDRV9OQU1FID0gJ2RhdGFzb3VyY2VfbmFtZScsXG4gIExFTlNfSUQgPSAnbGVuc19pZCcsXG4gIFdJRFRIID0gJ3dpZHRoJyxcbiAgSEVJR0hUID0gJ2hlaWdodCcsXG5cbiAgLy8gRGVmYXVsdCBMYXlvdXQgcGFyYW1zXG4gIExBWU9VVF9WSUVXUyA9ICd2aWV3cycsXG4gIExBWU9VVF9NRU5VUyA9ICdtZW51cycsXG4gIExBWU9VVF9HRU9NRVRSWSA9ICdnZW9tZXRyeScsXG4gIExBWU9VVF9QQUdFUyA9ICdwYWdlcycsXG4gIExBWU9VVF9DQUNIRVVSTCA9ICdjYWNoZXVybCcsXG4gIExBWU9VVF9TSEVFVCA9ICdzaGVldCcsXG4gIExBWU9VVF9ERVBUSCA9ICdkZXB0aCcsXG59XG5cbi8qKlxuICogcGFyYW1ldGVycyB0aGF0IGFyZSBvbmx5IHJlbGV2YW50IHdoZW4gd29ya2luZyB3aXRoIFRhYmxlYXUgUHVibGljXG4gKiBtYXliZSBub3QgcmVhbGx5IG5lY2Vzc3J5IHRvIHNwbGl0IHRoZW0gb3V0XG4gKi9cbmVudW0gUHVibGljUGFyYW1ldGVyTmFtZXMge1xuICBTSE9XX1ZJWl9IT01FID0gJzpzaG93Vml6SG9tZScsXG4gIC8vIGRpc3BsYXkgdmlldyBjb3VudFxufVxuXG4vKipcbiAqIE1hcCB0aGUgcGFyYW1ldGVyIG5hbWVzIGFzIHVzZWQgaW4gdGhlIHVybCB0byB3aGF0IHdlIGNhbGwgdGhlbSBwdWJsaWNseSBpbiB0aGUgZW1iZWRkaW5nIGxpYnJhcnkuXG4gKiBUaGUgb25seSBwYXJhbWV0ZXJzIGxpc3RlZCBoZXJlIHNob3VsZCBiZSB0aGUgb25lcyB0aGF0IGdldCBzZW50IHRvIHZpenFsXG4gKiAgLSB0aGlzIHNob3VsZCBtYXRjaCB0aGUgaW50ZXJmYWNlIGF0IGV4dGVybmFsLWNvbnRyYWN0OlZpekludGVyZmFjZXM6Vml6U2V0dGluZ3NcbiAqL1xuZXhwb3J0IGVudW0gVml6T3B0aW9uTmFtZXMge1xuICAvLyBwdWJsaWNOYW1lID0gaW50ZXJuYWxTdHJpbmdWYWx1ZVxuICBTaXplID0gVnFsUGFyYW1ldGVyTmFtZXMuU0laRSxcbiAgRW1iZWQgPSBWcWxQYXJhbWV0ZXJOYW1lcy5FTUJFRCxcbiAgRW1iZWRDb3VudCA9IFZxbFBhcmFtZXRlck5hbWVzLkVNQkVEX0NPVU5ULFxuICBBcGlJbnRlcm5hbFZlcnNpb24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5BUElfSU5URVJOQUxfVkVSU0lPTixcbiAgQXBpRXh0ZXJuYWxWZXJzaW9uID0gVnFsUGFyYW1ldGVyTmFtZXMuQVBJX0VYVEVSTkFMX1ZFUlNJT04sXG4gIFNob3dWaXpIb21lID0gUHVibGljUGFyYW1ldGVyTmFtZXMuU0hPV19WSVpfSE9NRSxcbiAgSnNkZWJ1ZyA9IFZxbFBhcmFtZXRlck5hbWVzLkpTREVCVUcsXG4gIEJvb3RzdHJhcFdoZW5Ob3RpZmllZCA9IFZxbFBhcmFtZXRlck5hbWVzLkJPT1RTVFJBUF9XSEVOX05PVElGSUVELFxuICBOYXZUeXBlID0gVnFsUGFyYW1ldGVyTmFtZXMuTkFWX1RZUEUsXG4gIE5hdlNyYyA9IFZxbFBhcmFtZXRlck5hbWVzLk5BVl9TUkMsXG4gIGRlYnVnID0gVnFsUGFyYW1ldGVyTmFtZXMuSlNERUJVRyxcbiAgQXBpSUQgPSBWcWxQYXJhbWV0ZXJOYW1lcy5BUElfSUQsXG5cbiAgZGlzYWJsZVVybEFjdGlvbnNQb3B1cHMgPSBWcWxQYXJhbWV0ZXJOYW1lcy5ESVNBQkxFX1VSTF9BQ1RJT05TX1BPUFVQUyxcbiAgaGlkZVRhYnMgPSBWcWxQYXJhbWV0ZXJOYW1lcy5UQUJTLFxuICB0b29sYmFyID0gVnFsUGFyYW1ldGVyTmFtZXMuVE9PTEJBUixcbiAgZGV2aWNlID0gVnFsUGFyYW1ldGVyTmFtZXMuREVWSUNFX1RZUEUsXG4gIGluc3RhbmNlSWRUb0Nsb25lID0gVnFsUGFyYW1ldGVyTmFtZXMuSU5TVEFOQ0VfSUQsXG4gIHRvdWNoT3B0aW1pemUgPSBWcWxQYXJhbWV0ZXJOYW1lcy5NT0JJTEUsXG4gIGhpZGVFZGl0QnV0dG9uID0gVnFsUGFyYW1ldGVyTmFtZXMuSElERV9FRElUX0JVVFRPTixcbiAgaGlkZUVkaXRJbkRlc2t0b3BCdXR0b24gPSBWcWxQYXJhbWV0ZXJOYW1lcy5ISURFX0VESVRfSU5fREVTS1RPUF9CVVRUT04sXG4gIHN1cHByZXNzRGVmYXVsdEVkaXRCZWhhdmlvciA9IFZxbFBhcmFtZXRlck5hbWVzLlNVUFBSRVNTX0RFRkFVTFRfRURJVF9CRUhBVklPUixcbiAgaGlkZUNsb3NlQnV0dG9uID0gVnFsUGFyYW1ldGVyTmFtZXMuSElERV9DTE9TRV9CVVRUT04sXG59XG4iLCJpbXBvcnQgKiBhcyBndWlkIGZyb20gJ2d1aWQnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIE1vZGVsLCBOb3RpZmljYXRpb25JZCwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uT3B0aW9ucyB9IGZyb20gJy4uL2ludGVyZmFjZS9Jbml0aWFsaXphdGlvbk9wdGlvbnMnO1xuaW1wb3J0IHsgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZSB9IGZyb20gJy4vQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZSc7XG5pbXBvcnQge1xuICBpc0NvbW1hbmRNZXNzYWdlLFxuICBpc0NvbW1hbmRSZXNwb25zZU1lc3NhZ2UsXG4gIGlzSGFuZHNoYWtlTWVzc2FnZSxcbiAgaXNJbml0TWVzc2FnZSxcbiAgaXNNZXNzYWdlLFxuICBpc05vdGlmaWNhdGlvbk1lc3NhZ2UsXG59IGZyb20gJy4vTWVzc2FnZVR5cGVDaGVja3MnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZE1lc3NhZ2VIYW5kbGVyLFxuICBDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcixcbiAgSGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIsXG4gIEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcixcbiAgTm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIsXG59IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VMaXN0ZW5lcic7XG5pbXBvcnQge1xuICBDb21tYW5kTWVzc2FnZSxcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgSGFuZHNoYWtlTWVzc2FnZSxcbiAgSW5pdGlhbGl6ZU1lc3NhZ2UsXG4gIE1lc3NhZ2UsXG4gIE1lc3NhZ2VUeXBlLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxufSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuaW1wb3J0IHsgTWVzc2VuZ2VyIH0gZnJvbSAnLi9pbnRlcmZhY2UvTWVzc2VuZ2VyJztcbmltcG9ydCB7IFByZXBhcmVkTWVzc2FnZSB9IGZyb20gJy4vaW50ZXJmYWNlL1ByZXBhcmVkTWVzc2FnZSc7XG5cbi8qKlxuICogVGhlIENyb3NzRnJhbWVNZXNzZW5nZXIgaXMgdGhlIHByaW1hcnkgZXhwb3J0IGZyb20gdGhlIGFwaS1tZXNzYWdpbmcgbW9kdWxlLiBBbiBpbnN0YW5jZSBvZlxuICogdGhpcyBjbGFzcyBjYW4gYmUgaW5zdGFudGlhdGVkIG9uIGJvdGggc2lkZXMgb2YgYSBmcmFtZSBib3VuZGFyeSB0byBmYWNpbGl0YXRlIGNvbW11bmljYXRpb25cbiAqIGluIGJvdGggZGlyZWN0aW9ucyBiZXR3ZWVuIHRoZSBmcmFtZXMuIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBib3RoIHRoZSBkaXNwYXRjaGVyIGFuZCB0aGUgbGlzdGVuZXJcbiAqIHBvcnRpb25zLCBidXQgZG9lc24ndCByZXF1aXJlIGNhbGxlcnMgdG8gY2FyZSBhYm91dCBib3RoLlxuICovXG5leHBvcnQgY2xhc3MgQ3Jvc3NGcmFtZU1lc3NlbmdlciBpbXBsZW1lbnRzIE1lc3NlbmdlciB7XG4gIHByaXZhdGUgdW5yZWdpc3RlckZ1bmN0aW9uPzogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSBpbml0aWFsaXplTWVzc2FnZUhhbmRsZXI/OiBJbml0aWFsaXplTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgY29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXI/OiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBjb21tYW5kTWVzc2FnZUhhbmRsZXI/OiBDb21tYW5kTWVzc2FnZUhhbmRsZXI7XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXI/OiBOb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcjtcbiAgcHJpdmF0ZSBoYW5kc2hha2VNZXNzYWdlSGFuZGxlcj86IEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENyb3NzRnJhbWVNZXNzZW5nZXIuIElmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSB0aGUgQ3Jvc3NGcmFtZU1lc3NlbmdlciBhcyBhIE1lc3NhZ2VMaXN0ZW5lcixcbiAgICogYmUgc3VyZSB0byBjYWxsIFN0YXJ0TGlzdGVuaW5nIGFuZCByZWdpc3RlciBtZXNzYWdlIGhhbmRsZXJzLlxuICAgKiBAcGFyYW0gdGhpc1dpbmRvdyBUaGUgd2luZG93IG9iamVjdCB3aGljaCB0aGUgQ3Jvc3NGcmFtZU1lc3NlbmdlciBsaXZlcy4gQW4gb25NZXNzYWdlIGxpc3RlbmVyIHdpbGwgYmUgYWRkZWQgaGVyZS5cbiAgICogQHBhcmFtIFtvdGhlcldpbmRvd10gT3B0aW9uYWwgb3RoZXJXaW5kb3cgd2hpY2ggbWVzc2FnZXMgd2lsbCBiZSBwb3N0ZWQgdG8uXG4gICAqICAgICAgICAgICAgICAgICAgICAgIElmIGRlZmluZWQsIGluY29taW5nIG1lc3NhZ2VzIG11c3Qgb3JpZ2luYXRlIGZyb20gb3RoZXJXaW5kb3cgdG8gYmUgcGFzc2VkIG9uXG4gICAqIEBwYXJhbSBbb3RoZXJXaW5kb3dPcmlnaW5dIFRoZSB0YXJnZXQgb3JpZ2luIHdoaWNoIG90aGVyV2luZG93IG11c3QgaGF2ZSBpbiBvcmRlciB0byByZWNlaXZlIGRpc3BhdGNoZWQgbWVzc2FnZXMuXG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdmFsdWUgd2lsbCBiZSBzZW50IGFzIHRoZSB0YXJnZXRPcmlnaW4gb2YgYSBwb3N0TWVzc2FnZVxuICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1dpbmRvdy9wb3N0TWVzc2FnZSlcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHRoaXNXaW5kb3c6IFdpbmRvdyxcbiAgICBwcml2YXRlIG90aGVyV2luZG93PzogV2luZG93LFxuICAgIHByaXZhdGUgb3RoZXJXaW5kb3dPcmlnaW4/OiBzdHJpbmcsXG4gICkge1xuICAgIC8vIE1ha2Ugc3VyZSB0byBjYWxsIFN0YXJ0TGlzdGVuaW5nXG4gIH1cblxuICAvLy8vLyBNZXNzYWdlTGlzdGVuZXIgSW1wbGVtZW50YXRpb25cblxuICBwdWJsaWMgc3RhcnRMaXN0ZW5pbmcoKTogdm9pZCB7XG4gICAgLy8gQ2hlY2sgaWYgd2UgYWxyZWFkeSBhcmUgbGlzdGVuaW5nLCBpZiBub3QsIGhvb2sgdXAgYSBtZXNzYWdlIGxpc3RlbmVyXG4gICAgaWYgKCF0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbikge1xuICAgICAgY29uc3QgYm91bmRIYW5kbGVyID0gdGhpcy5vbk1lc3NhZ2VSZWNlaXZlZC5iaW5kKHRoaXMpO1xuICAgICAgdGhpcy50aGlzV2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBib3VuZEhhbmRsZXIsIHRydWUpO1xuICAgICAgdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24gPSAoKSA9PiB0aGlzLnRoaXNXaW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGJvdW5kSGFuZGxlciwgdHJ1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0b3BMaXN0ZW5pbmcoKTogdm9pZCB7XG4gICAgLy8gU3RvcCBsaXN0ZW5pbmcgaWYgd2UgaGF2ZSBzdGFydGVkIGxpc3RlbmluZ1xuICAgIGlmICh0aGlzLnVucmVnaXN0ZXJGdW5jdGlvbikge1xuICAgICAgdGhpcy51bnJlZ2lzdGVyRnVuY3Rpb24oKTtcbiAgICAgIHRoaXMudW5yZWdpc3RlckZ1bmN0aW9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRJbml0aWFsaXplTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuaW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDb21tYW5kTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IENvbW1hbmRNZXNzYWdlSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuY29tbWFuZE1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXROb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogTm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLm5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIHB1YmxpYyBzZXRIYW5kc2hha2VNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogSGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIpOiB2b2lkIHtcbiAgICB0aGlzLmhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyID0gaGFuZGxlcjtcbiAgfVxuXG4gIC8vLy8vIE1lc3NhZ2VEaXNwYXRjaGVyIEltcGxlbWVudGF0aW9uXG5cbiAgLyoqXG4gICAqIEBwYXJhbSBhcGlWZXJzaW9uIGFwaS1pbnRlcm5hbC1jb250cmFjdC1qcyB2ZXJzaW9uIChleHBvcnRlZCBpbiBKc0FwaUludGVybmFsQ29ubnRyYWN0KVxuICAgKiBAcGFyYW0gY3Jvc3NGcmFtZVZlcnNpb24gY3Jvc3NmcmFtZSBtZXNzYWdpbmcgdmVyc2lvbiAoZXhwb3J0ZWQgaW4gSnNBcGlJbnRlcm5hbENvbm50cmFjdClcbiAgICogQHBhcmFtIG9wdGlvbnMgYWRkaXRpb25hbCBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCBhdCBpbml0aWFsaXphdGlvbiAoaW5mb3JtYXRpb24gYWJvdXQgdGhlIHZlcnNpb24gb2ZcbiAgICogICAgICAgICAgICAgICAgZXh0ZXJuYWwgYmVpbmcgdXNlZCBmb3IgZXhhbXBsZSlcbiAgICovXG4gIHB1YmxpYyBwcmVwYXJlSW5pdGlhbGl6YXRpb25NZXNzYWdlKFxuICAgIGFwaVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgY3Jvc3NGcmFtZVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgb3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucyxcbiAgKTogUHJlcGFyZWRNZXNzYWdlIHtcbiAgICBjb25zdCBtZXNzYWdlOiBJbml0aWFsaXplTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Jbml0aWFsaXplLFxuICAgICAgY3Jvc3NGcmFtZVZlcnNpb246IGNyb3NzRnJhbWVWZXJzaW9uLFxuICAgICAgYXBpVmVyc2lvbjogYXBpVmVyc2lvbixcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnMsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVDb21tYW5kTWVzc2FnZSh2ZXJiSWQ6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IENvbW1hbmRNZXNzYWdlID0ge1xuICAgICAgbXNnR3VpZDogZ3VpZC5yYXcoKSxcbiAgICAgIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlLkNvbW1hbmQsXG4gICAgICB2ZXJiSWQ6IHZlcmJJZCxcbiAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLnByZXBhcmVNZXNzYWdlKG1lc3NhZ2UpO1xuICB9XG5cbiAgcHVibGljIHByZXBhcmVDb21tYW5kUmVzcG9uc2VNZXNzYWdlKGNvbW1hbmRHdWlkOiBzdHJpbmcsIGRhdGE6IE1vZGVsIHwgdW5kZWZpbmVkLCBlcnJvcjogTW9kZWwgfCB1bmRlZmluZWQpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuQ29tbWFuZFJlc3BvbnNlLFxuICAgICAgY29tbWFuZEd1aWQ6IGNvbW1hbmRHdWlkLFxuICAgICAgZGF0YTogZGF0YSxcbiAgICAgIGVycm9yOiBlcnJvcixcbiAgICB9O1xuXG4gICAgaWYgKGVycm9yKSB7XG4gICAgICAvLyBzdHJpbmdpZnkgZXJyb3Igb2JqZWN0IHRvIHJlbW92ZSB1bnNlcmlhbGl6YWJsZSBmaWVsZHMgbGlrZSBmdW5jdGlvbnMgYW5kIHByZXZlbnQgc2VyaWFsaXphdGlvbiBlcnJvcnNcbiAgICAgIG1lc3NhZ2UuZXJyb3IgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGVycm9yKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMucHJlcGFyZU1lc3NhZ2UobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgcHJlcGFyZU5vdGlmaWNhdGlvbk1lc3NhZ2Uobm90aWZpY2F0aW9uSWQ6IE5vdGlmaWNhdGlvbklkLCBkYXRhOiBNb2RlbCk6IFByZXBhcmVkTWVzc2FnZSB7XG4gICAgY29uc3QgbWVzc2FnZTogTm90aWZpY2F0aW9uTWVzc2FnZSA9IHtcbiAgICAgIG1zZ0d1aWQ6IGd1aWQucmF3KCksXG4gICAgICBtc2dUeXBlOiBNZXNzYWdlVHlwZS5Ob3RpZmljYXRpb24sXG4gICAgICBub3RpZmljYXRpb25JZDogbm90aWZpY2F0aW9uSWQsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBwcmVwYXJlQWNrTWVzc2FnZSgpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGNvbnN0IG1lc3NhZ2U6IEhhbmRzaGFrZU1lc3NhZ2UgPSB7XG4gICAgICBtc2dHdWlkOiBndWlkLnJhdygpLFxuICAgICAgbXNnVHlwZTogTWVzc2FnZVR5cGUuQWNrLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uOiBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5wcmVwYXJlTWVzc2FnZShtZXNzYWdlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcmVwYXJlcyBhIHBlbmRpbmcgbWVzc2FnZSBmb3Igc2VuZGluZyBhbmQgcmV0dXJucyB0aGUgcHJlcGFyZWQgbWVzc2FnZVxuICAgKlxuICAgKiBAcGFyYW0gbXNnIFRoZSBtZXNzYWdlIHRvIGJlIHNlbnQgdG8gdGhpcy5vdGhlcldpbmRvd1xuICAgKiBAcmV0dXJucyBUaGUgcHJlcGFyZWQgbWVzc2FnZVxuICAgKi9cbiAgcHJpdmF0ZSBwcmVwYXJlTWVzc2FnZShtc2c6IE1lc3NhZ2UpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIGlmICghdGhpcy5vdGhlcldpbmRvdyB8fCAhdGhpcy5vdGhlcldpbmRvd09yaWdpbikge1xuICAgICAgdGhyb3cgJ090aGVyIHdpbmRvdyBub3QgaW5pdGlhbGl6ZWQsIGNhbm5vdCBkaXNwYXRjaCBtZXNzYWdlcyc7XG4gICAgfVxuXG4gICAgY29uc3QgcHJlcGFyZWRNZXNzYWdlID0gbmV3IENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UobXNnLCB0aGlzLm90aGVyV2luZG93LCB0aGlzLm90aGVyV2luZG93T3JpZ2luKTtcbiAgICByZXR1cm4gcHJlcGFyZWRNZXNzYWdlO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCB3aGVuIGEgbWVzc2FnZSBpcyByZWNlaXZlZC4gRG9lcyBzb21lIHZhbGlkYXRpb24gb2YgdGhlIG1lc3NhZ2UsIGFuZCB0aGVuXG4gICAqIGNhbGxzIGFuIGFwcHJvcHJpYXRlIG1lc3NhZ2UgaGFuZGxlciBpZiBvbmUgaXMgZGVmaW5lZFxuICAgKlxuICAgKiBAcGFyYW0gZXZlbnQgVGhlIGluY29taW5nIE1lc3NhZ2VFdmVudFxuICAgKi9cbiAgcHJpdmF0ZSBvbk1lc3NhZ2VSZWNlaXZlZChldmVudDogTWVzc2FnZUV2ZW50KTogdm9pZCB7XG4gICAgLy8gSWYgd2UgaGF2ZSBhbiBvdGhlcldpbmRvdyBkZWZpbmVkLCBtYWtlIHN1cmUgdGhlIG1lc3NhZ2UgaXMgY29taW5nIGZyb20gdGhlcmVcbiAgICBpZiAodGhpcy5vdGhlcldpbmRvdyAmJiBldmVudC5zb3VyY2UgIT09IHRoaXMub3RoZXJXaW5kb3cpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEbyBzb21lIHZhbGlkYXRpb24gb24gZXZlbnQuZGF0YSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIHJlY2VpdmVkIGEgcmVhbCBtZXNzYWdlXG4gICAgaWYgKCFldmVudC5kYXRhKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbWVzc2FnZSA9IGV2ZW50LmRhdGE7XG4gICAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBDaGVjayB0aGUgZGVjbGFyZWQgbWVzc2FnZSB0eXBlLCB2YWxpZGF0ZSB0aGUgbWVzc2FnZSwgYW5kIGNhbGwgYW4gYXBwcm9wcmlhdGUgaGFuZGVyIGlmIG9uZSBleGlzdHNcbiAgICBzd2l0Y2ggKG1lc3NhZ2UubXNnVHlwZSkge1xuICAgICAgY2FzZSBNZXNzYWdlVHlwZS5Jbml0aWFsaXplOiB7XG4gICAgICAgIGlmICghaXNJbml0TWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5pbml0aWFsaXplTWVzc2FnZUhhbmRsZXIpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmluaXRpYWxpemVNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuQ29tbWFuZFJlc3BvbnNlOiB7XG4gICAgICAgIGlmICghaXNDb21tYW5kUmVzcG9uc2VNZXNzYWdlKG1lc3NhZ2UpIHx8ICF0aGlzLmNvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcihtZXNzYWdlLCBldmVudC5zb3VyY2UpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgTWVzc2FnZVR5cGUuQ29tbWFuZDoge1xuICAgICAgICBpZiAoIWlzQ29tbWFuZE1lc3NhZ2UobWVzc2FnZSkgfHwgIXRoaXMuY29tbWFuZE1lc3NhZ2VIYW5kbGVyKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb21tYW5kTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbjoge1xuICAgICAgICBpZiAoIWlzTm90aWZpY2F0aW9uTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5ub3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlIE1lc3NhZ2VUeXBlLkhhbmRzaGFrZToge1xuICAgICAgICBpZiAoIWlzSGFuZHNoYWtlTWVzc2FnZShtZXNzYWdlKSB8fCAhdGhpcy5oYW5kc2hha2VNZXNzYWdlSGFuZGxlcikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuaGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIobWVzc2FnZSwgZXZlbnQuc291cmNlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgLy8gSnVzdCBpZ25vcmUgdGhpcyBzaW5jZSB3ZSBkb24ndCBrbm93IGhvdyB0byBoYW5kbGUgdGhlIG1lc3NhZ2UgdHlwZVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZXRPdGhlcldpbmRvdyhvdGhlcldpbmRvdzogV2luZG93KTogdm9pZCB7XG4gICAgdGhpcy5vdGhlcldpbmRvdyA9IG90aGVyV2luZG93O1xuICB9XG5cbiAgcHVibGljIHNldE90aGVyV2luZG93T3JpZ2luKG9yaWdpbjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5vdGhlcldpbmRvd09yaWdpbiA9IG9yaWdpbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJy4vaW50ZXJmYWNlL01lc3NhZ2VUeXBlcyc7XG5pbXBvcnQgeyBQcmVwYXJlZE1lc3NhZ2UgfSBmcm9tICcuL2ludGVyZmFjZS9QcmVwYXJlZE1lc3NhZ2UnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBQcmVwYXJlZE1lc3NhZ2UgaW50ZXJmYWNlIHVzZWQgdG8gcG9zdCBtZXNzYWdlcyBiZXR3ZWVuXG4gKiB0d28gZnJhbWVzIHVzaW5nIHdpbmRvdy5wb3N0TWVzc2FnZVxuICovXG5leHBvcnQgY2xhc3MgQ3Jvc3NGcmFtZVByZXBhcmVkTWVzc2FnZSBpbXBsZW1lbnRzIFByZXBhcmVkTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIENyb3NzRnJhbWVQcmVwYXJlZE1lc3NhZ2UuXG4gICAqIEBwYXJhbSBfbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBiZSBzZW50XG4gICAqIEBwYXJhbSBfdGFyZ2V0IFRoZSB0YXJnZXQgd2luZG93IHdoZXJlIHRoZSBtZXNzYWdlIHdpbGwgYmUgc2VudFxuICAgKiBAcGFyYW0gX29yaWdpbiBUaGUgdGFyZ2V0T3JpZ2luIHdoZXJlIHRoaXMgbWVzc2FnZSBjYW4gYmUgcmVjZWl2ZWRcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9tZXNzYWdlOiBNZXNzYWdlLFxuICAgIHByaXZhdGUgX3RhcmdldDogV2luZG93LFxuICAgIHByaXZhdGUgX29yaWdpbjogc3RyaW5nLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBtZXNzYWdlR3VpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9tZXNzYWdlLm1zZ0d1aWQ7XG4gIH1cblxuICBwdWJsaWMgc2VuZCgpOiBQcmVwYXJlZE1lc3NhZ2Uge1xuICAgIHRoaXMuX3RhcmdldC5wb3N0TWVzc2FnZSh0aGlzLl9tZXNzYWdlLCB0aGlzLl9vcmlnaW4pO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBndWlkIGZyb20gJ2d1aWQnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uSWQgfSBmcm9tICcuLi9jb250cmFjdC9Ob3RpZmljYXRpb25zJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9pbnRlcmZhY2UvVmVyc2lvbk51bWJlcic7XG5pbXBvcnQge1xuICBDb21tYW5kTWVzc2FnZSxcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgSGFuZHNoYWtlTWVzc2FnZSxcbiAgSW5pdGlhbGl6ZU1lc3NhZ2UsXG4gIE1lc3NhZ2UsXG4gIE1lc3NhZ2VUeXBlLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxufSBmcm9tICcuL2ludGVyZmFjZS9NZXNzYWdlVHlwZXMnO1xuXG5jb25zdCBleHBlY3RlZEVtcHR5Tm90aWZpY2F0aW9ucyA9IG5ldyBTZXQoW1xuICBOb3RpZmljYXRpb25JZC5FZGl0QnV0dG9uQ2xpY2tlZCxcbiAgTm90aWZpY2F0aW9uSWQuRWRpdEluRGVza3RvcEJ1dHRvbkNsaWNrZWQsXG4gIE5vdGlmaWNhdGlvbklkLldvcmtib29rUHVibGlzaGVkLFxuICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va1JlYWR5VG9DbG9zZSxcbiAgTm90aWZpY2F0aW9uSWQuUmVhZHlUb1JlY2VpdmVBdXRoVG9rZW4sXG5dKTtcblxuLyogdHNsaW50OmRpc2FibGUgbm8tYW55ICovXG5leHBvcnQgZnVuY3Rpb24gaXNNZXNzYWdlKGRhdGE6IE1lc3NhZ2UgfCBhbnkpOiBkYXRhIGlzIE1lc3NhZ2Uge1xuICBpZiAoIWRhdGEpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBtZXNzYWdlID0gZGF0YSBhcyBNZXNzYWdlO1xuICBpZiAoIW1lc3NhZ2UgfHwgIW1lc3NhZ2UubXNnR3VpZCB8fCAhbWVzc2FnZS5tc2dUeXBlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFndWlkLmlzR3VpZChtZXNzYWdlLm1zZ0d1aWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBtZXNzYWdlLm1zZ1R5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbWVzc2FnZVR5cGVzOiBBcnJheTxzdHJpbmc+ID0gW1xuICAgIE1lc3NhZ2VUeXBlLkNvbW1hbmQsXG4gICAgTWVzc2FnZVR5cGUuQ29tbWFuZFJlc3BvbnNlLFxuICAgIE1lc3NhZ2VUeXBlLkluaXRpYWxpemUsXG4gICAgTWVzc2FnZVR5cGUuTm90aWZpY2F0aW9uLFxuICAgIE1lc3NhZ2VUeXBlLkhhbmRzaGFrZSxcbiAgXTtcblxuICBpZiAobWVzc2FnZVR5cGVzLmluZGV4T2YobWVzc2FnZS5tc2dUeXBlKSA8IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzVmVyc2lvbih2ZXJzaW9uTnVtYmVyOiBWZXJzaW9uTnVtYmVyIHwgYW55KTogdmVyc2lvbk51bWJlciBpcyBWZXJzaW9uTnVtYmVyIHtcbiAgaWYgKCF2ZXJzaW9uTnVtYmVyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgdiA9IHZlcnNpb25OdW1iZXIgYXMgVmVyc2lvbk51bWJlcjtcblxuICBpZiAodHlwZW9mIHYgIT09ICdvYmplY3QnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHR5cGVvZiB2LmZpeCAhPT0gJ251bWJlcicgfHwgdHlwZW9mIHYubWlub3IgIT09ICdudW1iZXInIHx8IHR5cGVvZiB2Lm1ham9yICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNJbml0TWVzc2FnZShtZXNzYWdlOiBJbml0aWFsaXplTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgSW5pdGlhbGl6ZU1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGluaXRNZXNzYWdlID0gbWVzc2FnZSBhcyBJbml0aWFsaXplTWVzc2FnZTtcbiAgaWYgKGluaXRNZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLkluaXRpYWxpemUpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWluaXRNZXNzYWdlLmFwaVZlcnNpb24gfHwgIWlzVmVyc2lvbihpbml0TWVzc2FnZS5hcGlWZXJzaW9uKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghaW5pdE1lc3NhZ2UuY3Jvc3NGcmFtZVZlcnNpb24gfHwgIWlzVmVyc2lvbihpbml0TWVzc2FnZS5jcm9zc0ZyYW1lVmVyc2lvbikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQ29tbWFuZFJlc3BvbnNlTWVzc2FnZShtZXNzYWdlOiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBDb21tYW5kUmVzcG9uc2VNZXNzYWdlIHtcbiAgaWYgKCFpc01lc3NhZ2UobWVzc2FnZSkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBjck1lc3NhZ2UgPSBtZXNzYWdlIGFzIENvbW1hbmRSZXNwb25zZU1lc3NhZ2U7XG4gIGlmIChjck1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuQ29tbWFuZFJlc3BvbnNlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFndWlkLmlzR3VpZChjck1lc3NhZ2UuY29tbWFuZEd1aWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKCFjck1lc3NhZ2UuZGF0YSAmJiAhY3JNZXNzYWdlLmVycm9yKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0NvbW1hbmRNZXNzYWdlKG1lc3NhZ2U6IENvbW1hbmRNZXNzYWdlIHwgYW55KTogbWVzc2FnZSBpcyBDb21tYW5kTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgY29tbWFuZE1lc3NhZ2UgPSBtZXNzYWdlIGFzIENvbW1hbmRNZXNzYWdlO1xuICBpZiAoY29tbWFuZE1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuQ29tbWFuZCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghY29tbWFuZE1lc3NhZ2UucGFyYW1ldGVycyB8fCB0eXBlb2YgY29tbWFuZE1lc3NhZ2UucGFyYW1ldGVycyAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIWNvbW1hbmRNZXNzYWdlLnZlcmJJZCB8fCB0eXBlb2YgY29tbWFuZE1lc3NhZ2UudmVyYklkICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNOb3RpZmljYXRpb25NZXNzYWdlKG1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UgfCBhbnkpOiBtZXNzYWdlIGlzIE5vdGlmaWNhdGlvbk1lc3NhZ2Uge1xuICBpZiAoIWlzTWVzc2FnZShtZXNzYWdlKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG5vdGlmaWNhdGlvbk1lc3NhZ2UgPSBtZXNzYWdlIGFzIE5vdGlmaWNhdGlvbk1lc3NhZ2U7XG4gIGlmIChub3RpZmljYXRpb25NZXNzYWdlLm1zZ1R5cGUgIT09IE1lc3NhZ2VUeXBlLk5vdGlmaWNhdGlvbikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmICghbm90aWZpY2F0aW9uTWVzc2FnZS5kYXRhICYmICFleHBlY3RlZEVtcHR5Tm90aWZpY2F0aW9ucy5oYXMobm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoIW5vdGlmaWNhdGlvbk1lc3NhZ2Uubm90aWZpY2F0aW9uSWQgfHwgdHlwZW9mIG5vdGlmaWNhdGlvbk1lc3NhZ2Uubm90aWZpY2F0aW9uSWQgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hhbmRzaGFrZU1lc3NhZ2UobWVzc2FnZTogSGFuZHNoYWtlTWVzc2FnZSB8IGFueSk6IG1lc3NhZ2UgaXMgSGFuZHNoYWtlTWVzc2FnZSB7XG4gIGlmICghaXNNZXNzYWdlKG1lc3NhZ2UpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaGFuZHNoYWtlTWVzc2FnZSA9IG1lc3NhZ2UgYXMgSGFuZHNoYWtlTWVzc2FnZTtcbiAgaWYgKGhhbmRzaGFrZU1lc3NhZ2UubXNnVHlwZSAhPT0gTWVzc2FnZVR5cGUuSGFuZHNoYWtlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG4iLCJpbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgTW9kZWwsIE5vdGlmaWNhdGlvbklkLCBWZXJiSWQsIFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi8uLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25PcHRpb25zIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlL0luaXRpYWxpemF0aW9uT3B0aW9ucyc7XG5pbXBvcnQgeyBQcmVwYXJlZE1lc3NhZ2UgfSBmcm9tICcuL1ByZXBhcmVkTWVzc2FnZSc7XG5cbi8qKlxuICogVGhpcyBpbnRlcmZhY2UgZGVmaW5lcyBhbiBvYmplY3Qgd2hpY2ggY2FuIHByZXBhcmUgZGlmZmVyZW50IG1lc3NhZ2VzIHRvIHNlbmQgdG8gYSB0YXJnZXQuXG4gKlxuICogQGludGVyZmFjZSBNZXNzYWdlRGlzcGF0Y2hlclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VEaXNwYXRjaGVyIHtcbiAgcHJlcGFyZUluaXRpYWxpemF0aW9uTWVzc2FnZShcbiAgICBhcGlWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIGNyb3NzRnJhbWVWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIG9wdGlvbnM/OiBJbml0aWFsaXphdGlvbk9wdGlvbnMsXG4gICk6IFByZXBhcmVkTWVzc2FnZTtcbiAgcHJlcGFyZUNvbW1hbmRNZXNzYWdlKHZlcmJJZDogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByZXBhcmVkTWVzc2FnZTtcbiAgcHJlcGFyZUNvbW1hbmRSZXNwb25zZU1lc3NhZ2UoY29tbWFuZEd1aWQ6IHN0cmluZywgZGF0YTogTW9kZWwgfCB1bmRlZmluZWQsIGVycm9yOiBNb2RlbCB8IHVuZGVmaW5lZCk6IFByZXBhcmVkTWVzc2FnZTtcbiAgcHJlcGFyZU5vdGlmaWNhdGlvbk1lc3NhZ2Uobm90aWZpY2F0aW9uSWQ6IE5vdGlmaWNhdGlvbklkLCBkYXRhOiBNb2RlbCk6IFByZXBhcmVkTWVzc2FnZTtcbn1cbiIsImltcG9ydCB7IENvbW1hbmRNZXNzYWdlLCBDb21tYW5kUmVzcG9uc2VNZXNzYWdlLCBIYW5kc2hha2VNZXNzYWdlLCBJbml0aWFsaXplTWVzc2FnZSwgTm90aWZpY2F0aW9uTWVzc2FnZSB9IGZyb20gJy4vTWVzc2FnZVR5cGVzJztcbmltcG9ydCB7IFByZXBhcmVkTWVzc2FnZSB9IGZyb20gJy4vUHJlcGFyZWRNZXNzYWdlJztcblxuLyoqXG4gKiBNZXNzYWdlIGhhbmRsZXIgdHlwZXNcbiAqL1xuZXhwb3J0IHR5cGUgSW5pdGlhbGl6ZU1lc3NhZ2VIYW5kbGVyID0gKG1zZzogSW5pdGlhbGl6ZU1lc3NhZ2UsIHNvdXJjZTogTWVzc2FnZUV2ZW50U291cmNlIHwgbnVsbCkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyID0gKG1zZzogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSwgc291cmNlOiBNZXNzYWdlRXZlbnRTb3VyY2UgfCBudWxsKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgQ29tbWFuZE1lc3NhZ2VIYW5kbGVyID0gKG1zZzogQ29tbWFuZE1lc3NhZ2UsIHNvdXJjZTogTWVzc2FnZUV2ZW50U291cmNlIHwgbnVsbCkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyID0gKG1zZzogTm90aWZpY2F0aW9uTWVzc2FnZSwgc291cmNlOiBNZXNzYWdlRXZlbnRTb3VyY2UgfCBudWxsKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgSGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIgPSAobXNnOiBIYW5kc2hha2VNZXNzYWdlLCBzb3VyY2U6IE1lc3NhZ2VFdmVudFNvdXJjZSB8IG51bGwpID0+IHZvaWQ7XG5cbi8qKlxuICogSW50ZXJmYWNlIHRvIHdoaWNoIGRlZmluZXMgYSBtZXNzYWdlIGxpc3RlbmVyLiBUaGUgU2V0Kk1lc3NhZ2VIYW5kbGVyIGZ1bmN0aW9ucyBzaG91bGQgYmVcbiAqIGNhbGxlZCB0byBoYW5kbGUgc3BlY2lmaWMgbWVzc2FnZSB0eXBlcy4gTm90aGluZyB3aWxsIGhhcHBlbiB1bnRpbCBTdGFydExpc3RlbmluZyBpcyBjYWxsZWRcbiAqXG4gKiBAaW50ZXJmYWNlIE1lc3NhZ2VMaXN0ZW5lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2VMaXN0ZW5lciB7XG4gIHN0YXJ0TGlzdGVuaW5nKCk6IHZvaWQ7XG4gIHN0b3BMaXN0ZW5pbmcoKTogdm9pZDtcblxuICBzZXRJbml0aWFsaXplTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IEluaXRpYWxpemVNZXNzYWdlSGFuZGxlcik6IHZvaWQ7XG4gIHNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGhhbmRsZXI/OiBDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcik6IHZvaWQ7XG4gIHNldENvbW1hbmRNZXNzYWdlSGFuZGxlcihoYW5kbGVyPzogQ29tbWFuZE1lc3NhZ2VIYW5kbGVyKTogdm9pZDtcbiAgc2V0Tm90aWZpY2F0aW9uTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IE5vdGlmaWNhdGlvbk1lc3NhZ2VIYW5kbGVyKTogdm9pZDtcbiAgc2V0SGFuZHNoYWtlTWVzc2FnZUhhbmRsZXIoaGFuZGxlcj86IEhhbmRzaGFrZU1lc3NhZ2VIYW5kbGVyKTogdm9pZDtcblxuICBzZXRPdGhlcldpbmRvdyhvdGhlcldpbmRvdzogV2luZG93KTogdm9pZDtcbiAgc2V0T3RoZXJXaW5kb3dPcmlnaW4ob3JpZ2luOiBzdHJpbmcpOiB2b2lkO1xuXG4gIHByZXBhcmVBY2tNZXNzYWdlKCk6IFByZXBhcmVkTWVzc2FnZTtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBNb2RlbCwgTm90aWZpY2F0aW9uSWQsIFZlcmJJZCwgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvbk9wdGlvbnMgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2UvSW5pdGlhbGl6YXRpb25PcHRpb25zJztcblxuLyoqXG4gKiBFbnVtIGRlZmluaW5nIHRoZSA0IGRpZmZlcmVudCB0eXBlcyBvZiBtZXNzYWdlcyB3ZSBoYXZlIGRlZmluZWRcbiAqL1xuZXhwb3J0IGVudW0gTWVzc2FnZVR5cGUge1xuICBJbml0aWFsaXplID0gJ2luaXRpYWxpemUnLFxuICBOb3RpZmljYXRpb24gPSAnbm90aWZpY2F0aW9uJyxcbiAgQ29tbWFuZCA9ICdjb21tYW5kJyxcbiAgQ29tbWFuZFJlc3BvbnNlID0gJ2NvbW1hbmQtcmVzcG9uc2UnLFxuICBIYW5kc2hha2UgPSAndi1oYW5kc2hha2UnLFxuICBBY2sgPSAndi1hY2snLFxufVxuXG4vKipcbiAqIFRoZSBNZXNzYWdlIGludGVyZmFjZSBpcyB0aGUgYmFzZSBpbnRlcmZhY2UgZm9yIGFsbCB0aGUgb3RoZXJcbiAqIG1lc3NhZ2UgdHlwZSBpbnRlcmZhY2VzLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NhZ2Uge1xuICAvKipcbiAgICogQSB1bmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZVxuICAgKi9cbiAgbXNnR3VpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiB0aGlzIG1lc3NhZ2VcbiAgICovXG4gIG1zZ1R5cGU6IE1lc3NhZ2VUeXBlO1xufVxuXG4vKipcbiAqIFRoZSBpbml0aWFsaXplIG1lc3NhZ2UgaXMgdGhlIGZpcnN0IG1lc3NhZ2Ugd2hpY2ggd2lsbCBiZSBzZW50XG4gKiBmcm9tIHRoZSBqYXZhc2NyaXB0IHRvIHNldCB1cCBjb21tdW5pY2F0aW9uc1xuICovXG5leHBvcnQgaW50ZXJmYWNlIEluaXRpYWxpemVNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGUgYXBpIHdoaWNoIHRoZSBzZW5kZXIgd2FudHMgdG8gdXNlXG4gICAqL1xuICBhcGlWZXJzaW9uOiBWZXJzaW9uTnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgdmVyc2lvbiBvZiB0aGlzIG1lc3NhZ2luZyBjb250cmFjdCB0byBiZSB1c2VkLiBGb3Igbm93LCB0aGVyZVxuICAgKiBzaG91bGQgb25seSBiZSBhIHNpbmdsZSB2ZXJzaW9uIGJ1dCBzZW5kaW5nIHRoaXMgYWxvbmcgc2hvdWxkIGhlbHBcbiAgICogaWYgd2UgbmVlZCB0byBhZGQgYSBuZXcgdmVyc2lvbiBpbiBhIGZ1dHVyZSByZWxlYXNlXG4gICAqL1xuICBjcm9zc0ZyYW1lVmVyc2lvbjogVmVyc2lvbk51bWJlcjtcblxuICAvKipcbiAgICogQWRkaXRpb25hbCBvcHRpb25zIHRoYXQgY2FuIGJlIHBhc3NlZCBhdCB0aGUgdGltZSBvZiBpbml0aWFsaXphdGlvblxuICAgKi9cbiAgb3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucztcbn1cblxuLyoqXG4gKiBUaGlzIG1lc3NhZ2UgaXMgc2VudCB3aGVuIGEgbm90aWZpY2F0aW9uIG9jY3VycyBmcm9tIHRoZSBwcmVzbGF5ZXJcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb3RpZmljYXRpb25NZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgaWQgZm9yIHRoaXMgdHlwZSBvZiBub3RpZmljYXRpb25cbiAgICovXG4gIG5vdGlmaWNhdGlvbklkOiBOb3RpZmljYXRpb25JZDtcblxuICAvKipcbiAgICogVGhlIGRhdGEgd2hpY2ggY2FtZSBhbG9uZyB3aXRoIHRoZSBub3RpZmljYXRpb25cbiAgICovXG4gIGRhdGE6IE1vZGVsO1xufVxuXG4vKipcbiAqIFJlcHJlc2VudHMgY2FsbGluZyBhbiBpbnRlcm5hbCBjb250cmFjdCBjb21tYW5kXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ29tbWFuZE1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIFRoZSBpZCBvZiB0aGUgY29tbWFuZCB3aGljaCBzaG91bGQgYmUgZXhlY3V0ZWRcbiAgICovXG4gIHZlcmJJZDogVmVyYklkO1xuXG4gIC8qKlxuICAgKiBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgcGFyYW1ldGVycyBmb3IgdGhlIGNvbW1hbmRcbiAgICovXG4gIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzO1xufVxuXG4vKipcbiAqIFRoaXMgbWVzc2FnZSBpcyBzZW50IGluIHJlc3BvbnNlIHRvIGEgQ29tbWFuZE1lc3NhZ2Ugd2l0aCB0aGVcbiAqIHJlc3VsdCBvZiB0aGF0IGNvbW1hbmRzIGludm9jYXRpb25cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21tYW5kUmVzcG9uc2VNZXNzYWdlIGV4dGVuZHMgTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBHdWlkIG9mIHRoZSBDb21tYW5kTWVzc2FnZSB3aGljaCB0aGlzIGlzIGluIHJlc3BvbnNlIHRvXG4gICAqL1xuICBjb21tYW5kR3VpZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBJZiB0aGVyZSB3YXMgYW4gZXJyb3IgcmV0dXJuZWQgZnJvbSB0aGUgY29tbWFuZCwgdGhpcyB3aWxsIGJlIGRlZmluZWRcbiAgICogYW5kIGNvbnRhaW4gdGhlIGVycm9yXG4gICAqL1xuICBlcnJvcj86IE1vZGVsO1xuXG4gIC8qKlxuICAgKiBJZiB0aGUgY29tbWFuZCBleGVjdXRlZCBzdWNjZXNzZnVsbHksIHRoaXMgd2lsbCBjb250YWluIHRoZSBjb21tYW5kIHJlc3VsdFxuICAgKi9cbiAgZGF0YT86IE1vZGVsO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEhhbmRzaGFrZU1lc3NhZ2UgZXh0ZW5kcyBNZXNzYWdlIHtcbiAgLyoqXG4gICAqIEludGVybmFsIEFQSSBjb250cmFjdCB2ZXJzaW9uXG4gICAqL1xuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXI7XG59XG4iLCJpbXBvcnQgeyBNZXNzYWdlRGlzcGF0Y2hlciB9IGZyb20gJy4vTWVzc2FnZURpc3BhdGNoZXInO1xuaW1wb3J0IHsgTWVzc2FnZUxpc3RlbmVyIH0gZnJvbSAnLi9NZXNzYWdlTGlzdGVuZXInO1xuXG4vKipcbiAqIFNpbXBsZSB3cmFwcGVyIGludGVyZmFjZSB0byBlbmNvbXBhc3MgYm90aCB0aGUgTWVzc2FnZURpc3BhdGNoZXIgYW5kIE1lc3NhZ2VMaXN0ZW5lclxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1lc3NlbmdlciBleHRlbmRzIE1lc3NhZ2VEaXNwYXRjaGVyLCBNZXNzYWdlTGlzdGVuZXIge31cbiIsIi8qKlxuICogUmVwcmVzZW50cyBhIG1lc3NhZ2Ugd2hpY2ggaGFzIGJlZW4gcHJlcGFyZWQgYW5kIGlzIHJlYWR5IHRvIHNlbmQuIFRoaXMgaW50ZXJmYWNlXG4gKiBpcyB1c2VmdWwgdG8gZ2V0IGEgcmVmZXJlbmNlIHRvIHNvbWUgaW5mbyBmcm9tIHRoZSBtZXNzYWdlIGJlZm9yZSBzZW5kaW5nIGl0LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFByZXBhcmVkTWVzc2FnZSB7XG4gIC8qKlxuICAgKiBUaGUgZ3VpZCBvZiB0aGUgbWVzc2FnZSB3aGljaCB3aWxsIGJlIHNlbnRcbiAgICovXG4gIHJlYWRvbmx5IG1lc3NhZ2VHdWlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNlbmRzIHRoZSBhY3R1YWwgbWVzc2FnZSB0byB0aGUgcmVjZWl2ZXIuXG4gICAqXG4gICAqIEByZXR1cm5zIFRoaXMgbWVzc2FnZSBvYmplY3RcbiAgICovXG4gIHNlbmQoKTogUHJlcGFyZWRNZXNzYWdlO1xufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4ZWN1dGVSZXNwb25zZSwgTm90aWZpY2F0aW9uLCBWZXJiSWQgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKlxuICogVGhpcyB2ZXJzaW9uIGNvbnZlcnRlciBkb2Vzbid0IGFjdHVhbGx5IGRvIGFueXRoaW5nIGJ1dCBpcyB1c2VmdWwgZm9yIHRlc3Rpbmcgb3Igd2hlbiB3ZSBoYXZlXG4gKiBhIG1hdGNoaW5nIHBsYXRmb3JtIGFuZCBpbnRlcm5hbCB2ZXJzaW9uIG51bWJlclxuICovXG5leHBvcnQgY2xhc3MgSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBwdWJsaWMgdXBncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIHJldHVybiB7XG4gICAgICB2ZXJiOiB2ZXJiIGFzIFZlcmJJZCxcbiAgICAgIHBhcmFtZXRlcnM6IHBhcmFtZXRlcnMgYXMgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyBkb3duZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gICAgcmV0dXJuIG5vdGlmaWNhdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4ZWN1dGVSZXNwb25zZSwgTm90aWZpY2F0aW9uLCBWZXJiSWQgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuXG4vLyBXZSBuZWVkIHRvIGRpc2FibGUgYW55IGJlY2F1c2UgdGhlc2UgbWV0aG9kcyBuZWVkIHRvIGJlIGdlbmVyaWNcbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG5leHBvcnQgaW50ZXJmYWNlIEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBvbGQgdmVycyBhbmQgcGFyYW1ldGVycyBmcm9tIHRoZSBleHRlcm5hbCBiZWZvcmUgd2Ugc2VuZCBpdCB0byBwbGF0Zm9ybSAqL1xuICB1cGdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfTtcblxuICAvKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlZCBhIHJlc3BvbnNlIGJhY2sgZnJvbSBwbGF0Zm9ybSBhbmQgd2UgbmVlZCB0byBkb3duZ3JhZGUgaXQgdG8gZXh0ZXJuYWwncyB2ZXJzaW9uICovXG4gIGRvd25ncmFkZUV4ZWN1dGVSZXR1cm4oZXhlY3V0ZVJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpOiBFeGVjdXRlUmVzcG9uc2U7XG5cbiAgLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG5vdGlmaWNhdGlvbiBmcm9tIHBsYXRmb3JtIGFuZCB3ZSBuZWVkIHRvIGRvd25ncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbiAgZG93bmdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uO1xufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4ZWN1dGVSZXNwb25zZSwgTm90aWZpY2F0aW9uLCBWZXJiSWQsIFZlcnNpb25OdW1iZXIgfSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0ludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9ucyBmcm9tICcuL1ZlcnNpb25UcmFuc2xhdGlvbnMnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcblxuLyoqXG4gKiBUaGUgdmVyc2lvbiBjb252ZXJ0ZXIgaXMgZGVzaWduZWQgdG8gYWxsb3cgdGhlIHBsYXRmb3JtIGFuZCBleHRlcm5hbCBtb2R1bGVzXG4gKiB0byBzZWVtbGVzc2x5IGNvbW11bmljYXRlIG92ZXIgdHdvIGRpZmZlcmVudCB2ZXJzaW9ucyBvZiB0aGUgaW50ZXJuYWwgQVBJLiBUaGUgb25seVxuICogbW9kZSBpdCBzdXBwb3J0cyBpcyBleHRlcm5hbCdzIHZlcnNpb24gPD0gcGxhdGZvcm0ncyB2ZXJzaW9uLiBXaGVuIGV4ZWN1dGluZ1xuICogY29tbWFuZHMsIGl0IGlzIHVzZWQgdG8gdXBncmFkZSB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdG8gd2hhdCBwbGF0Zm9ybSBrbm93cyBvbiB0aGUgd2F5IGluXG4gKiBhbmQgZG93bmdyYWRlIHRoZSByZXByZXNlbnRhdGlvbnMgb24gdGhlIHdheSBvdXQuIFNpbWlsYXJseSBmb3Igbm90aWZpY2F0aW9ucywgaXQgY2FuXG4gKiBkb3duZ3JhZGUgdGhvc2Ugb24gdGhlIHdheSBmcm9tIHBsYXRmb3JtIHRvIGV4dGVybmFsLlxuICovXG5leHBvcnQgY2xhc3MgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyXG4gICAqXG4gICAqIEBwYXJhbSBfZXh0ZXJuYWxWZXJzaW9uIFRoZSB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCBhcGktZXh0ZXJuYWwtanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF9wbGF0Zm9ybVZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHRoZSBhcGktcGxhdGZvcm0tanMgaXMgdXNpbmdcbiAgICogQHBhcmFtIF91cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdGhlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIHdoZW4gdXBncmFkaW5nIGNtZCBwYXJhbWV0ZXJzXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgY21kXG4gICAqIEBwYXJhbSBfZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiBkb3duZ3JhZGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gb24gYSBub3RpZmljYXRpb25cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZnJvbURhdGEoXG4gICAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgICB1cGdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4sXG4gICAgZG93bmdyYWRlRXhlY3V0ZVRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICAgIGRvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9uczogQXJyYXk8VHJhbnNsYXRpb25zLkRvd25ncmFkZU5vdGlmaWNhdGlvbj4sXG4gICk6IFN0YWNraW5nVmVyc2lvbkNvbnZlcnRlciB7XG4gICAgcmV0dXJuIG5ldyB0aGlzKFxuICAgICAgZXh0ZXJuYWxWZXJzaW9uLm1ham9yLFxuICAgICAgcGxhdGZvcm1WZXJzaW9uLm1ham9yLFxuICAgICAgdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMsXG4gICAgICBkb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zLFxuICAgICAgZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zLFxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyXG4gICAqXG4gICAqIEBwYXJhbSBfZXh0ZXJuYWxNYWpvclZlcnNpb24gVGhlIG1ham9yIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IGFwaS1leHRlcm5hbC1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3BsYXRmb3JtTWFqb3JWZXJzaW9uIFRoZSBtYWpvciB2ZXJzaW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB0aGUgYXBpLXBsYXRmb3JtLWpzIGlzIHVzaW5nXG4gICAqIEBwYXJhbSBfdXBncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIHRoZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSB3aGVuIHVwZ3JhZGluZyBjbWQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gX2Rvd25ncmFkZUV4ZWN1dGVUcmFuc2xhdGlvbnMgT3JkZXJlZCBsaXN0IG9mIGRvd25ncmFkZSB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBhZnRlciBhIGNtZFxuICAgKiBAcGFyYW0gX2Rvd25ncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgZG93bmdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIG9uIGEgbm90aWZpY2F0aW9uXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZXh0ZXJuYWxNYWpvclZlcnNpb246IG51bWJlcixcbiAgICBwcml2YXRlIF9wbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICAgIHByaXZhdGUgX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPixcbiAgICBwcml2YXRlIF9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4sXG4gICAgcHJpdmF0ZSBfZG93bmdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPixcbiAgKSB7XG4gICAgaWYgKHRoaXMuX2V4dGVybmFsTWFqb3JWZXJzaW9uID4gdGhpcy5fcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbnZlcnQgYmV0d2VlbiBleHRlcm5hbCB2ZXJzaW9uICR7dGhpcy5fZXh0ZXJuYWxNYWpvclZlcnNpb259IGFuZCAke3RoaXMuX3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfSB7XG4gICAgLy8gUGVyZm9ybSB0aGUgdXBncmFkZSBvZiB0aGUgdmVyYiBhbmQgcGFyYW1ldGVycyB0byB0aGUgbGV2ZWwgdGhhdCBwbGF0Zm9ybSBpcyB1c2luZ1xuICAgIGxldCB1cGdyYWRlZCA9IHsgdmVyYjogdmVyYiwgcGFyYW1ldGVyczogcGFyYW1ldGVycyB9O1xuICAgIGZvciAoY29uc3QgdXBncmFkZVRyYW5zbGF0aW9uIG9mIHRoaXMuX3VwZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zKSB7XG4gICAgICB1cGdyYWRlZCA9IHVwZ3JhZGVUcmFuc2xhdGlvbih1cGdyYWRlZC52ZXJiLCB1cGdyYWRlZC5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgLy8gRG93bmdyYWRlIHRoZSByZXNwb25zZSB0byB3aGF0IHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgZXhwZWN0aW5nXG4gICAgbGV0IGRvd25ncmFkZWQgPSBleGVjdXRlUmVzcG9uc2U7XG4gICAgZm9yIChjb25zdCBkb3duZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl9kb3duZ3JhZGVFeGVjdXRlVHJhbnNsYXRpb25zKSB7XG4gICAgICBkb3duZ3JhZGVkID0gZG93bmdyYWRlVHJhbnNsYXRpb24oZG93bmdyYWRlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRvd25ncmFkZWQ7XG4gIH1cblxuICBwdWJsaWMgZG93bmdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICAvLyBEb3duZ3JhZGUgdGhlIG5vdGlmaWNhdGlvbiB0byB3aGF0IHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgZXhwZWN0aW5nXG4gICAgbGV0IGRvd25ncmFkZWQgPSBub3RpZmljYXRpb247XG4gICAgZm9yIChjb25zdCBkb3duZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl9kb3duZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnMpIHtcbiAgICAgIGRvd25ncmFkZWQgPSBkb3duZ3JhZGVUcmFuc2xhdGlvbihkb3duZ3JhZGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG93bmdyYWRlZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0lkZW50aXR5VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9TdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0ICogYXMgVHJhbnNsYXRpb25zIGZyb20gJy4vVmVyc2lvblRyYW5zbGF0aW9ucyc7XG5pbXBvcnQge1xuICBEb3duZ3JhZGVFeHRlbnNpb25FbnZpcm9ubWVudENvbnRleHQsXG4gIERvd25ncmFkZUZsaXBib2FyZFpvbmVJRCxcbiAgRG93bmdyYWRlUGVyaW9kVHlwZSxcbiAgRG93bmdyYWRlV29ya3NoZWV0Rm9tYXR0aW5nMTc1LFxuICBEb3duZ3JhZGVXb3Jrc2hlZXRGb21hdHRpbmdOb3RpZmljYXRpb24xNzUsXG4gIERvd25ncmFkZVdvcmtzaGVldE5hbWVzLFxufSBmcm9tICcuL1ZlcnNpb25UcmFuc2xhdGlvbnMnO1xuXG4vKipcbiAqIEByZXR1cm5zIHRydWUgaWYgbGhzIDwgcmhzIChpZ25vcmluZyBmaXggbnVtYmVyKVxuICogQHBhcmFtIGxoc1xuICogQHBhcmFtIHJoc1xuICovXG5leHBvcnQgZnVuY3Rpb24gVmVyc2lvbkxlc3NUaGFuKGxoczogVmVyc2lvbk51bWJlciwgcmhzOiBWZXJzaW9uTnVtYmVyKTogYm9vbGVhbiB7XG4gIGlmIChsaHMubWFqb3IgPiByaHMubWFqb3IpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGxocy5tYWpvciA8IHJocy5tYWpvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBsaHMubWlub3IgPCByaHMubWlub3I7XG59XG5cbi8qKlxuICogQHJldHVybnMgdHJ1ZSBpZiBsaHMgPT0gcmhzIChpZ25vcmluZyBmaXggbnVtYmVyKVxuICogQHBhcmFtIGxoc1xuICogQHBhcmFtIHJoc1xuICovXG5leHBvcnQgZnVuY3Rpb24gVmVyc2lvbkVxdWFsVG8obGhzOiBWZXJzaW9uTnVtYmVyLCByaHM6IFZlcnNpb25OdW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIGxocy5tYWpvciA9PT0gcmhzLm1ham9yICYmIGxocy5taW5vciA9PT0gcmhzLm1pbm9yO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE1ham9yTWlub3JUcmFuc2xhdG9yczxUPiB7XG4gIFttYWpvcjogbnVtYmVyXTogeyBbbWlub3I6IG51bWJlcl06IEFycmF5PFQ+IH07XG59XG5cbi8vIEEgbWFwcGluZyBmcm9tIGFuIG9sZGVyIGNsaWVudCB2ZXJzaW9uIG9mIGludGVybmFsLWNvbnRyYWN0IHRvIHRoZSBjdXJyZW50IHBsYXRmb3JtIHZlcnNpb24gb2YgdGhpcyBjb250cmFjdC5cbi8vIEVhY2ggdmVyc2lvbiBidW1wIGNhbiBoYXZlIGFuIGFycmF5IG9mIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGluIG9yZGVyLiBOb3RpY2UgdGhhdCB0aGlzIGlzXG4vLyBkaWZmZXJlbnQgdGhhbiB0aGUgbWFqb3IgdXBncmFkZXMvZG93bmdyYWRlcyBhYm92ZSBiZWNhdXNlIGl0IGhhbmRsZXMgYm90aCBtYWpvciBhbmQgbWlub3IgdmVyc2lvbiBjaGFuZ2VzLlxuLy8gQWxzbyBwbGVhc2Ugbm90ZTogZG93bmdyYWRlRXhlY3V0ZUNhbGwgaXMgaGFuZGxlZCBvbiB0aGUgY2xpZW50L2V4dGVybmFsIHNpZGUgcmF0aGVyIHRoYW4gcGxhdGZvcm0gc2lkZS5cbi8vIFdoZW4gdXBkYXRpbmcgdGhlIG1ham9yIG9yIG1pbm9yIHZlcnNpb24gb2Ygb3VyIGludGVybmFsLWNvbnRyYWN0LCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGVzZSBkYXRhIHN0cnVjdHVyZXMuXG4vLyAqIElmIHRoZXJlIGFyZSB0cmFuc2xhdGlvbnMgdG8gYWRkLCBhZGQgdGhlbSB0byB0aGUgdmVyc2lvbiB0byBcInVwZ3JhZGUgZnJvbVwiIG9yIFwiZG93bmdyYWRlIHRvXCIuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVDYWxsPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLCAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfSxcbn07XG5cbmV4cG9ydCBjb25zdCBFeGVjdXRlTWlub3JEb3duZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLkRvd25ncmFkZUV4ZWN1dGVSZXR1cm4+ID0ge1xuICAxOiB7XG4gICAgNTogW0Rvd25ncmFkZVdvcmtzaGVldE5hbWVzXSxcbiAgICA5OiBbXSxcbiAgICAxNzU6IFtEb3duZ3JhZGVXb3Jrc2hlZXRGb21hdHRpbmcxNzVdLFxuICAgIDE4MjogW0Rvd25ncmFkZUV4dGVuc2lvbkVudmlyb25tZW50Q29udGV4dF0sXG4gICAgMTg5OiBbRG93bmdyYWRlUGVyaW9kVHlwZV0sXG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgTm90aWZpY2F0aW9uTWlub3JEb3duZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLkRvd25ncmFkZU5vdGlmaWNhdGlvbj4gPSB7XG4gIDE6IHtcbiAgICA5OiBbXSxcbiAgICAxMDogW0Rvd25ncmFkZUZsaXBib2FyZFpvbmVJRF0sXG4gICAgMTc1OiBbRG93bmdyYWRlV29ya3NoZWV0Rm9tYXR0aW5nTm90aWZpY2F0aW9uMTc1XSxcbiAgfSxcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBJbnRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB3aGljaCBoYXMgdGhlIGFiaWxpdHkgdG8gdXBncmFkZSBhbmQgZG93bmdyYWRlIHRoZSBjb250cmFjdFxuICogYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zLCB3aGljaCBhcmUgc3BlY2lmaWVkLiBJZiBleHRlcm5hbE1ham9yVmVyc2lvbiBpcyBncmVhdGVyIHRoYW4gcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gKiBhbiBlcnJvciB3aWxsIGJlIHRocm93biBiZWNhdXNlIHdlIHdvbid0IGtub3cgaG93IHRvIGRvIHRob3NlIGNvbnZlcnNpb25zLlxuICogVGhpcyBjb252ZXJ0ZXIgY2FuIGhhbmRsZSBib3RoIG1ham9yIGFuZCBtaW5vciB1cGRhdGVzIHdoZW4gdGhlIHBsYXRmb3JtIHZlcnNpb24gaXMgZ3JlYXRlciB0aGFuIGV4dGVybmFsIHZlcnNpb24uXG4gKlxuICogQHBhcmFtIGV4dGVybmFsVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBhcGkgd2hpY2ggdGhlIHBsYXRmb3JtIGlzIHVzaW5nXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVWZXJzaW9uQ29udmVydGVyKGV4dGVybmFsVmVyc2lvbjogVmVyc2lvbk51bWJlciwgcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyKTogSW50ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICByZXR1cm4gQ3JlYXRlVmVyc2lvbkNvbnZlcnRlcldpdGhUcmFuc2xhdG9ycyhcbiAgICBleHRlcm5hbFZlcnNpb24sXG4gICAgcGxhdGZvcm1WZXJzaW9uLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVzLFxuICAgIEV4ZWN1dGVNaW5vckRvd25ncmFkZXMsXG4gICAgTm90aWZpY2F0aW9uTWlub3JEb3duZ3JhZGVzLFxuICApO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIENyZWF0ZVZlcnNpb25Db252ZXJ0ZXIuIFRoaXMgZnVuY3Rpb24gdGFrZXMgdGhlIHVwZ3JhZGUsIGRvd25ncmFkZSwgYW5kXG4gKiBub3RpZmljYXRpb24gYXJyYXlzIHNvIHRoYXQgYWxsIHRoZSBsb2dpYyBjYW4gYmUgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICogQHBhcmFtIHVwZ3JhZGVzIE1ham9yTWlub3JUcmFuc2xhdG9ycyBmb3IgdXBncmFkZXNcbiAqIEBwYXJhbSBkb3duZ3JhZGVzIE1ham9yTWlub3JUcmFuc2xhdG9ycyBmb3IgZG93bmdyYWRlc1xuICogQHBhcmFtIG5vdGlmaWNhdGlvbkRvd25ncmFkZXMgTWFqb3JNaW5vclRyYW5zbGF0b3JzIGZvciBub3RpZmljYXRpb24gZG93bmdyYWRlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlVmVyc2lvbkNvbnZlcnRlcldpdGhUcmFuc2xhdG9ycyhcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHVwZ3JhZGVzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zLlVwZ3JhZGVFeGVjdXRlQ2FsbD4sXG4gIGRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4sXG4gIG5vdGlmaWNhdGlvbkRvd25ncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPixcbik6IEludGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgY29uc3QgZXh0ZXJuYWxNYWpvclZlcnNpb246IG51bWJlciA9IGV4dGVybmFsVmVyc2lvbi5tYWpvcjtcbiAgY29uc3QgZXh0ZXJuYWxNaW5vclZlcnNpb246IG51bWJlciA9IGV4dGVybmFsVmVyc2lvbi5taW5vcjtcbiAgY29uc3QgcGxhdGZvcm1NYWpvclZlcnNpb246IG51bWJlciA9IHBsYXRmb3JtVmVyc2lvbi5tYWpvcjtcblxuICBpZiAoZXh0ZXJuYWxNYWpvclZlcnNpb24gPiBwbGF0Zm9ybU1ham9yVmVyc2lvbikge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXh0ZXJuYWwgdmVyc2lvbiBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byBwbGF0Zm9ybSB2ZXJzaW9uLlxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uPSR7ZXh0ZXJuYWxNYWpvclZlcnNpb259IHBsYXRmb3JtTWFqb3JWZXJzaW9uPSR7cGxhdGZvcm1NYWpvclZlcnNpb259YCk7XG4gIH1cblxuICAvLyBJZiB3ZSBhcmUgdXNpbmcgdGhlIGV4YWN0IHNhbWUgdmVyc2lvbnMgKG1ham9yLm1pbm9yKSwganVzdCB1c2UgdGhlIGlkZW50aXR5IGNvbnZlcnRlclxuICBpZiAoVmVyc2lvbkVxdWFsVG8oZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIG5ldyBJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXIoKTtcbiAgfVxuXG4gIC8vIFdhbGsgdGhlIHNwYW4gYmV0d2VlbiB0aGUgdmVyc2lvbnMgd2UgaGF2ZSBoZXJlIGFuZCBjb2xsZWN0IHRoZSB1cGdyYWRlIGFuZCBkb3duZ3JhZGVzIG5lY2Vzc2FyeVxuICBjb25zdCBuZWVkZWRFeGVjdXRlVXBncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlRXhlY3V0ZUNhbGw+ID0gR2V0TmVlZGVkVHJhbnNsYXRpb25zKFxuICAgIGV4dGVybmFsTWFqb3JWZXJzaW9uLFxuICAgIHBsYXRmb3JtTWFqb3JWZXJzaW9uLFxuICAgIGV4dGVybmFsTWlub3JWZXJzaW9uLFxuICAgIHVwZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVEb3duZ3JhZGVzOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZVJldHVybj4gPSBHZXROZWVkZWRUcmFuc2xhdGlvbnMoXG4gICAgZXh0ZXJuYWxNYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgZXh0ZXJuYWxNaW5vclZlcnNpb24sXG4gICAgZG93bmdyYWRlcyxcbiAgKTtcblxuICBjb25zdCBuZWVkZWROb3RpZmljYXRpb25Eb3duZ3JhZGVzOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlTm90aWZpY2F0aW9uPiA9IEdldE5lZWRlZFRyYW5zbGF0aW9ucyhcbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBleHRlcm5hbE1pbm9yVmVyc2lvbixcbiAgICBub3RpZmljYXRpb25Eb3duZ3JhZGVzLFxuICApO1xuXG4gIC8vIFdlIHdhbnQgdG8gYXBwbHkgdGhlIGRvd25ncmFkZXMgaW4gcmV2ZXJzZSBvcmRlciBpbiBjYXNlIG9mIGRlcGVuZGVuY2llcyBiZXR3ZWVuIHRoZW1cbiAgbmVlZGVkRXhlY3V0ZURvd25ncmFkZXMucmV2ZXJzZSgpO1xuICBuZWVkZWROb3RpZmljYXRpb25Eb3duZ3JhZGVzLnJldmVyc2UoKTtcblxuICByZXR1cm4gU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyLmZyb21EYXRhKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgbmVlZGVkRXhlY3V0ZVVwZ3JhZGVzLFxuICAgIG5lZWRlZEV4ZWN1dGVEb3duZ3JhZGVzLFxuICAgIG5lZWRlZE5vdGlmaWNhdGlvbkRvd25ncmFkZXMsXG4gICk7XG59XG5cbmZ1bmN0aW9uIEdldE5lZWRlZFRyYW5zbGF0aW9uczxUPihcbiAgZXh0ZXJuYWxNYWpvclZlcnNpb246IG51bWJlcixcbiAgcGxhdGZvcm1NYWpvclZlcnNpb246IG51bWJlcixcbiAgZXh0ZXJuYWxNaW5vclZlcnNpb246IG51bWJlcixcbiAgbWFqb3JNaW5vclRyYW5zbGF0b3JzOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VD4sXG4pOiBBcnJheTxUPiB7XG4gIGNvbnN0IG5lZWRlZFRyYW5zbGF0aW9uczogQXJyYXk8VD4gPSBbXTtcblxuICBmb3IgKGxldCBtYWpvciA9IGV4dGVybmFsTWFqb3JWZXJzaW9uOyBtYWpvciA8PSBwbGF0Zm9ybU1ham9yVmVyc2lvbjsgbWFqb3IrKykge1xuICAgIGlmIChtYWpvciBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnMpIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gbWFqb3IgPT09IGV4dGVybmFsTWFqb3JWZXJzaW9uID8gZXh0ZXJuYWxNaW5vclZlcnNpb24gOiAwO1xuICAgICAgY29uc3QgbWF4aW11bU1pbm9yVmVyc2lvbiA9IEdldE1heGltdW1NaW5vckluZGV4KE9iamVjdC5rZXlzKG1ham9yTWlub3JUcmFuc2xhdG9yc1ttYWpvcl0pKTtcbiAgICAgIGZvciAobGV0IG1pbm9yID0gc3RhcnQ7IG1pbm9yIDw9IG1heGltdW1NaW5vclZlcnNpb247IG1pbm9yKyspIHtcbiAgICAgICAgaWYgKG1pbm9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9yc1ttYWpvcl0pIHtcbiAgICAgICAgICBuZWVkZWRUcmFuc2xhdGlvbnMucHVzaCguLi5tYWpvck1pbm9yVHJhbnNsYXRvcnNbbWFqb3JdW21pbm9yXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmVlZGVkVHJhbnNsYXRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gR2V0TWF4aW11bU1pbm9ySW5kZXgobWlub3JWZXJzaW9uczogQXJyYXk8c3RyaW5nPik6IG51bWJlciB7XG4gIHJldHVybiBtaW5vclZlcnNpb25zLm1hcCgoYSkgPT4gTnVtYmVyKGEpKS5yZWR1Y2UoKGEsIGIpID0+IChhID4gYiA/IGEgOiBiKSk7XG59XG4iLCJpbXBvcnQge1xuICBDbGFzc05hbWVLZXksXG4gIERhdGVTdGVwUGVyaW9kLFxuICBEb21haW5SZXN0cmljdGlvblR5cGUsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeGVjdXRlUmVzcG9uc2UsXG4gIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8sXG4gIEV4dGVuc2lvbkNvbnRleHQsXG4gIE5vdGlmaWNhdGlvbixcbiAgUGFyYW1ldGVySW5mbyxcbiAgVmVyYklkLFxuICBWaXN1YWxJZCxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nLFxufSBmcm9tICcuLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuaW1wb3J0IHsgTm90aWZpY2F0aW9uSWQgfSBmcm9tICcuLi9jb250cmFjdC9Ob3RpZmljYXRpb25zJztcblxuLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG5cbi8qKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgb2xkIHZlcnMgYW5kIHBhcmFtZXRlcnMgZnJvbSB0aGUgZXh0ZXJuYWwgYmVmb3JlIHdlIHNlbmQgaXQgdG8gcGxhdGZvcm0gKi9cbmV4cG9ydCB0eXBlIFVwZ3JhZGVFeGVjdXRlQ2FsbCA9ICh2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKSA9PiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfTtcblxuLyoqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZWQgYSByZXNwb25zZSBiYWNrIGZyb20gcGxhdGZvcm0gYW5kIHdlIG5lZWQgdG8gZG93bmdyYWRlIGl0IHRvIGV4dGVybmFsJ3MgdmVyc2lvbiAqL1xuZXhwb3J0IHR5cGUgRG93bmdyYWRlRXhlY3V0ZVJldHVybiA9IChleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSkgPT4gRXhlY3V0ZVJlc3BvbnNlO1xuXG4vKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGZyb20gcGxhdGZvcm0gYW5kIHdlIG5lZWQgdG8gZG93bmdyYWRlIGl0IHRvIGV4dGVybmFsJ3MgdmVyc2lvbiAqL1xuZXhwb3J0IHR5cGUgRG93bmdyYWRlTm90aWZpY2F0aW9uID0gKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKSA9PiBOb3RpZmljYXRpb247XG5cbi8vIFRoaXMgaXMgd2hlcmUgd2Ugd2lsbCBzdGFydCB0byBkZWZpbmUgc29tZSBvZiB0aGVzZSB0cmFuc2xhdGlvbnMuXG4vLyBXaGVuIG1vZGlmeWluZyBleGlzdGluZyBtb2RlbHMsIGFkZCB0aGUgcmVxdWlzaXRlIGNvbnZlcnNpb24gZnVuY3Rpb25zIGhlcmUsIHRoZW4gdXNlIHRoZW1cbi8vIGluIHRoZSBWZXJzaW9uQ29udmVydGVyRmFjdG9yeSBpbXBsZW1lbnRhdGlvbi4gSW1wb3J0IG9sZCB2ZXJzaW9ucyBhcyB5b3Ugd291bGQgYW55IG90aGVyIG1vZHVsZVxuXG4vLyAwIDwtPiBUcmFuc2xhdGlvbnNcbi8vIFVuY29tbWVudCB0aGlzIGxpbmUgdG8gaW1wb3J0IGZyb20gdGhlIFYwIGRlZmluaXRpb24gb2YgdGhlIEFQSVxuLy8gaW1wb3J0ICogYXMgVjAgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzLXYwJztcblxuLy8gMSA8LT4gMiBUcmFuc2xhdGlvbnNcbi8vIFVuY29tbWVudCB0aGlzIGxpbmUgdG8gaW1wb3J0IGZyb20gdGhlIFYxIGRlZmluaXRpb24gb2YgdGhlIEFQSVxuLy8gaW1wb3J0ICogYXMgVjEgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzLXYxJztcblxuZXhwb3J0IGZ1bmN0aW9uIERvd25ncmFkZVdvcmtzaGVldE5hbWVzKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgLy8gRml4IHRoZSBkYXNoYm9hcmQgZnJpZW5kbHkgbmFtZSBpc3N1ZS4gVGhlIHN0cnVjdHVyZXMgYXJlIGNvbXBhdGlibGUsXG4gIC8vIHNvIHdlIHN0aWxsIHJldHVybiB0aGUgb3JpZ2luYWwgcmVwbHksIGJ1dCB3ZSBjb3B5IHRoZSBTaGVldEluZm8ubmFtZVxuICAvLyBpbnRvIHRoZSBEYXNoYm9hcmRab25lLm5hbWUsIHdoZXJlIHYxIHdhbnRzIHRvIGZpbmQgaXQuXG5cbiAgY29uc3QgYm9vdHN0cmFwSW5mbyA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbztcbiAgaWYgKGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRGFzaGJvYXJkSW5mbyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYm9vdHN0cmFwSW5mby5leHRlbnNpb25EYXNoYm9hcmRJbmZvLnpvbmVzLmZvckVhY2goKHpvbmUpID0+IHtcbiAgICAgIGlmICh6b25lLnNoZWV0SW5mbykge1xuICAgICAgICB6b25lLm5hbWUgPSB6b25lLnNoZWV0SW5mby5uYW1lO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIGV4ZWN1dGVSZXNwb25zZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIERvd25ncmFkZUZsaXBib2FyZFpvbmVJRChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbiB7XG4gIC8vIEZpeCB0aGUgRmxpcGJvYXJkWm9uZUlkIGlzc3VlLiBPbGRlciBleHRlcm5hbCB2ZXJzaW9ucyBzdGlsbCBjaGVjayBmb3IgZmxpcGJvYXJkWm9uZUlEcy5cbiAgLy8gV2hlbiBydW5uaW5nIGFnYWluc3QgYSBuZXdlciBzZXJ2ZXIsIGlmIGZsaXBib2FyZFpvbmVJZCBpcyBhYnNlbnQsIHNldCBpdCB0byBkZWZhdWx0KDApLlxuXG4gIGlmIChub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWQgPT09IE5vdGlmaWNhdGlvbklkLlNlbGVjdGVkTWFya3NDaGFuZ2VkKSB7XG4gICAgY29uc3QgdmlzdWFsTW9kZWwgPSBub3RpZmljYXRpb24uZGF0YSBhcyBWaXN1YWxJZDtcbiAgICBpZiAodmlzdWFsTW9kZWwuZmxpcGJvYXJkWm9uZUlEID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHZpc3VhbE1vZGVsLmZsaXBib2FyZFpvbmVJRCA9IDA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5vdGlmaWNhdGlvbjtcbn1cblxuLy8gRmlsdGVyIG91dCBmb3JtYXR0aW5nIHNoZWV0cyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIGNsYXNzTmFtZXMgbGlzdFxuZnVuY3Rpb24gRG93bmdyYWRlV29ya3NoZWV0Rm9ybWF0dGluZyhleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgY2xhc3NOYW1lczogQ2xhc3NOYW1lS2V5W10pOiBFeGVjdXRlUmVzcG9uc2Uge1xuICBjb25zdCBib290c3RyYXBJbmZvID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25Cb290c3RyYXBJbmZvO1xuXG4gIGlmIChib290c3RyYXBJbmZvPy5leHRlbnNpb25Xb3Jrc2hlZXRJbmZvPy5mb3JtYXR0aW5nKVxuICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uV29ya3NoZWV0SW5mby5mb3JtYXR0aW5nLmZvcm1hdHRpbmdTaGVldHMgPVxuICAgICAgYm9vdHN0cmFwSW5mby5leHRlbnNpb25Xb3Jrc2hlZXRJbmZvLmZvcm1hdHRpbmcuZm9ybWF0dGluZ1NoZWV0cy5maWx0ZXIoKHgpID0+ICFjbGFzc05hbWVzLmluY2x1ZGVzKHguY2xhc3NOYW1lS2V5KSk7XG4gIHJldHVybiBleGVjdXRlUmVzcG9uc2U7XG59XG5cbi8vIEZpbHRlciBvdXQgZm9ybWF0dGluZyBzaGVldHMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBjbGFzc05hbWVzIGxpc3Rcbi8vIEZpbHRlciBvdXQgZm9ybWF0dGluZyBzaGVldHMgdGhhdCBhcmUgc3BlY2lmaWVkIGluIHRoZSBjbGFzc05hbWVzIGxpc3RcbmZ1bmN0aW9uIERvd25ncmFkZVdvcmtzaGVldEZvcm1hdHRpbmdOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24sIGNsYXNzTmFtZXM6IENsYXNzTmFtZUtleVtdKTogTm90aWZpY2F0aW9uIHtcbiAgaWYgKG5vdGlmaWNhdGlvbi5ub3RpZmljYXRpb25JZCA9PT0gTm90aWZpY2F0aW9uSWQuV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWQpIHtcbiAgICBjb25zdCBmb3JtYXR0aW5nID0gbm90aWZpY2F0aW9uLmRhdGEgYXMgV29ya2Jvb2tGb3JtYXR0aW5nO1xuICAgIG5vdGlmaWNhdGlvbi5kYXRhID0gZm9ybWF0dGluZy5mb3JtYXR0aW5nU2hlZXRzLmZpbHRlcigoeCkgPT4gIWNsYXNzTmFtZXMuaW5jbHVkZXMoeC5jbGFzc05hbWVLZXkpKTtcbiAgfVxuXG4gIHJldHVybiBub3RpZmljYXRpb247XG59XG5cbi8vIFdlIGFkZGVkIG5ldyBlbnVtIHZhbHVlcyBmb3IgQ2xhc3NOYW1lS2V5cyBlbnVtIGluIDE3Ni4gTmVlZCB0byBmaWx0ZXIgdGhlbSBvdXQgaWYgdGhlIGNsaWVudCB2ZXJzaW9uIGlzIDwxNzZcbmNvbnN0IENsYXNzTmFtZUtleXNUb0ZpbHRlcjE3NSA9IFtDbGFzc05hbWVLZXkuUm93RGl2aWRlcnMsIENsYXNzTmFtZUtleS5Db2x1bW5EaXZpZGVycywgQ2xhc3NOYW1lS2V5LlBhbmVdO1xuXG5leHBvcnQgY29uc3QgRG93bmdyYWRlV29ya3NoZWV0Rm9tYXR0aW5nMTc1ID0gKHJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+XG4gIERvd25ncmFkZVdvcmtzaGVldEZvcm1hdHRpbmcocmVzcG9uc2UsIENsYXNzTmFtZUtleXNUb0ZpbHRlcjE3NSk7XG5leHBvcnQgY29uc3QgRG93bmdyYWRlV29ya3NoZWV0Rm9tYXR0aW5nTm90aWZpY2F0aW9uMTc1ID0gKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKSA9PlxuICBEb3duZ3JhZGVXb3Jrc2hlZXRGb3JtYXR0aW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbiwgQ2xhc3NOYW1lS2V5c1RvRmlsdGVyMTc1KTtcblxuZXhwb3J0IGZ1bmN0aW9uIERvd25ncmFkZUV4dGVuc2lvbkVudmlyb25tZW50Q29udGV4dChleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gIC8vIEZpeCB0aGUgZXh0ZW5zaW9uIGVudmlyb25tZW50IGNvbnRleHQgaXNzdWUuIFJlcGxhY2VzIG5ldyBlbnVtIHZhbHVlcyB0aGF0IGdvIHVucmVjb2duaXplZFxuICAvLyBieSBvbGRlciBleHRlbnNpb25zIHdpdGggdGhlaXIgcmVzcGVjdGl2ZSBvbGRlciBlbnVtIHZhbHVlcy5cbiAgY29uc3QgYm9vdHN0cmFwSW5mbyA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgRXh0ZW5zaW9uQm9vdHN0cmFwSW5mbztcblxuICBpZiAoYm9vdHN0cmFwSW5mby5leHRlbnNpb25FbnZpcm9ubWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgY29udGV4dCA9IGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ29udGV4dDtcbiAgICBpZiAoY29udGV4dCA9PT0gRXh0ZW5zaW9uQ29udGV4dC5QdWJsaWNXZWIgfHwgY29udGV4dCA9PT0gRXh0ZW5zaW9uQ29udGV4dC5DbG91ZCkge1xuICAgICAgYm9vdHN0cmFwSW5mby5leHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25Db250ZXh0ID0gRXh0ZW5zaW9uQ29udGV4dC5TZXJ2ZXI7XG4gICAgfSBlbHNlIGlmIChjb250ZXh0ID09PSBFeHRlbnNpb25Db250ZXh0LlB1YmxpY0Rlc2t0b3ApIHtcbiAgICAgIGJvb3RzdHJhcEluZm8uZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ29udGV4dCA9IEV4dGVuc2lvbkNvbnRleHQuRGVza3RvcDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuXG5mdW5jdGlvbiBIYW5kbGVEb3duZ3JhZGVQZXJpb2RUeXBlRm9yUGFyYW1ldGVyKHBhcmFtZXRlcjogUGFyYW1ldGVySW5mbykge1xuICBpZiAocGFyYW1ldGVyLmFsbG93YWJsZVZhbHVlc1R5cGUgPT09IERvbWFpblJlc3RyaWN0aW9uVHlwZS5SYW5nZSkge1xuICAgIGlmIChwYXJhbWV0ZXIuZGF0ZVN0ZXBQZXJpb2QgPT09IERhdGVTdGVwUGVyaW9kLklzb1llYXJzKSB7XG4gICAgICBwYXJhbWV0ZXIuZGF0ZVN0ZXBQZXJpb2QgPSBEYXRlU3RlcFBlcmlvZC5ZZWFycztcbiAgICB9IGVsc2UgaWYgKHBhcmFtZXRlci5kYXRlU3RlcFBlcmlvZCA9PT0gRGF0ZVN0ZXBQZXJpb2QuSXNvUXVhcnRlcnMpIHtcbiAgICAgIHBhcmFtZXRlci5kYXRlU3RlcFBlcmlvZCA9IERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzO1xuICAgIH0gZWxzZSBpZiAocGFyYW1ldGVyLmRhdGVTdGVwUGVyaW9kID09PSBEYXRlU3RlcFBlcmlvZC5Jc29XZWVrcykge1xuICAgICAgcGFyYW1ldGVyLmRhdGVTdGVwUGVyaW9kID0gRGF0ZVN0ZXBQZXJpb2QuV2Vla3M7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBEb3duZ3JhZGVQZXJpb2RUeXBlKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCkpIHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0gZXhlY3V0ZVJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxQYXJhbWV0ZXJJbmZvPjtcbiAgICBmb3IgKGNvbnN0IHBhcmFtZXRlciBvZiBwYXJhbWV0ZXJzKSB7XG4gICAgICBIYW5kbGVEb3duZ3JhZGVQZXJpb2RUeXBlRm9yUGFyYW1ldGVyKHBhcmFtZXRlcik7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IHBhcmFtZXRlciA9IGV4ZWN1dGVSZXNwb25zZS5yZXN1bHQgYXMgUGFyYW1ldGVySW5mbztcbiAgICBIYW5kbGVEb3duZ3JhZGVQZXJpb2RUeXBlRm9yUGFyYW1ldGVyKHBhcmFtZXRlcik7XG4gIH1cblxuICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4ZWN1dGVSZXNwb25zZSwgTm90aWZpY2F0aW9uLCBWZXJiSWQgfSBmcm9tICcuLi8uLi9Kc0FwaUludGVybmFsQ29udHJhY3QnO1xuXG4vLyBXZSBuZWVkIHRvIGRpc2FibGUgYW55IGJlY2F1c2UgdGhlc2UgbWV0aG9kcyBuZWVkIHRvIGJlIGdlbmVyaWNcbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG5leHBvcnQgaW50ZXJmYWNlIEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIHtcbiAgLyoqXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgcmVjZWl2ZSBhIG5ld2VyIHZlcmIgYW5kIHBhcmFtZXRlcnMgZnJvbSBleHRlcm5hbFxuICAgKiBhbmQgbmVlZCB0byBkb3duZ3JhZGUgaXQgZm9yIGFuIG9sZGVyIHBsYXRmb3JtXG4gICAqL1xuICBkb3duZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiOiBhbnksIHBhcmFtZXRlcnM6IGFueSk6IHsgdmVyYjogVmVyYklkOyBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyB9O1xuXG4gIC8qKlxuICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gYW4gb2xkZXIgcGxhdGZvcm0gYW5kIHdlIG5lZWRcbiAgICogdG8gdXBncmFkZSBpdCB0byBhIG5ld2VyIGV4dGVybmFsLiBUaGUgdmVyYiBhbmQgcGFyYW1ldGVycyBwcm92aWRlIGNvbnRleHQgdG8gYmUgYWJsZSB0byBtYWtlXG4gICAqIGRlY2lzaW9ucyBvbiB3aGF0IHdlIG5lZWQgdG8gZG8uXG4gICAqL1xuICB1cGdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IEV4ZWN1dGVSZXNwb25zZTtcblxuICAvKiogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSByZWNlaXZlIGEgbm90aWZpY2F0aW9uIGZyb20gcGxhdGZvcm0gYW5kIHdlIG5lZWQgdG8gdXBncmFkZSBpdCB0byBleHRlcm5hbCdzIHZlcnNpb24gKi9cbiAgdXBncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IE5vdGlmaWNhdGlvbjtcbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuXG4vKipcbiAqIFRoaXMgdmVyc2lvbiBjb252ZXJ0ZXIgZG9lc24ndCBhY3R1YWxseSBkbyBhbnl0aGluZyBidXQgaXMgdXNlZnVsIGZvciB0ZXN0aW5nIG9yIHdoZW4gd2UgaGF2ZVxuICogYSBtYXRjaGluZyBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgdmVyc2lvbiBudW1iZXJcbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIGltcGxlbWVudHMgRXh0ZXJuYWxDb250cmFjdFZlcnNpb25Db252ZXJ0ZXIge1xuICBwdWJsaWMgZG93bmdyYWRlRXhlY3V0ZUNhbGwodmVyYjogYW55LCBwYXJhbWV0ZXJzOiBhbnkpOiB7IHZlcmI6IFZlcmJJZDsgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgfSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHZlcmI6IHZlcmIgYXMgVmVyYklkLFxuICAgICAgcGFyYW1ldGVyczogcGFyYW1ldGVycyBhcyBFeGVjdXRlUGFyYW1ldGVycyxcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVFeGVjdXRlUmV0dXJuKGV4ZWN1dGVSZXNwb25zZTogRXhlY3V0ZVJlc3BvbnNlLCB2ZXJiOiBWZXJiSWQsIHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzKTogRXhlY3V0ZVJlc3BvbnNlIHtcbiAgICByZXR1cm4gZXhlY3V0ZVJlc3BvbnNlO1xuICB9XG5cbiAgcHVibGljIHVwZ3JhZGVOb3RpZmljYXRpb24obm90aWZpY2F0aW9uOiBOb3RpZmljYXRpb24pOiBOb3RpZmljYXRpb24ge1xuICAgIHJldHVybiBub3RpZmljYXRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBFeGVjdXRlUmVzcG9uc2UsIE5vdGlmaWNhdGlvbiwgVmVyYklkLCBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi4vLi4vSnNBcGlJbnRlcm5hbENvbnRyYWN0JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgKiBhcyBUcmFuc2xhdGlvbnMgZnJvbSAnLi9FeHRlcm5hbFZlcnNpb25UcmFuc2xhdGlvbnMnO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbi8qKlxuICogVGhlIHZlcnNpb24gY29udmVydGVyIGlzIGRlc2lnbmVkIHRvIGFsbG93IHRoZSBwbGF0Zm9ybSBhbmQgZXh0ZXJuYWwgbW9kdWxlc1xuICogdG8gc2VlbWxlc3NseSBjb21tdW5pY2F0ZSBvdmVyIHR3byBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIGludGVybmFsIEFQSS4gVGhpcyBjb252ZXJ0ZXJcbiAqIHN1cHBvcnRzIGV4dGVybmFsJ3MgdmVyc2lvbihtaW5vcikgPj0gcGxhdGZvcm0ncyB2ZXJzaW9uKG1pbm9yKS4gV2hlbiBleGVjdXRpbmdcbiAqIGNvbW1hbmRzLCBpdCBpcyB1c2VkIHRvIGRvd25ncmFkZSB0aGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gdG8gd2hhdCBwbGF0Zm9ybSBrbm93cyBvbiB0aGUgd2F5IGluXG4gKiBhbmQgdXBncmFkZSB0aGUgcmVwcmVzZW50YXRpb25zIG9uIHRoZSB3YXkgb3V0LlxuICovXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgaW1wbGVtZW50cyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXJcbiAgICpcbiAgICogQHBhcmFtIF9leHRlcm5hbFZlcnNpb24gVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IGFwaS1leHRlcm5hbC1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX3BsYXRmb3JtVmVyc2lvbiBUaGUgdmVyc2lvbiBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3QgdGhlIGFwaS1wbGF0Zm9ybS1qcyBpcyB1c2luZ1xuICAgKiBAcGFyYW0gX2Rvd25ncmFkZUV4ZWN1dGVDYWxsVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB0aGUgdHJhbnNsYXRpb25zIHRvIHBlcmZvcm0gd2hlbiBkb3duZ3JhZGluZyBjbWQgcGFyYW1ldGVyc1xuICAgKiBAcGFyYW0gX3VwZ3JhZGVFeGVjdXRlUmV0dXJuVHJhbnNsYXRpb25zIE9yZGVyZWQgbGlzdCBvZiB1cGdyYWRlIHRyYW5zbGF0aW9ucyB0byBwZXJmb3JtIGFmdGVyIGEgY21kIGlzIGV4ZWN1dGVkXG4gICAqIEBwYXJhbSBfdXBncmFkZU5vdGlmaWNhdGlvblRyYW5zbGF0aW9ucyBPcmRlcmVkIGxpc3Qgb2YgdXBncmFkZSBub3RmaWNhdGlvbnMgdG8gcGVyZm9ybSBvbiBldmVudHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9leHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gICAgcHJpdmF0ZSBfcGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICAgIHByaXZhdGUgX2Rvd25ncmFkZUV4ZWN1dGVDYWxsVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuRG93bmdyYWRlRXhlY3V0ZUNhbGw+LFxuICAgIHByaXZhdGUgX3VwZ3JhZGVFeGVjdXRlUmV0dXJuVHJhbnNsYXRpb25zOiBBcnJheTxUcmFuc2xhdGlvbnMuVXBncmFkZUV4ZWN1dGVSZXR1cm4+LFxuICAgIHByaXZhdGUgX3VwZ3JhZGVOb3RpZmljYXRpb25UcmFuc2xhdGlvbnM6IEFycmF5PFRyYW5zbGF0aW9ucy5VcGdyYWRlTm90aWZpY2F0aW9uPixcbiAgKSB7XG4gICAgaWYgKHRoaXMuX2V4dGVybmFsVmVyc2lvbi5tYWpvciA+IHRoaXMuX3BsYXRmb3JtVmVyc2lvbi5tYWpvcikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgY29udmVydCBiZXR3ZWVuIGV4dGVybmFsIHZlcnNpb24gJHt0aGlzLl9leHRlcm5hbFZlcnNpb24ubWFqb3J9XG4gICAgICBhbmQgJHt0aGlzLl9wbGF0Zm9ybVZlcnNpb24ubWFqb3J9YCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGRvd25ncmFkZUV4ZWN1dGVDYWxsKHZlcmI6IGFueSwgcGFyYW1ldGVyczogYW55KTogeyB2ZXJiOiBWZXJiSWQ7IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzIH0ge1xuICAgIC8vIFBlcmZvcm0gdGhlIGRvd25ncmFkZSBvZiB0aGUgdmVyYiBhbmQgcGFyYW1ldGVycyB0byB0aGUgbGV2ZWwgdGhhdCBwbGF0Zm9ybSBpcyB1c2luZ1xuICAgIGxldCBkb3duZ3JhZGVkID0geyB2ZXJiOiB2ZXJiLCBwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzIH07XG4gICAgZm9yIChjb25zdCBkb3duZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl9kb3duZ3JhZGVFeGVjdXRlQ2FsbFRyYW5zbGF0aW9ucykge1xuICAgICAgZG93bmdyYWRlZCA9IGRvd25ncmFkZVRyYW5zbGF0aW9uKGRvd25ncmFkZWQudmVyYiwgZG93bmdyYWRlZC5wYXJhbWV0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZG93bmdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlRXhlY3V0ZVJldHVybihleGVjdXRlUmVzcG9uc2U6IEV4ZWN1dGVSZXNwb25zZSwgdmVyYjogVmVyYklkLCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyk6IEV4ZWN1dGVSZXNwb25zZSB7XG4gICAgLy8gUGVyZm9ybSB0aGUgdXBncmFkZSBvZiB0aGUgcmVzcG9uc2UgdG8gd2hhdCB0aGUgZXh0ZXJuYWwgbW9kdWxlIGlzIGV4cGVjdGluZ1xuICAgIGxldCB1cGdyYWRlZCA9IGV4ZWN1dGVSZXNwb25zZTtcbiAgICBmb3IgKGNvbnN0IHVwZ3JhZGVUcmFuc2xhdGlvbiBvZiB0aGlzLl91cGdyYWRlRXhlY3V0ZVJldHVyblRyYW5zbGF0aW9ucykge1xuICAgICAgdXBncmFkZWQgPSB1cGdyYWRlVHJhbnNsYXRpb24odXBncmFkZWQsIHZlcmIsIHBhcmFtZXRlcnMpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxuXG4gIHB1YmxpYyB1cGdyYWRlTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbjogTm90aWZpY2F0aW9uKTogTm90aWZpY2F0aW9uIHtcbiAgICAvLyBQZXJmb3JtIHRoZSB1cGdyYWRlIG9mIG5vdGlmaWNhdGlvbiB0byB3aGF0IHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgZXhwZWN0aW5nXG4gICAgbGV0IHVwZ3JhZGVkID0gbm90aWZpY2F0aW9uO1xuICAgIGZvciAoY29uc3QgdXBncmFkZU5vdGlmaWNhdGlvbiBvZiB0aGlzLl91cGdyYWRlTm90aWZpY2F0aW9uVHJhbnNsYXRpb25zKSB7XG4gICAgICB1cGdyYWRlZCA9IHVwZ3JhZGVOb3RpZmljYXRpb24odXBncmFkZWQpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGdyYWRlZDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgVmVyc2lvbk51bWJlciB9IGZyb20gJy4uLy4uL0pzQXBpSW50ZXJuYWxDb250cmFjdCc7XG5pbXBvcnQgeyBHZXRNYXhpbXVtTWlub3JJbmRleCwgTWFqb3JNaW5vclRyYW5zbGF0b3JzLCBWZXJzaW9uRXF1YWxUbyB9IGZyb20gJy4uL1ZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5JztcbmltcG9ydCB7IEV4dGVybmFsQ29udHJhY3RWZXJzaW9uQ29udmVydGVyIH0gZnJvbSAnLi9FeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcic7XG5pbXBvcnQgeyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlciB9IGZyb20gJy4vRXh0ZXJuYWxJZGVudGl0eVZlcnNpb25Db252ZXJ0ZXInO1xuaW1wb3J0IHsgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIgfSBmcm9tICcuL0V4dGVybmFsU3RhY2tpbmdWZXJzaW9uQ29udmVydGVyJztcbmltcG9ydCAqIGFzIFRyYW5zbGF0aW9uc0V4dGVybmFsIGZyb20gJy4vRXh0ZXJuYWxWZXJzaW9uVHJhbnNsYXRpb25zJztcblxuLy8gQSBtYXBwaW5nIGZyb20gdGhlIGN1cnJlbnQgY2xpZW50IHZlcnNpb24gb2YgaW50ZXJuYWwtY29udHJhY3QgdG8gYW4gb2xkZXIgcGxhdGZvcm0gdmVyc2lvbiBvZiB0aGUgY29udHJhY3QuXG4vLyBFYWNoIHZlcnNpb24gYnVtcCBjYW4gaGF2ZSBhbiBhcnJheSBvZiB0cmFuc2xhdGlvbnMgdG8gcGVyZm9ybSBpbiBvcmRlci5cbi8vIFRoZXNlIHRyYW5zbGF0aW9ucyBoYW5kbGUgZG93bmdyYWRlRXhlY3V0ZUNhbGwgYW5kIHVwZ3JhZGVFeGVjdXRlUmV0dXJuIGFuZCBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIG9uIHRoZVxuLy8gY2xpZW50L2V4dGVybmFsIHNpZGUuXG4vLyBXaGVuIHVwZGF0aW5nIHRoZSBtYWpvciBvciBtaW5vciB2ZXJzaW9uIG9mIG91ciBpbnRlcm5hbC1jb250cmFjdCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzLlxuLy8gKiBJZiB0aGVyZSBhcmUgdHJhbnNsYXRpb25zIHRvIGFkZCwgYWRkIHRoZW0gdG8gdGhlIHZlcnNpb24gdG8gJ3VwZ3JhZGUgZnJvbScgb3IgJ2Rvd25ncmFkZSB0bycuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuRG93bmdyYWRlRXhlY3V0ZUNhbGw+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgZG93bmdyYWRlcyBmcm9tIDEuMTAgdG8gMS45IGluIHRoZSBbMV1bOV0gYnVja2V0XG4gIH0sXG59O1xuXG5leHBvcnQgY29uc3QgRXhlY3V0ZU1pbm9yVXBncmFkZVJldHVybkV4dGVybmFsOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0ge1xuICAxOiB7XG4gICAgOTogW10sIC8vIE5vdGUgdGhhdCB3ZSBwdXQgdXBncmFkZXMgZnJvbSAxLjkgdG8gMS4xMCBpbiB0aGUgWzFdWzldIGJ1Y2tldFxuICB9LFxufTtcblxuZXhwb3J0IGNvbnN0IEV4ZWN1dGVNaW5vclVwZ3JhZGVOb3RpZmljYXRpb246IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlTm90aWZpY2F0aW9uPiA9IHtcbiAgMToge1xuICAgIDk6IFtdLCAvLyBOb3RlIHRoYXQgd2UgcHV0IHVwZ3JhZGVzIGZyb20gMS45IHRvIDEuMTAgaW4gdGhlIFsxXVs5XSBidWNrZXRcbiAgfSxcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB3aGljaCBoYXMgdGhlIGFiaWxpdHkgdG8gdXBncmFkZSBhbmQgZG93bmdyYWRlXG4gKiB0aGUgY29udHJhY3QgYmV0d2VlbiB0aGUgdHdvIHZlcnNpb25zIHdoaWNoIGFyZSBzcGVjaWZpZWQuIElmIGV4dGVybmFsTWFqb3JWZXJzaW9uIGlzIGxlc3MgdGhhblxuICogcGxhdGZvcm1NYWpvclZlcnNpb24sIGFuIEV4dGVybmFsSWRlbnRpdHlWZXJzaW9uQ29udmVydGVyIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBIYW5kbGVzIHVwZ3JhZGUvZG93bmdyYWRlIGZvciBib3RoIG1ham9yIGFuZCBtaW5vciB1cGRhdGVzLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBleHRlcm5hbCBtb2R1bGUgaXMgdXNpbmdcbiAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgYXBpIHdoaWNoIHRoZSBwbGF0Zm9ybSBpcyB1c2luZ1xuICovXG5leHBvcnQgZnVuY3Rpb24gQ3JlYXRlRXh0ZXJuYWxDb21wYXRpYmxlVmVyc2lvbkNvbnZlcnRlcihcbiAgZXh0ZXJuYWxWZXJzaW9uOiBWZXJzaW9uTnVtYmVyLFxuICBwbGF0Zm9ybVZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIHJldHVybiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICAgIGV4dGVybmFsVmVyc2lvbixcbiAgICBwbGF0Zm9ybVZlcnNpb24sXG4gICAgRXhlY3V0ZU1pbm9yRG93bmdyYWRlQ2FsbEV4dGVybmFsLFxuICAgIEV4ZWN1dGVNaW5vclVwZ3JhZGVSZXR1cm5FeHRlcm5hbCxcbiAgICBFeGVjdXRlTWlub3JVcGdyYWRlTm90aWZpY2F0aW9uLFxuICApO1xufVxuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIENyZWF0ZUV4dGVybmFsQ29tcGF0aWJsZVZlcnNpb25Db252ZXJ0ZXJXaXRoVHJhbnNsYXRvcnMuXG4gKiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSB1cGdyYWRlLCBkb3duZ3JhZGUgYXJyYXlzIHNvIHRoYXQgYWxsIHRoZSBsb2dpYyBjYW4gYmUgdGVzdGVkLlxuICpcbiAqIEBwYXJhbSBleHRlcm5hbFZlcnNpb24gVmVyc2lvbk51bWJlciBvZiB0aGUgaW50ZXJuYWwgY29udHJhY3Qgd2hpY2ggdGhlIGV4dGVybmFsIG1vZHVsZSBpcyB1c2luZ1xuICogQHBhcmFtIHBsYXRmb3JtVmVyc2lvbiBWZXJzaW9uTnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3aGljaCB0aGUgcGxhdGZvcm0gaXMgdXNpbmdcbiAqIEBwYXJhbSB1cGdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIHJlc3BvbnNlIHVwZ3JhZGVzXG4gKiBAcGFyYW0gZG93bmdyYWRlcyBNYWpvck1pbm9yVHJhbnNsYXRvcnMgZm9yIGV4ZWN1dGUgY2FsbCBkb3duZ3JhZGVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyV2l0aFRyYW5zbGF0b3JzKFxuICBleHRlcm5hbFZlcnNpb246IFZlcnNpb25OdW1iZXIsXG4gIHBsYXRmb3JtVmVyc2lvbjogVmVyc2lvbk51bWJlcixcbiAgZG93bmdyYWRlczogTWFqb3JNaW5vclRyYW5zbGF0b3JzPFRyYW5zbGF0aW9uc0V4dGVybmFsLkRvd25ncmFkZUV4ZWN1dGVDYWxsPixcbiAgdXBncmFkZXM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUcmFuc2xhdGlvbnNFeHRlcm5hbC5VcGdyYWRlRXhlY3V0ZVJldHVybj4sXG4gIHVwZ3JhZGVOb3RpZmljYXRpb25zOiBNYWpvck1pbm9yVHJhbnNsYXRvcnM8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZU5vdGlmaWNhdGlvbj4sXG4pOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlciB7XG4gIGNvbnN0IGV4dGVybmFsTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBleHRlcm5hbFZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWFqb3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWFqb3I7XG4gIGNvbnN0IHBsYXRmb3JtTWlub3JWZXJzaW9uOiBudW1iZXIgPSBwbGF0Zm9ybVZlcnNpb24ubWlub3I7XG5cbiAgLy8gVGhpcyBjaGVjayBpcyBwcmVzZW50IGluIFZlcnNpb25Db252ZXJ0ZXJGYWN0b3J5LiBXZSB0aHJvdyB0aGUgc2FtZSBlcnJvciBoZXJlIGFzIHdlbGwuXG4gIC8vIEhlbmNlIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbWlub3IgdmVyc2lvbnMgZm9yIHRyYW5zbGF0aW9ucy5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uID4gcGxhdGZvcm1NYWpvclZlcnNpb24pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4dGVybmFsIHZlcnNpb24gbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcGxhdGZvcm0gdmVyc2lvbi5cbiAgICBleHRlcm5hbE1ham9yVmVyc2lvbj0ke2V4dGVybmFsTWFqb3JWZXJzaW9ufSBwbGF0Zm9ybU1ham9yVmVyc2lvbj0ke3BsYXRmb3JtTWFqb3JWZXJzaW9ufWApO1xuICB9XG5cbiAgaWYgKGV4dGVybmFsTWFqb3JWZXJzaW9uIDwgcGxhdGZvcm1NYWpvclZlcnNpb24gfHwgVmVyc2lvbkVxdWFsVG8oZXh0ZXJuYWxWZXJzaW9uLCBwbGF0Zm9ybVZlcnNpb24pKSB7XG4gICAgcmV0dXJuIG5ldyBFeHRlcm5hbElkZW50aXR5VmVyc2lvbkNvbnZlcnRlcigpO1xuICB9XG5cbiAgLy8gV2FsayB0aGUgc3BhbiBiZXR3ZWVuIHRoZSB2ZXJzaW9ucyB3ZSBoYXZlIGhlcmUgYW5kIGNvbGxlY3QgdGhlIHVwZ3JhZGUgYW5kIGRvd25ncmFkZXMgbmVjZXNzYXJ5XG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVDYWxsRG93bmdyYWRlOiBBcnJheTxUcmFuc2xhdGlvbnNFeHRlcm5hbC5Eb3duZ3JhZGVFeGVjdXRlQ2FsbD4gPSBHZXROZWVkZWRFeHRlcm5hbFRyYW5zbGF0aW9ucyhcbiAgICBwbGF0Zm9ybU1ham9yVmVyc2lvbixcbiAgICBwbGF0Zm9ybU1pbm9yVmVyc2lvbixcbiAgICBkb3duZ3JhZGVzLFxuICApO1xuXG4gIGNvbnN0IG5lZWRlZEV4ZWN1dGVSZXR1cm5VcGdyYWRlczogQXJyYXk8VHJhbnNsYXRpb25zRXh0ZXJuYWwuVXBncmFkZUV4ZWN1dGVSZXR1cm4+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZXMsXG4gICk7XG5cbiAgY29uc3QgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXM6IEFycmF5PFRyYW5zbGF0aW9uc0V4dGVybmFsLlVwZ3JhZGVOb3RpZmljYXRpb24+ID0gR2V0TmVlZGVkRXh0ZXJuYWxUcmFuc2xhdGlvbnMoXG4gICAgcGxhdGZvcm1NYWpvclZlcnNpb24sXG4gICAgcGxhdGZvcm1NaW5vclZlcnNpb24sXG4gICAgdXBncmFkZU5vdGlmaWNhdGlvbnMsXG4gICk7XG5cbiAgLy8gUmV2ZXJzZSB0aGUgZG93bmdyYWRlIGNhbGxzLCBzbyB0aGF0IHdlIHN0YXJ0IHRoZSBkb3duZ3JhZGUgZnJvbSB0aGUgZXh0ZXJuYWwgdmVyc2lvbiB0byB0aGUgcGxhdGZvcm0gdmVyc2lvblxuICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZS5yZXZlcnNlKCk7XG4gIHJldHVybiBuZXcgRXh0ZXJuYWxTdGFja2luZ1ZlcnNpb25Db252ZXJ0ZXIoXG4gICAgZXh0ZXJuYWxWZXJzaW9uLFxuICAgIHBsYXRmb3JtVmVyc2lvbixcbiAgICBuZWVkZWRFeGVjdXRlQ2FsbERvd25ncmFkZSxcbiAgICBuZWVkZWRFeGVjdXRlUmV0dXJuVXBncmFkZXMsXG4gICAgbmVlZGVkTm90aWZpY2F0aW9uVXBncmFkZXMsXG4gICk7XG59XG5cbmZ1bmN0aW9uIEdldE5lZWRlZEV4dGVybmFsVHJhbnNsYXRpb25zPFQ+KFxuICBwbGF0Zm9ybU1ham9yVmVyc2lvbjogbnVtYmVyLFxuICBwbGF0Zm9ybU1pbm9yVmVyc2lvbjogbnVtYmVyLFxuICBtYWpvck1pbm9yVHJhbnNsYXRvcnM6IE1ham9yTWlub3JUcmFuc2xhdG9yczxUPixcbik6IEFycmF5PFQ+IHtcbiAgY29uc3QgbmVlZGVkVHJhbnNsYXRpb25zOiBBcnJheTxUPiA9IFtdO1xuXG4gIGlmIChwbGF0Zm9ybU1ham9yVmVyc2lvbiBpbiBtYWpvck1pbm9yVHJhbnNsYXRvcnMpIHtcbiAgICBjb25zdCBzdGFydCA9IHBsYXRmb3JtTWlub3JWZXJzaW9uO1xuICAgIGNvbnN0IG1heGltdW1NaW5vclZlcnNpb24gPSBHZXRNYXhpbXVtTWlub3JJbmRleChPYmplY3Qua2V5cyhtYWpvck1pbm9yVHJhbnNsYXRvcnNbcGxhdGZvcm1NYWpvclZlcnNpb25dKSk7XG4gICAgZm9yIChsZXQgbWlub3IgPSBzdGFydDsgbWlub3IgPD0gbWF4aW11bU1pbm9yVmVyc2lvbjsgbWlub3IrKykge1xuICAgICAgaWYgKG1pbm9yIGluIG1ham9yTWlub3JUcmFuc2xhdG9yc1twbGF0Zm9ybU1ham9yVmVyc2lvbl0pIHtcbiAgICAgICAgbmVlZGVkVHJhbnNsYXRpb25zLnB1c2goLi4ubWFqb3JNaW5vclRyYW5zbGF0b3JzW3BsYXRmb3JtTWFqb3JWZXJzaW9uXVttaW5vcl0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZWVkZWRUcmFuc2xhdGlvbnM7XG59XG4iLCIvLyBFeHBvcnQgZXZlcnl0aGluZyB3aGljaCBoYWQgYmVlbiBwcmV2aW91c2x5IGluIHRoZSBhcGktc2hhcmVkIG1vZHVsZVxuXG5leHBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnLi9BcGlTaGFyZWQvQXBpVmVyc2lvbic7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVCb290c3RyYXAnO1xuZXhwb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0FwaVNoYXJlZC9Dcm9zc0ZyYW1lL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcbmV4cG9ydCB7IERhdGFTb3VyY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9EYXRhU291cmNlJztcbmV4cG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4vQXBpU2hhcmVkL0VudW1NYXBwaW5ncy9FeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MnO1xuZXhwb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi9BcGlTaGFyZWQvRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5leHBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJy4vQXBpU2hhcmVkL0V2ZW50TGlzdGVuZXJNYW5hZ2VyJztcbmV4cG9ydCB7IEZpZWxkIH0gZnJvbSAnLi9BcGlTaGFyZWQvRmllbGQnO1xuZXhwb3J0IHsgQ3VzdG9tVmlld0ltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0N1c3RvbVZpZXdJbXBsJztcbmV4cG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL0Rhc2hib2FyZEltcGwnO1xuZXhwb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5leHBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvRGF0YVNvdXJjZUltcGwnO1xuZXhwb3J0IHsgUGFyYW1ldGVySW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvUGFyYW1ldGVySW1wbCc7XG5leHBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NoZWV0SW1wbCc7XG5leHBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TaGVldEluZm9JbXBsJztcbmV4cG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlckltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1NpbmdsZUV2ZW50TWFuYWdlckltcGwnO1xuZXhwb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9BcGlTaGFyZWQvSW1wbC9TdG9yeUltcGwnO1xuZXhwb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1N0b3J5UG9pbnRJbXBsJztcbmV4cG9ydCB7IFN0b3J5UG9pbnRJbmZvSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvU3RvcnlQb2ludEluZm9JbXBsJztcbmV4cG9ydCB7IFdvcmtib29rSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL0ltcGwvV29ya2Jvb2tJbXBsJztcbmV4cG9ydCB7IFdvcmtzaGVldEltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9JbXBsL1dvcmtzaGVldEltcGwnO1xuZXhwb3J0IHsgUG9pbnQgfSBmcm9tICcuL0FwaVNoYXJlZC9Qb2ludCc7XG5leHBvcnQgeyBBbm5vdGF0aW9uU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0Fubm90YXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuZXhwb3J0IHsgRXhwb3J0U2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0V4cG9ydFNlcnZpY2UnO1xuZXhwb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuZXhwb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlLCBVbnJlZ2lzdGVyRm4gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9Ob3RpZmljYXRpb25TZXJ2aWNlJztcbmV4cG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUGFyYW1ldGVyc1NlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvUmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyc7XG5leHBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU2VsZWN0aW9uU2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuZXhwb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9TaXplU2VydmljZSc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvU3RvcnlBY3RpdmF0aW9uU2VydmljZSc7XG5leHBvcnQgeyBWaXpTZXJ2aWNlIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2VydmljZXMvVml6U2VydmljZSc7XG5leHBvcnQgeyBDbGllbnRJbmZvU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL0NsaWVudEluZm9TZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBOb3RpZmljYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvTm90aWZpY2F0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlLCBSZWdpc3RyYXRpb24gfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NlcnZpY2VJbXBsQmFzZSc7XG5leHBvcnQgeyBTaXplU2VydmljZUltcGwgfSBmcm9tICcuL0FwaVNoYXJlZC9TZXJ2aWNlcy9pbXBsL1NpemVTZXJ2aWNlSW1wbCc7XG5leHBvcnQgeyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vQXBpU2hhcmVkL1NlcnZpY2VzL2ltcGwvU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwnO1xuZXhwb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi9BcGlTaGFyZWQvU2luZ2xlRXZlbnRNYW5hZ2VyJztcbmV4cG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vQXBpU2hhcmVkL1RhYmxlYXVFcnJvcic7XG5leHBvcnQgeyBEZWZlcnJlZCB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0RlZmVycmVkJztcbmV4cG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4vQXBpU2hhcmVkL1V0aWxzL0Vycm9ySGVscGVycyc7XG5leHBvcnQgeyBFeHBvcnRIZWxwZXJzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvRXhwb3J0SGVscGVycyc7XG5leHBvcnQgeyBTaGVldFV0aWxzIH0gZnJvbSAnLi9BcGlTaGFyZWQvVXRpbHMvU2hlZXRVdGlscyc7XG5leHBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9BcGlTaGFyZWQvVmVyc2lvbk51bWJlcic7XG5leHBvcnQgeyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICcuL1ZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlcic7XG4iLCJpbXBvcnQgeyBWZXJzaW9uTnVtYmVyIH0gZnJvbSAnLi9WZXJzaW9uTnVtYmVyJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXJDb250cmFjdCB9IGZyb20gJy4vVmVyc2lvbk51bWJlckNvbnRyYWN0JztcblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBzaW5nbGV0b24gd3JhcHBlciBvZiBWZXJzaW9uTnVtYmVyXG4gKi9cbmV4cG9ydCBjbGFzcyBBcGlWZXJzaW9uIHtcbiAgLy8gVXNpbmcgc29tZSB3ZWJwYWNrIHRyaWNrcywgd2UgY2FuIGluamVjdCB0aGlzIHZlcnNpb24gaW50byBvdXIgY29kZSAoa2luZGEgbGlrZSBjKysgcHJlcHJvY2Vzc29yIHN0dWZmKVxuICBwcml2YXRlIHN0YXRpYyBfaW5zdGFuY2U6IFZlcnNpb25OdW1iZXJDb250cmFjdDtcblxuICAvKipcbiAgICogR2V0cyB0aGUgc2luZ2xldG9uIGluc3RhbmNlIG9mIHRoZSB2ZXJzaW9uIG51bWJlci5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFZlcnNpb25OdW1iZXJDb250cmFjdCB7XG4gICAgcmV0dXJuIEFwaVZlcnNpb24uX2luc3RhbmNlO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBTZXRWZXJzaW9uTnVtYmVyKG51bVN0cmluZzogc3RyaW5nLCBpc0FscGhhOiBib29sZWFuKTogdm9pZCB7XG4gICAgQXBpVmVyc2lvbi5faW5zdGFuY2UgPSBuZXcgVmVyc2lvbk51bWJlcihudW1TdHJpbmcsIGlzQWxwaGEpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSBjb25uZWN0aW9uIHN1bW1hcnkuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzIGp1c3QgYSBwcm9wZXJ0eSBiYWcuXG4gKi9cbmV4cG9ydCBjbGFzcyBDb25uZWN0aW9uU3VtbWFyeSBpbXBsZW1lbnRzIENvbnRyYWN0LkNvbm5lY3Rpb25TdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX2Nvbm5lY3Rpb25JbmZvOiBDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5KSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2VydmVyVVJJKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3Rpb25JbmZvLnNlcnZlclVSSTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9jb25uZWN0aW9uSW5mby50eXBlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgQ3Jvc3NGcmFtZU1lc3NlbmdlcixcbiAgSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuICBNRVNTQUdJTkdfVkVSU0lPTiBhcyBBcGlNZXNzYWdpbmdWZXJzaW9uLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ3Jvc3NGcmFtZURpc3BhdGNoZXIgfSBmcm9tICcuL0Nyb3NzRnJhbWVEaXNwYXRjaGVyJztcblxuLy8gQ2hlY2tzIHRvIHNlZSBpZiB3ZSBhcmUgcnVubmluZyBpbiBhbiBpZnJhbWUgY3VycmVudGx5OiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMzI2MDc2Lzg4MjExNTNcbmZ1bmN0aW9uIGluSWZyYW1lKHRoaXNXaW5kb3c6IFdpbmRvdyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIHJldHVybiB0aGlzV2luZG93LnNlbGYgIT09IHRoaXNXaW5kb3cucGFyZW50O1xuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBBdHRlbXB0cyB0byBib290c3RyYXAgdGhlIGV4dGVuc2lvbiB3aXRoIGEgY3Jvc3MtZnJhbWUgcGFyZW50IHdoZXJlIFRhYmxlYXUgaXMgcnVubmluZ1xuICpcbiAqIEBwYXJhbSB0aGlzV2luZG93IFRoZSB3aW5kb3cgd2hpY2ggd2UgYXJlIHJ1bm5pbmcgaW4gKGluamVjdGVkIGZvciB1bml0IHRlc3RpbmcgcHVycG9zZXMpXG4gKiBAcGFyYW0gaW50ZXJuYWxDb250cmFjdFZlcnNpb24gVGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBpbnRlcm5hbCBjb250cmFjdCB3ZSBhcmUgdXNpbmdcbiAqIEByZXR1cm5zIEEgcHJvbWlzZSB3aGljaCBpcyBkb2luZyB0aGUgYWN0dWFsIGJvb3RzdHJhcHBpbmdcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRvQ3Jvc3NGcmFtZUJvb3RzdHJhcChcbiAgdGhpc1dpbmRvdzogV2luZG93LFxuICBpbnRlcm5hbENvbnRyYWN0VmVyc2lvbjogQ29udHJhY3QuVmVyc2lvbk51bWJlcixcbiAgb3B0aW9uczogSW5pdGlhbGl6YXRpb25PcHRpb25zLFxuKTogUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZTxDb250cmFjdC5JbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgbGV0IHBhcmVudDogV2luZG93O1xuXG4gICAgLy8gTm9ybWFsbHksIHdlIGFyZSBydW5uaW5nIGluc2lkZSBhbiBpZnJhbWUuICBUaGUgZXhjZXB0aW9uIHRvIHRoaXMgaXNcbiAgICAvLyB3aGVuIHdlIGFyZSBydW5uaW5nIGFzIGFuIGV4dGVuc2lvbiBpbnNpZGUgYSBkaWFsb2cgYXMgcGFydCBvZiB0aGUgVUlOYW1lc3BhY2VcbiAgICAvLyBmdW5jdGlvbmFsaXR5LiAgSW4gdGhhdCBjYXNlLCB3ZSB3YW50IHRoZSBvcGVuZXIgb2YgdGhpcyB3aW5kb3cgcmF0aGVyIHRoYW4gdGhlIHBhcmVudC5cbiAgICBpZiAoIWluSWZyYW1lKHRoaXNXaW5kb3cpKSB7XG4gICAgICBwYXJlbnQgPSB0aGlzV2luZG93Lm9wZW5lcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcGFyZW50ID0gdGhpc1dpbmRvdy5wYXJlbnQ7XG4gICAgfVxuXG4gICAgaWYgKCFwYXJlbnQpIHtcbiAgICAgIHJlamVjdCgnVGhpcyBleHRlbnNpb24gaXMgbm90IHJ1bm5pbmcgaW5zaWRlIGFuIGlmcmFtZSwgZGVza3RvcCwgb3IgcG9wdXAgd2luZG93LiBJbml0aWFsaXphdGlvbiBmYWlsZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIHRoZSBtZXNzZW5nZXIgd2hpY2ggd2lsbCBkbyBoZSBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhpcyB3aW5kb3cgYW5kIG91ciBwYXJlbnRcbiAgICAvLyBTaW5jZSB3ZSBkb24ndCBrbm93IHdoZXJlIHdlIGFyZSBydW5uaW5nIHlldCwgd2UgaGF2ZSB0byBtYWtlIHRoaXMgaW5pdGlhbCBvcmlnaW4gJyonLiBPbmNlXG4gICAgLy8gd2UgaGF2ZSBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWQgb3VyIGV4dGVuc2lvbiwgd2Ugd2lsbCBsaW1pdCB3aGVyZSB3ZSBzZW5kIG1lc3NhZ2VzXG4gICAgY29uc3QgbWVzc2VuZ2VyID0gbmV3IENyb3NzRnJhbWVNZXNzZW5nZXIodGhpc1dpbmRvdywgcGFyZW50LCAnKicpO1xuXG4gICAgLy8gUHJlcGFyZSB0byBzZW5kIGFuIGluaXRpYWxpemF0aW9uIG1lc3NhZ2UgdG8gdGhlIHBhcmVudCBmcmFtZVxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uTWVzc2FnZSA9IG1lc3Nlbmdlci5wcmVwYXJlSW5pdGlhbGl6YXRpb25NZXNzYWdlKGludGVybmFsQ29udHJhY3RWZXJzaW9uLCBBcGlNZXNzYWdpbmdWZXJzaW9uLCBvcHRpb25zKTtcblxuICAgIC8vIFdoZW4gd2UgcmVjZWl2ZSBhIHJlc3BvbnNlIGJhY2sgZnJvbSB0aGUgcGFyZW50LCB3ZSBjaGVjayB0byBtYWtlIHN1cmUgdGhlIGd1aWRzIG1hdGNoIGFuZCB0aGVuIHdlIGtub3dcbiAgICAvLyB0aGF0IHRoZSBwYXJlbnQgaXMgYXdhcmUgb2YgdXMgYW5kIHdlIGNhbiBzdGFydCBjb21tdW5pY2F0aW5nXG4gICAgbWVzc2VuZ2VyLnNldENvbW1hbmRSZXNwb25zZU1lc3NhZ2VIYW5kbGVyKGZ1bmN0aW9uIChtc2c6IENvbW1hbmRSZXNwb25zZU1lc3NhZ2UpOiB2b2lkIHtcbiAgICAgIC8vIFZlcmlmeSB3ZSBhcmUgZ2V0dGluZyBhIHJlc3BvbnNlIGZyb20gb3VyIGluaXRpYWxpemUgbWVzc2FnZVxuICAgICAgaWYgKG1zZy5jb21tYW5kR3VpZCA9PT0gaW5pdGlhbGl6YXRpb25NZXNzYWdlLm1lc3NhZ2VHdWlkKSB7XG4gICAgICAgIC8vIFRoZSB2ZXJzaW9uaW5nIG9mIHRoZSBkaXNwYXRjaGVyIGhhcHBlbnMgb24gdGhlIG90aGVyIHNpZGUgb2Ygb3VyIGZyYW1lLCBhbmRcbiAgICAgICAgLy8gaW4gYSB3cmFwcGVyIG9uIHRoaXMgc2lkZS4gVGhpcyBvbmUgZG9lc24ndCBoYXZlIGFueSB2ZXJzaW9uIGtub3dsZWRnZS5cbiAgICAgICAgY29uc3QgZGlzcGF0Y2hlckZhY3RvcnkgPSAoKSA9PiBuZXcgQ3Jvc3NGcmFtZURpc3BhdGNoZXIobWVzc2VuZ2VyKTtcbiAgICAgICAgcmVzb2x2ZShkaXNwYXRjaGVyRmFjdG9yeSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBOb3cgdGhhdCBvdXIgaGFuZGxlcnMgYXJlIHJlYWR5LCBzdGFydCBsaXN0ZW5pbmcgYW5kIHNlbmQgb3VyIGluaXRpYWxpemF0aW9uIG1lc3NhZ2VcbiAgICBtZXNzZW5nZXIuc3RhcnRMaXN0ZW5pbmcoKTtcbiAgICBpbml0aWFsaXphdGlvbk1lc3NhZ2Uuc2VuZCgpO1xuICB9KTtcbn1cbiIsImltcG9ydCB7IEVtYmVkZGluZ0Vycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSxcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4ZWN1dGVSZXNwb25zZSxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBNZXNzZW5nZXIsXG4gIE1vZGVsLFxuICBOb3RpZmljYXRpb25IYW5kbGVyLFxuICBOb3RpZmljYXRpb25NZXNzYWdlLFxuICBWZXJiSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIFRoaXMgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIEludGVybmFsQXBpRGlzcGF0Y2hlciBpbnRlcmZhY2Ugd2hpY2ggZnVuY3Rpb25zIGJ5IHBhc3NpbmcgbWVzc2FnZXNcbiAqIGFjcm9zcyBhIGZyYW1lIGJvdW5kYXJ5LiBUaGlzIGlzIHVzdWFsbHkgYmV0d2VlbiB0aGUgY29kZSB3aGVyZSBvdXIgamF2c2NyaXB0IGxpYnJhcnkgaGFzIGJlZW4gaW5jbHVkZWRcbiAqIGJ5IGEgM3JkIHBhcnR5IGRldiBhbmQgYW5vdGhlciBmcmFtZSB3aGVyZSBUYWJsZWF1IHNlcnZlciBoYXMgY29udGVudC5cbiAqL1xuZXhwb3J0IGNsYXNzIENyb3NzRnJhbWVEaXNwYXRjaGVyIGltcGxlbWVudHMgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIHtcbiAgLy8gQ29sbGVjdGlvbiBvZiBwZW5kaW5nIHByb21pc2VzIHdoaWNoIGFyZSB3YWl0aW5nIHRvIGJlIHJlc29sdmVkLiBXaGVuIHdlIHJlY2VpdmUgYSByZXNwb25zZSBiYWNrIGZyb20gdGhlIG90aGVyIGZyYW1lLFxuICAvLyB0aGVzZSBwcm9taXNlcyBjYW4gYmUgZWl0aGVyIHJlc29sdmVkIG9yIHJlamVjdGVkXG4gIHByaXZhdGUgX3BlbmRpbmdQcm9taXNlczogeyBbbWVzc2FnZUd1aWQ6IHN0cmluZ106IHsgcmVzb2x2ZTogKHJlc3BvbnNlOiBFeGVjdXRlUmVzcG9uc2UpID0+IHZvaWQ7IHJlamVjdDogKGVycm9yOiBNb2RlbCkgPT4gdm9pZCB9IH0gPVxuICAgIHt9O1xuXG4gIC8vIFRoZSBjb2xsZWN0aW9uIG9mIG5vdGlmaWNhdGlvbiBoYW5kbGVycyB3aGljaCBoYXZlIGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoaXMgZGlzcGF0Y2hlclxuICBwcml2YXRlIF9ub3RpZmljYXRpb25IYW5kbGVyczogQXJyYXk8Tm90aWZpY2F0aW9uSGFuZGxlcj4gPSBbXTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBDcm9zc0ZyYW1lRGlzcGF0Y2hlciB3aGljaCB3aWxsIHVzZSB0aGUgZ2l2ZW4gbWVzc2VuZ2VyIHRvIGNvbW11bmljYXRlXG4gICAqIEBwYXJhbSBfbWVzc2VuZ2VyIGFuIGluc3RhbnRpYXRlZCBhbmQgbGlzdGVuaW5nIG1lc3NlbmdlciBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9tZXNzZW5nZXI6IE1lc3Nlbmdlcikge1xuICAgIGlmICghdGhpcy5fbWVzc2VuZ2VyKSB7XG4gICAgICB0aHJvdyAnTWlzc2luZyBtZXNzZW5nZXIgb2JqZWN0JztcbiAgICB9XG5cbiAgICAvLyBTZXQgdXAgb3VyIG1lc3NhZ2UgaGFuZGxlcnMuIFdlIG9ubHkgY2FyZSBhYm91dCBpbmNvbWluZyBub3RpZmljYXRpb25zIGFuZCBjb21tYW5kIHJlc3BvbnNlc1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXRDb21tYW5kUmVzcG9uc2VNZXNzYWdlSGFuZGxlcih0aGlzLm9uQ29tbWFuZFJlc3BvbnNlLmJpbmQodGhpcykpO1xuICAgIHRoaXMuX21lc3Nlbmdlci5zZXROb3RpZmljYXRpb25NZXNzYWdlSGFuZGxlcih0aGlzLm9uTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgLy8vLy8vIFN0YXJ0IEludGVybmFsQXBpRGlzcGF0Y2hlciBpbXBsZW1lbnRhdGlvblxuXG4gIHB1YmxpYyBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIC8vIFRvIGV4ZWN1dGUgYSB2ZXJiLCB3ZSBmaXJzdCBwcmVwYXJlIGEgY29tbWFuZCBtZXNzYWdlIGFuZCB0aGVuIGRlZmluZSBhIHByb21pc2UuXG4gICAgY29uc3QgcHJlcGFyZWRNZXNzYWdlID0gdGhpcy5fbWVzc2VuZ2VyLnByZXBhcmVDb21tYW5kTWVzc2FnZSh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAvLyBTYXZlIG9mZiB0aGUgcGVuZGluZyBwcm9taXNlIGJ5IHRoZSBtZXNzYWdlR3VpZCB3ZSBhcmUgYWJvdXQgdG8gc2VuZC4gV2hlbiBhIHJlc3BvbnNlIGlzXG4gICAgICAvLyByZWNlaXZlZCwgd2UnbGwgYmUgYWJsZSB0byByZXNvbHZlIHRoaXMgcHJvbWlzZSB3aXRoIHRoZSByZXN1bHRcbiAgICAgIHRoaXMuX3BlbmRpbmdQcm9taXNlc1twcmVwYXJlZE1lc3NhZ2UubWVzc2FnZUd1aWRdID0geyByZXNvbHZlOiByZXNvbHZlLCByZWplY3Q6IHJlamVjdCB9O1xuICAgIH0pO1xuXG4gICAgLy8gQWN0dWFsbHkgc2VuZCB0aGUgbWVzc2FnZSBhbmQgcmV0dXJuIHRoZSBwcm9taXNlXG4gICAgcHJlcGFyZWRNZXNzYWdlLnNlbmQoKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLnB1c2goaGFuZGxlcik7XG4gIH1cblxuICBwdWJsaWMgdW5yZWdpc3Rlck5vdGlmaWNhdGlvbkhhbmRsZXIoaGFuZGxlcjogTm90aWZpY2F0aW9uSGFuZGxlcik6IHZvaWQge1xuICAgIHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzID0gdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZmlsdGVyKChoKSA9PiBoICE9PSBoYW5kbGVyKTtcbiAgfVxuXG4gIC8vLy8vLyBFbmQgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIGltcGxlbWVudGF0aW9uXG5cbiAgcHJpdmF0ZSBvbkNvbW1hbmRSZXNwb25zZShyZXNwb25zZTogQ29tbWFuZFJlc3BvbnNlTWVzc2FnZSk6IHZvaWQge1xuICAgIC8vIFdlIGdvdCBhIGNvbW1hbmQgcmVzcG9uc2UsIGxvb2sgdGhyb3VnaCB0aGUgcGVuZGluZyBwcm9taXNlcyBhbmQgcmVzb2x2ZVxuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLl9wZW5kaW5nUHJvbWlzZXMpLmluZGV4T2YocmVzcG9uc2UuY29tbWFuZEd1aWQpIDwgMCkge1xuICAgICAgcmV0dXJuOyAvLyBXZSBkb24ndCBoYXZlIGFueSByZWZlcmVuY2UgdG8gdGhpcyBjb21tYW5kLCBqdXN0IHJldHVyblxuICAgIH1cblxuICAgIGNvbnN0IHBlbmRpbmdQcm9taXNlID0gdGhpcy5fcGVuZGluZ1Byb21pc2VzW3Jlc3BvbnNlLmNvbW1hbmRHdWlkXTtcblxuICAgIC8vIElmIHdlIGhhdmUgYW4gZXJyb3IgZGVmaW5lZCwgcmVqZWN0IHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmVycm9yKSB7XG4gICAgICBwZW5kaW5nUHJvbWlzZS5yZWplY3QocmVzcG9uc2UuZXJyb3IpO1xuICAgIH1cblxuICAgIC8vIElmIHdlIGhhdmUgZGF0YSBkZWZpbmVkLCByZXNvbHZlIHRoZSBwcm9taXNlXG4gICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgIHBlbmRpbmdQcm9taXNlLnJlc29sdmUoeyByZXN1bHQ6IHJlc3BvbnNlLmRhdGEgfSk7XG4gICAgfVxuXG4gICAgLy8gQ2xlYW4gdXAgb3VyIHBlbmRpbmcgcHJvbWlzZXMgb2JqZWN0XG4gICAgZGVsZXRlIHRoaXMuX3BlbmRpbmdQcm9taXNlc1tyZXNwb25zZS5jb21tYW5kR3VpZF07XG4gIH1cblxuICBwcml2YXRlIG9uTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2U6IE5vdGlmaWNhdGlvbk1lc3NhZ2UpOiB2b2lkIHtcbiAgICAvLyBHbyB0aHJvdWdoIGVhY2ggbm90aWZpY2F0aW9uIGhhbmRsZXIgd2UgaGF2ZSByZWdpc3RlcmVkIGFuZCBsZXQgdGhlbSBrbm93IGEgbm90aWZpY2F0aW9uIGNhbWUgaW5cbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGhhbmRsZXIoeyBub3RpZmljYXRpb25JZDogbm90aWZpY2F0aW9uTWVzc2FnZS5ub3RpZmljYXRpb25JZCwgZGF0YTogbm90aWZpY2F0aW9uTWVzc2FnZS5kYXRhIH0pO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBJbmNhc2Ugb2YgYSBJbmNvbXBhdGlibGVWZXJzaW9uRXJyb3IsIHJlLXRocm93IHRoZSBlcnJvci5cbiAgICAgICAgaWYgKChlIGFzIFRhYmxlYXVFcnJvcikuZXJyb3JDb2RlID09PSBFbWJlZGRpbmdFcnJvckNvZGVzLkluY29tcGF0aWJsZVZlcnNpb25FcnJvcikge1xuICAgICAgICAgIHRocm93IGU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gRWxzZSBJZ25vcmUgIHNvIGlmIG9uZSBoYW5kbGVyIGVycm9ycywgdGhlIG90aGVyIHN0aWxsIGdldCB0aGUgbWVzc2FnZS5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhU291cmNlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXRhU291cmNlSW1wbDogRGF0YVNvdXJjZUltcGwpIHt9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZHMoKTogQXJyYXk8Q29udHJhY3QuRmllbGQ+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZmllbGRzO1xuICB9XG5cbiAgcHVibGljIGdldCBleHRyYWN0VXBkYXRlVGltZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5leHRyYWN0VXBkYXRlVGltZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeHRyYWN0KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc0V4dHJhY3Q7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzUHVibGlzaGVkKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5pc1B1Ymxpc2hlZDtcbiAgfVxuXG4gIHB1YmxpYyBwdWJsaXNoZWRVcmwoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwucHVibGlzaGVkVXJsKCk7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5yZWZyZXNoQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zb2xlLndhcm4oJ0RhdGFTb3VyY2UuZ2V0QWN0aXZlVGFibGVzQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBEYXRhU291cmNlLmdldExvZ2ljYWxUYWJsZXNBc3luYy4nKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0QWN0aXZlVGFibGVzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeT4+IHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgJ0RhdGFTb3VyY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyBpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlICcgK1xuICAgICAgICAnRGF0YVNvdXJjZS5nZXRMb2dpY2FsVGFibGVzQXN5bmMgYW5kIERhdGFTb3VyY2UuZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jLicsXG4gICAgKTtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUltcGwuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRMb2dpY2FsVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZDogc3RyaW5nLCBvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbXBsLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhsb2dpY2FsVGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW1wbC5nZXRMb2dpY2FsVGFibGVEYXRhUmVhZGVyQXN5bmMobG9naWNhbFRhYmxlSWQsIHBhZ2VSb3dDb3VudCwgb3B0aW9ucyk7XG4gIH1cbn1cbiIsImltcG9ydCB7XG4gIERhdGVSYW5nZVR5cGUgYXMgRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLFxuICBEaWFsb2dTdHlsZSBhcyBFeHRlcm5hbERpYWxvZ1N0eWxlLFxuICBGaWx0ZXJEb21haW5UeXBlIGFzIEV4dGVybmFsRG9tYWluVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSBhcyBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsXG4gIEZpbHRlck51bGxPcHRpb24gYXMgRXh0ZXJuYWxOdWxsT3B0aW9uLFxuICBTaGVldFR5cGUgYXMgRXh0ZXJuYWxTaGVldFR5cGUsXG4gIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICBQZXJpb2RUeXBlLFxuICBSZXBsYXlTcGVlZFR5cGUsXG4gIFpvbmVWaXNpYmlsaXR5VHlwZSxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNob3dEYXRhVGFibGVGb3JtYXQsXG4gIERhdGVTdGVwUGVyaW9kLFxuICBEYXRlUmFuZ2VUeXBlIGFzIEludGVybmFsRGF0ZVJhbmdlVHlwZSxcbiAgRGlhbG9nU3R5bGUgYXMgSW50ZXJuYWxEaWFsb2dTdHlsZSxcbiAgRmlsdGVyRG9tYWluVHlwZSBhcyBJbnRlcm5hbERvbWFpblR5cGUsXG4gIEZpbHRlclVwZGF0ZVR5cGUgYXMgSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLFxuICBGaWx0ZXJOdWxsT3B0aW9uIGFzIEludGVybmFsTnVsbE9wdGlvbixcbiAgU2hlZXRUeXBlIGFzIEludGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRW51bUNvbnZlcnRlciB9IGZyb20gJy4uL1V0aWxzL0VudW1Db252ZXJ0ZXInO1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZTp0eXBlZGVmIC0gRGlzYWJsZSB0aGlzIHRvIG1ha2UgZGVjbGFyaW5nIHRoZXNlIGNsYXNzZXMgYSBiaXQgZWFzaWVyICovXG4vKipcbiAqIE1hcHMgZW51bXMgdXNlZCBieSB0aGUgZXh0ZXJuYWwtYXBpLWNvbnRyYWN0IHRvIHRoZSBlbnVtcyB1c2VkXG4gKiBpbiB0aGUgaW50ZXJuYWwtYXBpLWNvbnRyYWN0LCB3aGljaCBkZXZlbG9wZXJzIGNvZGUgYWdhaW5zdC5cbiAqL1xuZXhwb3J0IGNsYXNzIEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyB7XG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyRG9tYWluVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRG9tYWluVHlwZSwgSW50ZXJuYWxEb21haW5UeXBlPih7XG4gICAgW0V4dGVybmFsRG9tYWluVHlwZS5SZWxldmFudF06IEludGVybmFsRG9tYWluVHlwZS5SZWxldmFudCxcbiAgICBbRXh0ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlXTogSW50ZXJuYWxEb21haW5UeXBlLkRhdGFiYXNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIG51bGxPcHRpb25zID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxOdWxsT3B0aW9uLCBJbnRlcm5hbE51bGxPcHRpb24+KHtcbiAgICBbRXh0ZXJuYWxOdWxsT3B0aW9uLkFsbFZhbHVlc106IEludGVybmFsTnVsbE9wdGlvbi5BbGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk5vbk51bGxWYWx1ZXMsXG4gICAgW0V4dGVybmFsTnVsbE9wdGlvbi5OdWxsVmFsdWVzXTogSW50ZXJuYWxOdWxsT3B0aW9uLk51bGxWYWx1ZXMsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZmlsdGVyVXBkYXRlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSwgSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlPih7XG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BZGRdOiBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkLFxuICAgIFtFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWxsXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbCxcbiAgICBbRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlbW92ZV06IEludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmUsXG4gICAgW0V4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlXTogSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLlJlcGxhY2UsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2V0VmlzaWJpbGl0eVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxab25lVmlzaWJpbGl0eVR5cGUsIGJvb2xlYW4+KHtcbiAgICBbWm9uZVZpc2liaWxpdHlUeXBlLlNob3ddOiB0cnVlLFxuICAgIFtab25lVmlzaWJpbGl0eVR5cGUuSGlkZV06IGZhbHNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNldFJlcGxheVNwZWVkVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFJlcGxheVNwZWVkVHlwZSwgbnVtYmVyPih7XG4gICAgLy8gdGhlc2UgbnVtYmVycyBhcmUgZHVyYXRpb24gbXVsdGlwbGllcnNcbiAgICAvLyAyLjAsIGZvciBleGFtcGxlLCBkb3VibGVzIHRoZSBkdXJhdGlvbiBvZiB0aGUgcmVwbGF5LCBzbG93aW5nIGl0IGRvd24gdG8gMC41eCBzcGVlZFxuICAgIFtSZXBsYXlTcGVlZFR5cGUuU2xvd106IDIuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLk5vcm1hbF06IDEuMCxcbiAgICBbUmVwbGF5U3BlZWRUeXBlLkZhc3RdOiAwLjUsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgc2hlZXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8RXh0ZXJuYWxTaGVldFR5cGUsIEludGVybmFsU2hlZXRUeXBlPih7XG4gICAgW0V4dGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZF06IEludGVybmFsU2hlZXRUeXBlLkRhc2hib2FyZCxcbiAgICBbRXh0ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0XTogSW50ZXJuYWxTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgIFtFeHRlcm5hbFNoZWV0VHlwZS5TdG9yeV06IEludGVybmFsU2hlZXRUeXBlLlN0b3J5LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIHNob3dEYXRhVGFibGVGb3JtYXRUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sIEFwaVNob3dEYXRhVGFibGVGb3JtYXQ+KHtcbiAgICBbSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzXTogQXBpU2hvd0RhdGFUYWJsZUZvcm1hdC5OYXRpdmVBbmRGb3JtYXR0ZWRWYWx1ZXMsXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlOYXRpdmVWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0Lk5hdGl2ZVZhbHVlc09ubHksXG4gICAgW0luY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLk9ubHlGb3JtYXR0ZWRWYWx1ZXNdOiBBcGlTaG93RGF0YVRhYmxlRm9ybWF0LkZvcm1hdHRlZFZhbHVlc09ubHksXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgcGVyaW9kVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPFBlcmlvZFR5cGUsIERhdGVTdGVwUGVyaW9kPih7XG4gICAgW1BlcmlvZFR5cGUuWWVhcnNdOiBEYXRlU3RlcFBlcmlvZC5ZZWFycyxcbiAgICBbUGVyaW9kVHlwZS5RdWFydGVyc106IERhdGVTdGVwUGVyaW9kLlF1YXJ0ZXJzLFxuICAgIFtQZXJpb2RUeXBlLk1vbnRoc106IERhdGVTdGVwUGVyaW9kLk1vbnRocyxcbiAgICBbUGVyaW9kVHlwZS5XZWVrc106IERhdGVTdGVwUGVyaW9kLldlZWtzLFxuICAgIFtQZXJpb2RUeXBlLkRheXNdOiBEYXRlU3RlcFBlcmlvZC5EYXlzLFxuICAgIFtQZXJpb2RUeXBlLkhvdXJzXTogRGF0ZVN0ZXBQZXJpb2QuSG91cnMsXG4gICAgW1BlcmlvZFR5cGUuTWludXRlc106IERhdGVTdGVwUGVyaW9kLk1pbnV0ZXMsXG4gICAgW1BlcmlvZFR5cGUuU2Vjb25kc106IERhdGVTdGVwUGVyaW9kLlNlY29uZHMsXG4gICAgW1BlcmlvZFR5cGUuSXNvWWVhcnNdOiBEYXRlU3RlcFBlcmlvZC5Jc29ZZWFycyxcbiAgICBbUGVyaW9kVHlwZS5Jc29RdWFydGVyc106IERhdGVTdGVwUGVyaW9kLklzb1F1YXJ0ZXJzLFxuICAgIFtQZXJpb2RUeXBlLklzb1dlZWtzXTogRGF0ZVN0ZXBQZXJpb2QuSXNvV2Vla3MsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0ZVJhbmdlVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEV4dGVybmFsRGF0ZVJhbmdlVHlwZSwgSW50ZXJuYWxEYXRlUmFuZ2VUeXBlPih7XG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0XTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3QsXG4gICAgW0V4dGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0Tl06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5MYXN0TixcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHRdOiBJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dCxcbiAgICBbRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLk5leHROLFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudF06IEludGVybmFsRGF0ZVJhbmdlVHlwZS5DdXJyZW50LFxuICAgIFtFeHRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlXTogSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLlRvRGF0ZSxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkaWFsb2dTdHlsZXMgPSBuZXcgRW51bUNvbnZlcnRlcjxFeHRlcm5hbERpYWxvZ1N0eWxlLCBJbnRlcm5hbERpYWxvZ1N0eWxlPih7XG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuV2luZG93XTogSW50ZXJuYWxEaWFsb2dTdHlsZS5XaW5kb3csXG4gICAgW0V4dGVybmFsRGlhbG9nU3R5bGUuTW9kYWxdOiBJbnRlcm5hbERpYWxvZ1N0eWxlLk1vZGFsLFxuICAgIFtFeHRlcm5hbERpYWxvZ1N0eWxlLk1vZGVsZXNzXTogSW50ZXJuYWxEaWFsb2dTdHlsZS5Nb2RlbGVzcyxcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCB7XG4gIEFubm90YXRpb25UeXBlIGFzIEV4dGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBFeHRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBFeHRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhRm9ybWF0VHlwZSBhcyBFeHRlcm5hbERhdGFGb3JtYXRUeXBlLFxuICBEYXRhVHlwZSBhcyBFeHRlcm5hbERhdGFUeXBlLFxuICBQZXJpb2RUeXBlIGFzIEV4dGVybmFsRGF0ZVBlcmlvZCxcbiAgRGF0ZVJhbmdlVHlwZSBhcyBFeHRlcm5hbERhdGVSYW5nZVR5cGUsXG4gIEVycm9yQ29kZXMgYXMgRXh0ZXJuYWxFcnJvckNvZGVzLFxuICBFeHBvcnRlZE1lZGlhVHlwZSBhcyBFeHRlcm5hbEV4cG9ydGVkTWVkaWFUeXBlLFxuICBFeHRlbnNpb25Db250ZXh0IGFzIEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQsXG4gIEV4dGVuc2lvbk1vZGUgYXMgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZSxcbiAgRmllbGRBZ2dyZWdhdGlvblR5cGUgYXMgRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSBhcyBFeHRlcm5hbEZpZWxkUm9sZVR5cGUsXG4gIEZpbHRlclR5cGUgYXMgRXh0ZXJuYWxGaWx0ZXJUeXBlLFxuICBGaWx0ZXJVcGRhdGVUeXBlIGFzIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSBhcyBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gIE1hcmtUeXBlIGFzIEV4dGVybmFsTWFya1R5cGUsXG4gIE5lZ2F0aXZlTnVtYmVyRm9ybWF0IGFzIEV4dGVybmFsTmVnYXRpdmVOdW1iZXJGb3JtYXQsXG4gIE51bWJlckZvcm1hdFVuaXRzIGFzIEV4dGVybmFsTnVtYmVyRm9ybWF0VW5pdHMsXG4gIFBhcmFtZXRlclZhbHVlVHlwZSBhcyBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZSxcbiAgU2hlZXRUeXBlIGFzIEV4dGVybmFsU2hlZXRUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQW5ub3RhdGVFbnVtIGFzIEludGVybmFsQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSBhcyBJbnRlcm5hbENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSBhcyBJbnRlcm5hbENvbHVtblR5cGUsXG4gIERhc2hib2FyZE9iamVjdFR5cGUgYXMgSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXRhRm9ybWF0VHlwZSBhcyBJbnRlcm5hbERhdGFGb3JtYXRUeXBlLFxuICBEYXRhVHlwZSBhcyBJbnRlcm5hbERhdGFUeXBlLFxuICBEYXRlUmFuZ2VUeXBlIGFzIEludGVybmFsRGF0ZVJhbmdlVHlwZSxcbiAgRGF0ZVN0ZXBQZXJpb2QgYXMgSW50ZXJuYWxEYXRlU3RlcFBlcmlvZCxcbiAgRG9tYWluUmVzdHJpY3Rpb25UeXBlIGFzIEludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLFxuICBFcnJvckNvZGVzIGFzIEludGVybmFsRXJyb3JDb2RlcyxcbiAgRXhwb3J0ZWRNZWRpYVR5cGUgYXMgSW50ZXJuYWxFeHBvcnRlZE1lZGlhVHlwZSxcbiAgRXh0ZW5zaW9uQ29udGV4dCBhcyBJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LFxuICBFeHRlbnNpb25Nb2RlIGFzIEludGVybmFsRXh0ZW5zaW9uc01vZGUsXG4gIEZpZWxkQWdncmVnYXRpb25UeXBlIGFzIEludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUsXG4gIEZpZWxkUm9sZVR5cGUgYXMgSW50ZXJuYWxGaWVsZFJvbGVUeXBlLFxuICBGaWx0ZXJUeXBlIGFzIEludGVybmFsRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSBhcyBJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsXG4gIEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgYXMgSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLFxuICBNYXJrVHlwZSBhcyBJbnRlcm5hbE1hcmtUeXBlLFxuICBOZWdhdGl2ZU51bWJlckZvcm1hdCBhcyBJbnRlcm5hbE5lZ2F0aXZlTnVtYmVyRm9ybWF0LFxuICBOdW1iZXJGb3JtYXRVbml0cyBhcyBJbnRlcm5hbE51bWJlckZvcm1hdFVuaXRzLFxuICBTaGVldFR5cGUgYXMgSW50ZXJuYWxTaGVldFR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFbnVtQ29udmVydGVyIH0gZnJvbSAnLi4vVXRpbHMvRW51bUNvbnZlcnRlcic7XG5cbi8qIHRzbGludDpkaXNhYmxlOnR5cGVkZWYgLSBEaXNhYmxlIHRoaXMgdG8gbWFrZSBkZWNsYXJpbmcgdGhlc2UgY2xhc3NlcyBhIGJpdCBlYXNpZXIgKi9cbi8qKlxuICogTWFwcyBlbnVtcyB1c2VkIGJ5IHRoZSBpbnRlcm5hbC1hcGktY29udHJhY3QgdG8gdGhlIGVudW1zIHVzZWRcbiAqIGluIHRoZSBleHRlcm5hbC1hcGktY29udHJhY3QsIHdoaWNoIGRldmVsb3BlcnMgY29kZSBhZ2FpbnN0LlxuICovXG5leHBvcnQgY2xhc3MgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIHtcbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Db250ZXh0ID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dCwgRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dD4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3BdOiBFeHRlcm5hbEV4dGVuc2lvbnNDb250ZXh0LkRlc2t0b3AsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuU2VydmVyXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5TZXJ2ZXIsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljV2ViXTogRXh0ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5QdWJsaWNXZWIsXG4gICAgW0ludGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljRGVza3RvcF06IEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuUHVibGljRGVza3RvcCxcbiAgICBbSW50ZXJuYWxFeHRlbnNpb25zQ29udGV4dC5DbG91ZF06IEV4dGVybmFsRXh0ZW5zaW9uc0NvbnRleHQuQ2xvdWQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGF0YUZvcm1hdFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbERhdGFGb3JtYXRUeXBlLCBFeHRlcm5hbERhdGFGb3JtYXRUeXBlPih7XG4gICAgW0ludGVybmFsRGF0YUZvcm1hdFR5cGUuQXV0b0Zvcm1hdF06IEV4dGVybmFsRGF0YUZvcm1hdFR5cGUuQXV0b0Zvcm1hdCxcbiAgICBbSW50ZXJuYWxEYXRhRm9ybWF0VHlwZS5TeXN0ZW1OdW1iZXJdOiBFeHRlcm5hbERhdGFGb3JtYXRUeXBlLlN5c3RlbU51bWJlcixcbiAgICBbSW50ZXJuYWxEYXRhRm9ybWF0VHlwZS5TeXN0ZW1DdXJyZW5jeV06IEV4dGVybmFsRGF0YUZvcm1hdFR5cGUuU3lzdGVtQ3VycmVuY3ksXG4gICAgW0ludGVybmFsRGF0YUZvcm1hdFR5cGUuU3lzdGVtTG9uZ0RhdGVdOiBFeHRlcm5hbERhdGFGb3JtYXRUeXBlLlN5c3RlbUxvbmdEYXRlLFxuICAgIFtJbnRlcm5hbERhdGFGb3JtYXRUeXBlLlN5c3RlbVNob3J0RGF0ZV06IEV4dGVybmFsRGF0YUZvcm1hdFR5cGUuU3lzdGVtU2hvcnREYXRlLFxuICAgIFtJbnRlcm5hbERhdGFGb3JtYXRUeXBlLlN5c3RlbVRpbWVdOiBFeHRlcm5hbERhdGFGb3JtYXRUeXBlLlN5c3RlbVRpbWUsXG4gICAgW0ludGVybmFsRGF0YUZvcm1hdFR5cGUuQ3VzdG9tXTogRXh0ZXJuYWxEYXRhRm9ybWF0VHlwZS5DdXN0b20sXG4gICAgW0ludGVybmFsRGF0YUZvcm1hdFR5cGUuQ3VzdG9tTnVtYmVyXTogRXh0ZXJuYWxEYXRhRm9ybWF0VHlwZS5DdXN0b21OdW1iZXIsXG4gICAgW0ludGVybmFsRGF0YUZvcm1hdFR5cGUuQ3VzdG9tQ3VycmVuY3ldOiBFeHRlcm5hbERhdGFGb3JtYXRUeXBlLkN1c3RvbUN1cnJlbmN5LFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIG51bWJlckZvcm1hdFVuaXRzID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxOdW1iZXJGb3JtYXRVbml0cywgRXh0ZXJuYWxOdW1iZXJGb3JtYXRVbml0cz4oe1xuICAgIFtJbnRlcm5hbE51bWJlckZvcm1hdFVuaXRzLk5vbmVdOiBFeHRlcm5hbE51bWJlckZvcm1hdFVuaXRzLk5vbmUsXG4gICAgW0ludGVybmFsTnVtYmVyRm9ybWF0VW5pdHMuVGhvdXNhbmRzXTogRXh0ZXJuYWxOdW1iZXJGb3JtYXRVbml0cy5UaG91c2FuZHMsXG4gICAgW0ludGVybmFsTnVtYmVyRm9ybWF0VW5pdHMuTWlsbGlvbnNdOiBFeHRlcm5hbE51bWJlckZvcm1hdFVuaXRzLk1pbGxpb25zLFxuICAgIFtJbnRlcm5hbE51bWJlckZvcm1hdFVuaXRzLkJpbGxpb25zRW5nbGlzaF06IEV4dGVybmFsTnVtYmVyRm9ybWF0VW5pdHMuQmlsbGlvbnNFbmdsaXNoLFxuICAgIFtJbnRlcm5hbE51bWJlckZvcm1hdFVuaXRzLkJpbGxpb25zU3RhbmRhcmRdOiBFeHRlcm5hbE51bWJlckZvcm1hdFVuaXRzLkJpbGxpb25zU3RhbmRhcmQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgbmVnYXRpdmVOdW1iZXJGb3JtYXQgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbE5lZ2F0aXZlTnVtYmVyRm9ybWF0LCBFeHRlcm5hbE5lZ2F0aXZlTnVtYmVyRm9ybWF0Pih7XG4gICAgW0ludGVybmFsTmVnYXRpdmVOdW1iZXJGb3JtYXQuQXV0b21hdGljXTogRXh0ZXJuYWxOZWdhdGl2ZU51bWJlckZvcm1hdC5BdXRvbWF0aWMsXG4gICAgW0ludGVybmFsTmVnYXRpdmVOdW1iZXJGb3JtYXQuUGFyZW50aGVzZXNdOiBFeHRlcm5hbE5lZ2F0aXZlTnVtYmVyRm9ybWF0LlBhcmVudGhlc2VzLFxuICAgIFtJbnRlcm5hbE5lZ2F0aXZlTnVtYmVyRm9ybWF0Lk91dGVyUHJlZml4XTogRXh0ZXJuYWxOZWdhdGl2ZU51bWJlckZvcm1hdC5PdXRlclByZWZpeCxcbiAgICBbSW50ZXJuYWxOZWdhdGl2ZU51bWJlckZvcm1hdC5PdXRlclN1ZmZpeF06IEV4dGVybmFsTmVnYXRpdmVOdW1iZXJGb3JtYXQuT3V0ZXJTdWZmaXgsXG4gICAgW0ludGVybmFsTmVnYXRpdmVOdW1iZXJGb3JtYXQuSW5uZXJQcmVmaXhdOiBFeHRlcm5hbE5lZ2F0aXZlTnVtYmVyRm9ybWF0LklubmVyUHJlZml4LFxuICAgIFtJbnRlcm5hbE5lZ2F0aXZlTnVtYmVyRm9ybWF0LklubmVyU3VmZml4XTogRXh0ZXJuYWxOZWdhdGl2ZU51bWJlckZvcm1hdC5Jbm5lclN1ZmZpeCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBleHRlbnNpb25Nb2RlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxFeHRlbnNpb25zTW9kZSwgRXh0ZXJuYWxFeHRlbnNpb25zTW9kZT4oe1xuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNNb2RlLkF1dGhvcmluZ106IEV4dGVybmFsRXh0ZW5zaW9uc01vZGUuQXV0aG9yaW5nLFxuICAgIFtJbnRlcm5hbEV4dGVuc2lvbnNNb2RlLlZpZXdpbmddOiBFeHRlcm5hbEV4dGVuc2lvbnNNb2RlLlZpZXdpbmcsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZXhwb3J0ZWRNZWRpYVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEV4cG9ydGVkTWVkaWFUeXBlLCBFeHRlcm5hbEV4cG9ydGVkTWVkaWFUeXBlPih7XG4gICAgW0ludGVybmFsRXhwb3J0ZWRNZWRpYVR5cGUuSW1hZ2VdOiBFeHRlcm5hbEV4cG9ydGVkTWVkaWFUeXBlLkltYWdlLFxuICAgIFtJbnRlcm5hbEV4cG9ydGVkTWVkaWFUeXBlLlBkZl06IEV4dGVybmFsRXhwb3J0ZWRNZWRpYVR5cGUuUGRmLFxuICAgIFtJbnRlcm5hbEV4cG9ydGVkTWVkaWFUeXBlLlN2Z106IEV4dGVybmFsRXhwb3J0ZWRNZWRpYVR5cGUuU3ZnLFxuICAgIFtJbnRlcm5hbEV4cG9ydGVkTWVkaWFUeXBlLkh0bWxdOiBFeHRlcm5hbEV4cG9ydGVkTWVkaWFUeXBlLkh0bWwsXG4gICAgW0ludGVybmFsRXhwb3J0ZWRNZWRpYVR5cGUuUG93ZXJQb2ludF06IEV4dGVybmFsRXhwb3J0ZWRNZWRpYVR5cGUuUG93ZXJQb2ludCxcbiAgICBbSW50ZXJuYWxFeHBvcnRlZE1lZGlhVHlwZS5FeGNlbF06IEV4dGVybmFsRXhwb3J0ZWRNZWRpYVR5cGUuRXhjZWwsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgY29sdW1uVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsQ29sdW1uVHlwZSwgRXh0ZXJuYWxDb2x1bW5UeXBlPih7XG4gICAgW0ludGVybmFsQ29sdW1uVHlwZS5Db250aW51b3VzXTogRXh0ZXJuYWxDb2x1bW5UeXBlLkNvbnRpbnVvdXMsXG4gICAgW0ludGVybmFsQ29sdW1uVHlwZS5EaXNjcmV0ZV06IEV4dGVybmFsQ29sdW1uVHlwZS5EaXNjcmV0ZSxcbiAgICBbSW50ZXJuYWxDb2x1bW5UeXBlLlVua25vd25dOiBFeHRlcm5hbENvbHVtblR5cGUuVW5rbm93bixcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBmaWVsZEFnZ3JlZ2F0aW9uVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUsIEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGU+KHtcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdHRyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5BdHRyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkF2Z106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQXZnLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvbGxlY3RdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvbGxlY3QsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQ291bnRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkNvdW50ZF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuQ291bnRkLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkRheV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuRGF5LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkVuZF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuRW5kLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkhvdXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkhvdXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuSW5PdXRdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkluT3V0LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLkt1cnRvc2lzXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5LdXJ0b3NpcyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NYXhdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1heCxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZHldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1keSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NZWRpYW5dOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1lZGlhbixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW5dOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1pbixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5NaW51dGVdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1pbnV0ZSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Nb250aFllYXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLk1vbnRoWWVhcixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ob25lXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ob25lLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF0cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXRyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0MV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXVhcnQxLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlF1YXJ0M106IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuUXVhcnQzLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNlY29uZF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU2Vjb25kLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlNrZXduZXNzXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5Ta2V3bmVzcyxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdGRldl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXYsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3RkZXZwXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdGRldnAsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuU3VtXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5TdW0sXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNEYXldOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jRGF5LFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jSG91cl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNIb3VyLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jTWludXRlXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY01pbnV0ZSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY01vbnRoXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY01vbnRoLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlRydW5jUXRyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1F0cixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1NlY29uZF06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNTZWNvbmQsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNXZWVrXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1dlZWssXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVHJ1bmNZZWFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5UcnVuY1llYXIsXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVXNlcl06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuVXNlcixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5WYXJdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLlZhcixcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5WYXJwXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5WYXJwLFxuICAgIFtJbnRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWtdOiBFeHRlcm5hbEZpZWxkQWdncmVnYXRpb25UeXBlLldlZWssXG4gICAgW0ludGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuV2Vla2RheV06IEV4dGVybmFsRmllbGRBZ2dyZWdhdGlvblR5cGUuV2Vla2RheSxcbiAgICBbSW50ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5ZZWFyXTogRXh0ZXJuYWxGaWVsZEFnZ3JlZ2F0aW9uVHlwZS5ZZWFyLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGZpZWxkUm9sZVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpZWxkUm9sZVR5cGUsIEV4dGVybmFsRmllbGRSb2xlVHlwZT4oe1xuICAgIFtJbnRlcm5hbEZpZWxkUm9sZVR5cGUuRGltZW5zaW9uXTogRXh0ZXJuYWxGaWVsZFJvbGVUeXBlLkRpbWVuc2lvbixcbiAgICBbSW50ZXJuYWxGaWVsZFJvbGVUeXBlLk1lYXN1cmVdOiBFeHRlcm5hbEZpZWxkUm9sZVR5cGUuTWVhc3VyZSxcbiAgICBbSW50ZXJuYWxGaWVsZFJvbGVUeXBlLlVua25vd25dOiBFeHRlcm5hbEZpZWxkUm9sZVR5cGUuVW5rbm93bixcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBzaGVldFR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbFNoZWV0VHlwZSwgRXh0ZXJuYWxTaGVldFR5cGU+KHtcbiAgICBbSW50ZXJuYWxTaGVldFR5cGUuRGFzaGJvYXJkXTogRXh0ZXJuYWxTaGVldFR5cGUuRGFzaGJvYXJkLFxuICAgIFtJbnRlcm5hbFNoZWV0VHlwZS5TdG9yeV06IEV4dGVybmFsU2hlZXRUeXBlLlN0b3J5LFxuICAgIFtJbnRlcm5hbFNoZWV0VHlwZS5Xb3Jrc2hlZXRdOiBFeHRlcm5hbFNoZWV0VHlwZS5Xb3Jrc2hlZXQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgZGFzaGJvYXJkT2JqZWN0VHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZSwgRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlPih7XG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5FeHRlbnNpb25dOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuRXh0ZW5zaW9uLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuQmxhbmtdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuQmxhbmssXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5JbWFnZV06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5JbWFnZSxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLkxlZ2VuZF06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5MZWdlbmQsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYWdlRmlsdGVyXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlBhZ2VGaWx0ZXIsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5QYXJhbWV0ZXJDb250cm9sXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlBhcmFtZXRlckNvbnRyb2wsXG4gICAgW0ludGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5RdWlja0ZpbHRlcl06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5RdWlja0ZpbHRlcixcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRleHRdOiBFeHRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuVGV4dCxcbiAgICBbSW50ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRpdGxlXTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLlRpdGxlLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV2ViUGFnZV06IEV4dGVybmFsRGFzaGJvYXJkT2JqZWN0VHlwZS5XZWJQYWdlLFxuICAgIFtJbnRlcm5hbERhc2hib2FyZE9iamVjdFR5cGUuV29ya3NoZWV0XTogRXh0ZXJuYWxEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRhVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRGF0YVR5cGUsIEV4dGVybmFsRGF0YVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5Cb29sXTogRXh0ZXJuYWxEYXRhVHlwZS5Cb29sLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkRhdGVdOiBFeHRlcm5hbERhdGFUeXBlLkRhdGUsXG4gICAgW0ludGVybmFsRGF0YVR5cGUuRGF0ZVRpbWVdOiBFeHRlcm5hbERhdGFUeXBlLkRhdGVUaW1lLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLkZsb2F0XTogRXh0ZXJuYWxEYXRhVHlwZS5GbG9hdCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5JbnRdOiBFeHRlcm5hbERhdGFUeXBlLkludCxcbiAgICBbSW50ZXJuYWxEYXRhVHlwZS5TcGF0aWFsXTogRXh0ZXJuYWxEYXRhVHlwZS5TcGF0aWFsLFxuICAgIFtJbnRlcm5hbERhdGFUeXBlLlN0cmluZ106IEV4dGVybmFsRGF0YVR5cGUuU3RyaW5nLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGZpbHRlclVwZGF0ZVR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUsIEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZT4oe1xuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuQWRkXTogRXh0ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFkZCxcbiAgICBbSW50ZXJuYWxGaWx0ZXJVcGRhdGVUeXBlLkFsbF06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5BbGwsXG4gICAgW0ludGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZW1vdmVdOiBFeHRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVtb3ZlLFxuICAgIFtJbnRlcm5hbEZpbHRlclVwZGF0ZVR5cGUuUmVwbGFjZV06IEV4dGVybmFsRmlsdGVyVXBkYXRlVHlwZS5SZXBsYWNlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGFsbG93YWJsZVZhbHVlcyA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLCBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZT4oe1xuICAgIFtJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZS5BbGxdOiBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZS5BbGwsXG4gICAgW0ludGVybmFsRG9tYWluUmVzdHJpY3Rpb25UeXBlLkxpc3RdOiBFeHRlcm5hbFBhcmFtZXRlclZhbHVlVHlwZS5MaXN0LFxuICAgIFtJbnRlcm5hbERvbWFpblJlc3RyaWN0aW9uVHlwZS5SYW5nZV06IEV4dGVybmFsUGFyYW1ldGVyVmFsdWVUeXBlLlJhbmdlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGRhdGVTdGVwUGVyaW9kID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxEYXRlU3RlcFBlcmlvZCwgRXh0ZXJuYWxEYXRlUGVyaW9kPih7XG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuWWVhcnNdOiBFeHRlcm5hbERhdGVQZXJpb2QuWWVhcnMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuUXVhcnRlcnNdOiBFeHRlcm5hbERhdGVQZXJpb2QuUXVhcnRlcnMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuTW9udGhzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLk1vbnRocyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5XZWVrc106IEV4dGVybmFsRGF0ZVBlcmlvZC5XZWVrcyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5EYXlzXTogRXh0ZXJuYWxEYXRlUGVyaW9kLkRheXMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuSG91cnNdOiBFeHRlcm5hbERhdGVQZXJpb2QuSG91cnMsXG4gICAgW0ludGVybmFsRGF0ZVN0ZXBQZXJpb2QuTWludXRlc106IEV4dGVybmFsRGF0ZVBlcmlvZC5NaW51dGVzLFxuICAgIFtJbnRlcm5hbERhdGVTdGVwUGVyaW9kLlNlY29uZHNdOiBFeHRlcm5hbERhdGVQZXJpb2QuU2Vjb25kcyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5Jc29ZZWFyc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Jc29ZZWFycyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5Jc29RdWFydGVyc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Jc29RdWFydGVycyxcbiAgICBbSW50ZXJuYWxEYXRlU3RlcFBlcmlvZC5Jc29XZWVrc106IEV4dGVybmFsRGF0ZVBlcmlvZC5Jc29XZWVrcyxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBkYXRlUmFuZ2VUeXBlID0gbmV3IEVudW1Db252ZXJ0ZXI8SW50ZXJuYWxEYXRlUmFuZ2VUeXBlLCBFeHRlcm5hbERhdGVSYW5nZVR5cGU+KHtcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkN1cnJlbnRdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuQ3VycmVudCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3RdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTGFzdCxcbiAgICBbSW50ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3ROXTogRXh0ZXJuYWxEYXRlUmFuZ2VUeXBlLkxhc3ROLFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dF06IEV4dGVybmFsRGF0ZVJhbmdlVHlwZS5OZXh0LFxuICAgIFtJbnRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dE5dOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuTmV4dE4sXG4gICAgW0ludGVybmFsRGF0ZVJhbmdlVHlwZS5Ub0RhdGVdOiBFeHRlcm5hbERhdGVSYW5nZVR5cGUuVG9EYXRlLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGVycm9yQ29kZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsRXJyb3JDb2RlcywgRXh0ZXJuYWxFcnJvckNvZGVzPihcbiAgICB7XG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLklOSVRJQUxJWkFUSU9OX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLklOVEVSTkFMX0VSUk9SXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLk1JU1NJTkdfRU5VTV9NQVBQSU5HXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLk1JU1NJTkdfUEFSQU1FVEVSXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlBFUk1JU1NJT05fREVOSUVEXTogRXh0ZXJuYWxFcnJvckNvZGVzLkludGVybmFsRXJyb3IsXG4gICAgICBbSW50ZXJuYWxFcnJvckNvZGVzLlBSRVNfTU9ERUxfUEFSU0lOR19FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLFxuICAgICAgW0ludGVybmFsRXJyb3JDb2Rlcy5VTktOT1dOX1ZFUkJfSURdOiBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuVkVSU0lPTl9OT1RfQ09ORklHVVJFRF06IEV4dGVybmFsRXJyb3JDb2Rlcy5BUElOb3RJbml0aWFsaXplZCxcbiAgICAgIFtJbnRlcm5hbEVycm9yQ29kZXMuVklTSUJJTElUWV9FUlJPUl06IEV4dGVybmFsRXJyb3JDb2Rlcy5WaXNpYmlsaXR5RXJyb3IsXG4gICAgfSxcbiAgICBFeHRlcm5hbEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvcixcbiAgKTtcblxuICBwdWJsaWMgc3RhdGljIGZpbHRlclR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEZpbHRlclR5cGUsIEV4dGVybmFsRmlsdGVyVHlwZT4oe1xuICAgIFtJbnRlcm5hbEZpbHRlclR5cGUuQ2F0ZWdvcmljYWxdOiBFeHRlcm5hbEZpbHRlclR5cGUuQ2F0ZWdvcmljYWwsXG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5SYW5nZV06IEV4dGVybmFsRmlsdGVyVHlwZS5SYW5nZSxcbiAgICBbSW50ZXJuYWxGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZV06IEV4dGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGUsXG4gICAgW0ludGVybmFsRmlsdGVyVHlwZS5IaWVyYXJjaGljYWxdOiBFeHRlcm5hbEZpbHRlclR5cGUuSGllcmFyY2hpY2FsLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGNsYXNzTmFtZUtleSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsQ2xhc3NOYW1lS2V5LCBFeHRlcm5hbENsYXNzTmFtZUtleT4oe1xuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZV06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LkRhc2hib2FyZFRpdGxlLFxuICAgIFtJbnRlcm5hbENsYXNzTmFtZUtleS5TdG9yeVRpdGxlXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuU3RvcnlUaXRsZSxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuVG9vbHRpcF06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXAsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldF06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldCxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0VGl0bGVdOiBFeHRlcm5hbENsYXNzTmFtZUtleS5Xb3Jrc2hlZXRUaXRsZSxcbiAgICBbSW50ZXJuYWxDbGFzc05hbWVLZXkuUGFuZV06IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlBhbmUsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuUm93RGl2aWRlcnMsXG4gICAgW0ludGVybmFsQ2xhc3NOYW1lS2V5LkNvbHVtbkRpdmlkZXJzXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuQ29sdW1uRGl2aWRlcnMsXG4gICAgLy8gVGVtcG9yYXJ5IHVudGlsIHdlIGZpeCAxMzE3MjY2IC0gUGxhdGZvcm0gaGFzbid0IGJlZW4gdXBkYXRlZCBjdXJyZW50bHkgYmVjYXVzZSBuZWFyIGJyYW5jaCBpcyBjbG9zZWRcbiAgICBbJ2Rhc2hib2FyZC10aXRsZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5EYXNoYm9hcmRUaXRsZSxcbiAgICBbJ3N0b3J5LXRpdGxlJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlN0b3J5VGl0bGUsXG4gICAgWyd0b29sdGlwJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlRvb2x0aXAsXG4gICAgWyd3b3Jrc2hlZXQnXTogRXh0ZXJuYWxDbGFzc05hbWVLZXkuV29ya3NoZWV0LFxuICAgIFsnd29ya3NoZWV0LXRpdGxlJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LldvcmtzaGVldFRpdGxlLFxuICAgIFsncGFuZSddOiBFeHRlcm5hbENsYXNzTmFtZUtleS5QYW5lLFxuICAgIFsncm93LWRpdmlkZXJzJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzLFxuICAgIFsnY29sdW1uLWRpdmlkZXJzJ106IEV4dGVybmFsQ2xhc3NOYW1lS2V5LkNvbHVtbkRpdmlkZXJzLFxuICB9KTtcblxuICBwdWJsaWMgc3RhdGljIGhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUgPSBuZXcgRW51bUNvbnZlcnRlcjxcbiAgICBJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUsXG4gICAgRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlXG4gID4oe1xuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuQWxsU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuQWxsU2VsZWN0ZWQsXG4gICAgW0ludGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Ob25lU2VsZWN0ZWRdOiBFeHRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuTm9uZVNlbGVjdGVkLFxuICAgIFtJbnRlcm5hbEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuU29tZVNlbGVjdGVkXTogRXh0ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlNvbWVTZWxlY3RlZCxcbiAgICBbSW50ZXJuYWxIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlLlVua25vd25TZWxlY3RlZF06IEV4dGVybmFsSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZS5Vbmtub3duU2VsZWN0ZWQsXG4gIH0pO1xuXG4gIHB1YmxpYyBzdGF0aWMgYW5ub3RhdGlvblR5cGUgPSBuZXcgRW51bUNvbnZlcnRlcjxJbnRlcm5hbEFubm90YXRpb25UeXBlLCBFeHRlcm5hbEFubm90YXRpb25UeXBlPih7XG4gICAgW0ludGVybmFsQW5ub3RhdGlvblR5cGUuQXJlYV06IEV4dGVybmFsQW5ub3RhdGlvblR5cGUuQXJlYSxcbiAgICBbSW50ZXJuYWxBbm5vdGF0aW9uVHlwZS5NYXJrXTogRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZS5NYXJrLFxuICAgIFtJbnRlcm5hbEFubm90YXRpb25UeXBlLlBvaW50XTogRXh0ZXJuYWxBbm5vdGF0aW9uVHlwZS5Qb2ludCxcbiAgfSk7XG5cbiAgcHVibGljIHN0YXRpYyBtYXJrVHlwZSA9IG5ldyBFbnVtQ29udmVydGVyPEludGVybmFsTWFya1R5cGUsIEV4dGVybmFsTWFya1R5cGU+KHtcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5BcmVhXTogRXh0ZXJuYWxNYXJrVHlwZS5BcmVhLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkJhcl06IEV4dGVybmFsTWFya1R5cGUuQmFyLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkNpcmNsZV06IEV4dGVybmFsTWFya1R5cGUuQ2lyY2xlLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkdhbnR0QmFyXTogRXh0ZXJuYWxNYXJrVHlwZS5HYW50dEJhcixcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5IZWF0bWFwXTogRXh0ZXJuYWxNYXJrVHlwZS5IZWF0bWFwLFxuICAgIFtJbnRlcm5hbE1hcmtUeXBlLkxpbmVdOiBFeHRlcm5hbE1hcmtUeXBlLkxpbmUsXG4gICAgW0ludGVybmFsTWFya1R5cGUuTWFwXTogRXh0ZXJuYWxNYXJrVHlwZS5NYXAsXG4gICAgW0ludGVybmFsTWFya1R5cGUuUGllXTogRXh0ZXJuYWxNYXJrVHlwZS5QaWUsXG4gICAgW0ludGVybmFsTWFya1R5cGUuUG9seWdvbl06IEV4dGVybmFsTWFya1R5cGUuUG9seWdvbixcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5TaGFwZV06IEV4dGVybmFsTWFya1R5cGUuU2hhcGUsXG4gICAgW0ludGVybmFsTWFya1R5cGUuU3F1YXJlXTogRXh0ZXJuYWxNYXJrVHlwZS5TcXVhcmUsXG4gICAgW0ludGVybmFsTWFya1R5cGUuVGV4dF06IEV4dGVybmFsTWFya1R5cGUuVGV4dCxcbiAgICBbSW50ZXJuYWxNYXJrVHlwZS5WaXpFeHRlbnNpb25dOiBFeHRlcm5hbE1hcmtUeXBlLlZpekV4dGVuc2lvbixcbiAgfSk7XG59XG4vKiB0c2xpbnQ6ZW5hYmxlOnR5cGVkZWYgKi9cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNpbmdsZUV2ZW50TWFuYWdlciB9IGZyb20gJy4vU2luZ2xlRXZlbnRNYW5hZ2VyJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vVGFibGVhdUVycm9yJztcblxuLyoqXG4gKiBDbGFzcyBkZXNpZ25lZCB0byByZWdpc3RlciBhbmQgdW5yZWdpc3RlciBoYW5kbGVycyBmcm9tIGEgdXNlci4gT25seSB0aG9zZSBldmVudHNcbiAqIHdoaWNoIGFyZSBhZGRlZCB2aWEgQWRkTmV3RXZlbnRUeXBlIHdpbGwgYmUgc3VwcG9ydGVkIGJ5IHRoaXMgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNsYXNzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgQ29udHJhY3QuRXZlbnRMaXN0ZW5lck1hbmFnZXIge1xuICBwcml2YXRlIF9ldmVudExpc3RlbmVyTWFuYWdlcnM6IHsgW3RhYmxlYXVFdmVudFR5cGU6IHN0cmluZ106IFNpbmdsZUV2ZW50TWFuYWdlciB9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnMgPSB7fTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZSwgaGFuZGxlcjogQ29udHJhY3QuVGFibGVhdUV2ZW50SGFuZGxlckZuKTogQ29udHJhY3QuVGFibGVhdUV2ZW50VW5yZWdpc3RlckZuIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vycy5oYXNPd25Qcm9wZXJ0eShldmVudFR5cGUpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuVW5zdXBwb3J0ZWRFdmVudE5hbWUsIGBDYW5ub3QgYWRkIGV2ZW50LCB1bnN1cHBvcnRlZCBldmVudCB0eXBlOiAke2V2ZW50VHlwZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzW2V2ZW50VHlwZV0uYWRkRXZlbnRMaXN0ZW5lcihoYW5kbGVyKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZSwgaGFuZGxlcjogQ29udHJhY3QuVGFibGVhdUV2ZW50SGFuZGxlckZuKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLl9ldmVudExpc3RlbmVyTWFuYWdlcnMuaGFzT3duUHJvcGVydHkoZXZlbnRUeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLlVuc3VwcG9ydGVkRXZlbnROYW1lLCBgQ2Fubm90IHJlbW92ZSBldmVudCwgdW5zdXBwb3J0ZWQgZXZlbnQgdHlwZTogJHtldmVudFR5cGV9YCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50TGlzdGVuZXJNYW5hZ2Vyc1tldmVudFR5cGVdLnJlbW92ZUV2ZW50TGlzdGVuZXIoaGFuZGxlcik7XG4gIH1cblxuICBwcm90ZWN0ZWQgYWRkTmV3RXZlbnRUeXBlKGV2ZW50TWFuYWdlcjogU2luZ2xlRXZlbnRNYW5hZ2VyKTogdm9pZCB7XG4gICAgdGhpcy5fZXZlbnRMaXN0ZW5lck1hbmFnZXJzW2V2ZW50TWFuYWdlci5ldmVudFR5cGVdID0gZXZlbnRNYW5hZ2VyO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ29sdW1uVHlwZSwgRGF0YVR5cGUsIEZpZWxkQWdncmVnYXRpb25UeXBlLCBGaWVsZFJvbGVUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEZpZWxkSW1wbCB9IGZyb20gJy4vSW1wbC9GaWVsZEltcGwnO1xuXG5leHBvcnQgY2xhc3MgRmllbGQgaW1wbGVtZW50cyBDb250cmFjdC5GaWVsZCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9maWVsZEltcGw6IEZpZWxkSW1wbCkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBEYXRhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5kYXRhVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWdncmVnYXRpb24oKTogRmllbGRBZ2dyZWdhdGlvblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuYWdncmVnYXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5kYXRhU291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldCByb2xlKCk6IEZpZWxkUm9sZVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwucm9sZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1uVHlwZSgpOiBDb2x1bW5UeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmNvbHVtblR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ2FsY3VsYXRlZEZpZWxkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNDYWxjdWxhdGVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQ29tYmluZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzQ29tYmluZWRGaWVsZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW5lcmF0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc0dlbmVyYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNHZW9zcGF0aWFsKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuaXNHZW9zcGF0aWFsO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbXBsLmlzSGlkZGVuO1xuICB9XG5cbiAgcHVibGljIGdldCBpc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2UoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW1wbC5pc1ByZXNlbnRPblB1Ymxpc2hlZERhdGFzb3VyY2U7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNlbWFudGljUm9sZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuc2VtYW50aWNSb2xlO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhRm9ybWF0KCk6IENvbnRyYWN0LkRhdGFGb3JtYXQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEltcGwuZGF0YUZvcm1hdDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgQ3VzdG9tVmlld01vZGVsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzLCBWaXpTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vQXBpU2hhcmVkJztcbmV4cG9ydCBjbGFzcyBDdXN0b21WaWV3SW1wbCB7XG4gIHByaXZhdGUgX2x1aWQ6IHN0cmluZztcbiAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nO1xuICBwcml2YXRlIF9zaGFyZWQ6IGJvb2xlYW47XG4gIHByaXZhdGUgX2lzRGVmYXVsdDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfb3duZXJOYW1lOiBzdHJpbmc7XG4gIHByaXZhdGUgX3VybDogc3RyaW5nO1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgY3VzdG9tVmlld01vZGVsOiBDdXN0b21WaWV3TW9kZWwsXG4gICAgcHJpdmF0ZSBfcmVnaXN0cnlJZDogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLl9sdWlkID0gY3VzdG9tVmlld01vZGVsLmx1aWQ7XG4gICAgdGhpcy5fbmFtZSA9IGN1c3RvbVZpZXdNb2RlbC5uYW1lO1xuICAgIHRoaXMuX3NoYXJlZCA9IGN1c3RvbVZpZXdNb2RlbC5zaGFyZWQ7XG4gICAgdGhpcy5faXNEZWZhdWx0ID0gY3VzdG9tVmlld01vZGVsLmlzRGVmYXVsdDtcbiAgICB0aGlzLl9vd25lck5hbWUgPSBjdXN0b21WaWV3TW9kZWwub3duZXIudXNlckZyaWVuZGx5TmFtZTtcbiAgICB0aGlzLl91cmwgPSBjdXN0b21WaWV3TW9kZWwudXJsO1xuICB9XG5cbiAgcHVibGljIGdldCBsdWlkKCkge1xuICAgIHJldHVybiB0aGlzLl9sdWlkO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCkge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIHNldCBuYW1lKG5hbWU6IHN0cmluZykge1xuICAgIHRoaXMuX25hbWUgPSBuYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGFyZWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoYXJlZDtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2hhcmVkKHNoYXJlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX3NoYXJlZCA9IHNoYXJlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNEZWZhdWx0KCkge1xuICAgIHJldHVybiB0aGlzLl9pc0RlZmF1bHQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IGlzRGVmYXVsdChpc0RlZmF1bHQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9pc0RlZmF1bHQgPSBpc0RlZmF1bHQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG93bmVyTmFtZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fb3duZXJOYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCB1cmwoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQXN5bmMoKTogUHJvbWlzZTxDdXN0b21WaWV3SW1wbD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Vml6U2VydmljZT4oU2VydmljZU5hbWVzLlZpeik7XG4gICAgcmV0dXJuIHNlcnZpY2Uuc2F2ZUFzeW5jKHRoaXMpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLFxuICBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzLFxuICBFcnJvckNvZGVzLFxuICBTaGFyZWRFcnJvckNvZGVzLFxuICBTaGVldFR5cGUsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RUeXBlLCBEYXNoYm9hcmRab25lLCBTaGVldFBhdGgsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgUG9pbnQgfSBmcm9tICcuLi9Qb2ludCc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvQW5pbWF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRmlsdGVyU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBab25lU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1pvbmVTZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4vRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEltcGwgfSBmcm9tICcuL1NoZWV0SW1wbCc7XG5pbXBvcnQgeyBTaGVldEluZm9JbXBsIH0gZnJvbSAnLi9TaGVldEluZm9JbXBsJztcbmltcG9ydCB7IFN0b3J5UG9pbnRJbXBsIH0gZnJvbSAnLi9TdG9yeVBvaW50SW1wbCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRJbXBsIH0gZnJvbSAnLi9Xb3Jrc2hlZXRJbXBsJztcblxuZXhwb3J0IGNsYXNzIERhc2hib2FyZEltcGwgZXh0ZW5kcyBTaGVldEltcGwge1xuICBwcml2YXRlIF93b3Jrc2hlZXRzSW1wbDogQXJyYXk8V29ya3NoZWV0SW1wbD47XG4gIHByaXZhdGUgX29iamVjdHM6IEFycmF5PERhc2hib2FyZE9iamVjdEltcGw+O1xuICBwcml2YXRlIHpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBfc2hlZXRJbmZvOiBTaGVldEluZm9JbXBsLFxuICAgIHByaXZhdGUgX3pvbmVzOiBBcnJheTxEYXNoYm9hcmRab25lPixcbiAgICBwcml2YXRlIF9zaGVldFBhdGg6IFNoZWV0UGF0aCxcbiAgICBfcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX3BhcmVudFN0b3J5UG9pbnRJbXBsOiBTdG9yeVBvaW50SW1wbCB8IG51bGwsXG4gICAgcHJpdmF0ZSBfYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQ6IG51bWJlciA9IDAsXG4gICkge1xuICAgIHN1cGVyKF9zaGVldEluZm8sIF9yZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0c0ltcGwoKTogQXJyYXk8V29ya3NoZWV0SW1wbD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRzSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb2JqZWN0cygpOiBBcnJheTxEYXNoYm9hcmRPYmplY3RJbXBsPiB7XG4gICAgcmV0dXJuIHRoaXMuX29iamVjdHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudFN0b3J5UG9pbnQoKTogU3RvcnlQb2ludEltcGwgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50U3RvcnlQb2ludEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZURhc2hib2FyZE9iamVjdElkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2FjdGl2ZURhc2hib2FyZE9iamVjdElkO1xuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVEYXNoYm9hcmROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0UGF0aC5zaGVldE5hbWU7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKCk6IHZvaWQge1xuICAgIHRoaXMuX3dvcmtzaGVldHNJbXBsID0gbmV3IEFycmF5PFdvcmtzaGVldEltcGw+KCk7XG4gICAgdGhpcy5fb2JqZWN0cyA9IG5ldyBBcnJheTxEYXNoYm9hcmRPYmplY3RJbXBsPigpO1xuICAgIHRoaXMuem9uZU1hcCA9IG5ldyBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPigpO1xuXG4gICAgLy8gUHJvY2VzcyBhbGwgdGhlIHpvbmVzIHdoaWNoIGFyZSBjb250YWluZWQgaW4gdGhpcyBkYXNoYm9hcmRcbiAgICBmb3IgKGNvbnN0IHpvbmUgb2YgdGhpcy5fem9uZXMpIHtcbiAgICAgIGxldCB3b3Jrc2hlZXRJbXBsOiBXb3Jrc2hlZXRJbXBsIHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgICBjb25zdCB6b25lU2l6ZTogQ29udHJhY3QuU2l6ZSA9IHsgd2lkdGg6IHpvbmUud2lkdGgsIGhlaWdodDogem9uZS5oZWlnaHQgfTtcbiAgICAgIC8vIEFzIHRoZSBkYXNoYm9hcmQgaXMgYWN0aXZlLCBhbGwgb3RoZXIgem9uZXMgaW4gdGhlIGRhc2hib2FyZCBhcmUgaW5hY3RpdmUuXG4gICAgICBjb25zdCBpc0FjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICBpZiAoem9uZS56b25lVHlwZSA9PT0gRGFzaGJvYXJkT2JqZWN0VHlwZS5Xb3Jrc2hlZXQgfHwgem9uZS56b25lVHlwZSA9PT0gRGFzaGJvYXJkT2JqZWN0VHlwZS5RdWlja0ZpbHRlcikge1xuICAgICAgICBsZXQgd29ya3NoZWV0TmFtZSA9ICcnO1xuICAgICAgICBsZXQgd29ya3NoZWV0VXJsID0gJyc7XG4gICAgICAgIGxldCBpc0hpZGRlbiA9IGZhbHNlO1xuICAgICAgICBpZiAoem9uZS5zaGVldEluZm8pIHtcbiAgICAgICAgICAvLyB6b25lLnNoZWV0SW5mbyB3YXMgbm90IGluaXRpYWxpemVkIHByaW9yIHRvIGludGVybmFsLWNvbnRyYWN0IDEuNi4wXG4gICAgICAgICAgd29ya3NoZWV0TmFtZSA9IHpvbmUuc2hlZXRJbmZvLm5hbWU7XG5cbiAgICAgICAgICAvLyB3b3Jrc2hlZXRVcmwgJiBpc0hpZGRlbiBpcyBmb3IgRW1iZWRkaW5nIG9ubHlcbiAgICAgICAgICB3b3Jrc2hlZXRVcmwgPSB6b25lLnNoZWV0SW5mby51cmwgfHwgJyc7XG4gICAgICAgICAgLy8gSWYgdGhlcmUncyBhIHVybCwgdGhlbiBpdCdzIG5vdCBoaWRkZW5cbiAgICAgICAgICBpc0hpZGRlbiA9IHdvcmtzaGVldFVybCA9PT0gJyc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd29ya3NoZWV0TmFtZSA9IHpvbmUubmFtZTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbmRleGVzLCBpc0FjdGl2ZSBhbmQgc29tZSBtb3JlIHByb3BlcnRpZXMgaW4gc2hlZXRJbmZvSW1wbCBhcmUgZW1iZWRkaW5nIHNwZWNpZmljLlxuICAgICAgICAvLyBCdXQgd2UgaW5pdCB0aGVtIGZvciBib3RoIGV4dGVuc2lvbnMgYW5kIGVtYmVkZGluZyBhcyB0aGUgTW9kZWxzIHdpbGwgb25seSB1c2Ugd2hhdCBpcyByZWxldmFudC5cbiAgICAgICAgY29uc3Qgc2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKFxuICAgICAgICAgIHdvcmtzaGVldE5hbWUsXG4gICAgICAgICAgU2hlZXRUeXBlLldvcmtzaGVldCxcbiAgICAgICAgICB6b25lU2l6ZSxcbiAgICAgICAgICB0aGlzLl93b3Jrc2hlZXRzSW1wbC5sZW5ndGgsXG4gICAgICAgICAgaXNBY3RpdmUsXG4gICAgICAgICAgaXNIaWRkZW4sXG4gICAgICAgICAgd29ya3NoZWV0VXJsLFxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IHZpeklkOiBWaXN1YWxJZCA9IHtcbiAgICAgICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgICAgICAgZGFzaGJvYXJkOiB0aGlzLl9zaGVldEluZm9JbXBsLm5hbWUsXG4gICAgICAgICAgc3Rvcnlib2FyZDogdGhpcy5fc2hlZXRQYXRoLnN0b3J5Ym9hcmQsXG4gICAgICAgICAgZmxpcGJvYXJkWm9uZUlEOiB0aGlzLl9zaGVldFBhdGguZmxpcGJvYXJkWm9uZUlELFxuICAgICAgICAgIHN0b3J5UG9pbnRJRDogdGhpcy5fc2hlZXRQYXRoLnN0b3J5UG9pbnRJRCxcbiAgICAgICAgfTtcblxuICAgICAgICB3b3Jrc2hlZXRJbXBsID0gbmV3IFdvcmtzaGVldEltcGwoc2hlZXRJbmZvSW1wbCwgdGhpcy5fcmVnaXN0cnlJZCwgdml6SWQsIHRoaXMsIHRoaXMuX3BhcmVudFN0b3J5UG9pbnRJbXBsKTtcbiAgICAgICAgaWYgKHpvbmUuem9uZVR5cGUgPT09IERhc2hib2FyZE9iamVjdFR5cGUuV29ya3NoZWV0KSB7XG4gICAgICAgICAgdGhpcy5fd29ya3NoZWV0c0ltcGwucHVzaCh3b3Jrc2hlZXRJbXBsKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCB6b25lUG9pbnQgPSBuZXcgUG9pbnQoem9uZS54LCB6b25lLnkpO1xuXG4gICAgICBjb25zdCBkYXNoYm9hcmRPYmplY3RJbXBsID0gbmV3IERhc2hib2FyZE9iamVjdEltcGwoXG4gICAgICAgIHRoaXMsXG4gICAgICAgIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXNoYm9hcmRPYmplY3RUeXBlLmNvbnZlcnQoem9uZS56b25lVHlwZSksXG4gICAgICAgIHpvbmVQb2ludCxcbiAgICAgICAgem9uZVNpemUsXG4gICAgICAgIHdvcmtzaGVldEltcGwsXG4gICAgICAgIHpvbmUubmFtZSxcbiAgICAgICAgem9uZS5pc0Zsb2F0aW5nICE9PSB1bmRlZmluZWQgPyB6b25lLmlzRmxvYXRpbmcgOiBmYWxzZSwgLy8gYmVmb3JlIDEuNi4wIHdlIGRpZG4ndCBoYXZlIGlzRmxvYXRpbmcsIHNvIHdlIGFzc3VtZSBmYWxzZVxuICAgICAgICB6b25lLmlzVmlzaWJsZSAhPT0gdW5kZWZpbmVkID8gem9uZS5pc1Zpc2libGUgOiB0cnVlLCAvLyBiZWZvcmUgMS42LjAgd2UgZGlkbid0IGhhdmUgaXNWaXNpYmxlLCBzbyB3ZSBhc3N1bWUgdHJ1ZVxuICAgICAgICB6b25lLnpvbmVJZCxcbiAgICAgICAgem9uZS5maWVsZElkLFxuICAgICAgKTtcblxuICAgICAgdGhpcy5fb2JqZWN0cy5wdXNoKGRhc2hib2FyZE9iamVjdEltcGwpO1xuICAgICAgdGhpcy56b25lTWFwLnNldCh6b25lLnpvbmVJZCwgZGFzaGJvYXJkT2JqZWN0SW1wbCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlBc3luYyhkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwOiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwIHwgb2JqZWN0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgem9uZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Wm9uZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5ab25lKTtcblxuICAgIHJldHVybiB6b25lU2VydmljZS5zZXRWaXNpYmlsaXR5QXN5bmMoLypEYXNoYm9hcmQgTmFtZSovIHRoaXMubmFtZSwgdGhpcy56b25lTWFwLCBkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXNoYm9hcmRPYmplY3RCeUlkKGRhc2hib2FyZE9iamVjdElkOiBudW1iZXIpOiBEYXNoYm9hcmRPYmplY3RJbXBsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy56b25lTWFwLmdldChkYXNoYm9hcmRPYmplY3RJZCk7XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlWm9uZXMobmV3Wm9uZXM6IEFycmF5PERhc2hib2FyZFpvbmU+LCBuZXdBY3RpdmVab25lSWQgPSAwLCBuZXdBY3RpdmVEYXNoYm9hcmROYW1lID0gJycpOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzIHtcbiAgICAvLyBnZXR0aW5nIHByZXZpb3VzIGRhc2hib2FyZCBvYmplY3RzLCBhY3RpdmUgem9uZSBJRCBhbmQgYWN0aXZlIGRhc2hib2FyZCBuYW1lXG4gICAgY29uc3Qgb2xkRGFzaGJvYXJkT2JqZWN0cyA9IHRoaXMuX29iamVjdHM7XG4gICAgY29uc3Qgb2xkWm9uZU1hcCA9IHRoaXMuem9uZU1hcDtcbiAgICBjb25zdCBvbGRBY3RpdmVab25lSWQgPSB0aGlzLl9hY3RpdmVEYXNoYm9hcmRPYmplY3RJZDtcbiAgICBjb25zdCBvbGRBY3RpdmVEYXNoYm9hcmROYW1lID0gdGhpcy5fc2hlZXRQYXRoLnNoZWV0TmFtZTtcbiAgICAvLyB1cGRhdGluZyB6b25lcyBhbmQgcmVpbml0aWFsaXppbmcgaW5zdGFuY2UgdmFyaWFibGVzXG4gICAgdGhpcy5fem9uZXMgPSBuZXdab25lcztcbiAgICB0aGlzLl9hY3RpdmVEYXNoYm9hcmRPYmplY3RJZCA9IG5ld0FjdGl2ZVpvbmVJZDtcbiAgICBpZiAobmV3QWN0aXZlRGFzaGJvYXJkTmFtZSkge1xuICAgICAgdGhpcy5fc2hlZXRQYXRoLnNoZWV0TmFtZSA9IG5ld0FjdGl2ZURhc2hib2FyZE5hbWU7XG4gICAgICB0aGlzLl9zaGVldEluZm9JbXBsLm5hbWUgPSBuZXdBY3RpdmVEYXNoYm9hcmROYW1lO1xuICAgIH1cbiAgICB0aGlzLmluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcygpO1xuICAgIC8vIGdldHRpbmcgbmV3IGRhc2hib2FyZCBvYmplY3RzXG4gICAgY29uc3QgbmV3RGFzaGJvYXJkT2JqZWN0cyA9IHRoaXMuX29iamVjdHM7XG4gICAgY29uc3QgbmV3Wm9uZU1hcCA9IHRoaXMuem9uZU1hcDtcbiAgICAvLyBpbml0aWFsaXppbmcgbWFwIGZvciBjaGFuZ2VzXG4gICAgY29uc3Qgem9uZUNoYW5nZXM6IERhc2hib2FyZExheW91dENoYW5nZURldGFpbHMgPSBuZXcgTWFwKCk7XG5cbiAgICAvLyBjb21wYXJpbmcgb2xkIGRhc2hib2FyZCBvYmplY3RzIHdpdGggbmV3IG9uZXNcbiAgICBvbGREYXNoYm9hcmRPYmplY3RzLmZvckVhY2goKG9sZE9iamVjdCkgPT4ge1xuICAgICAgY29uc3Qgb2xkSWQ6IG51bWJlciA9IG9sZE9iamVjdC5pZDtcblxuICAgICAgLy8gY2hlY2tpbmcgaWYgem9uZSB3YXMgcmVtb3ZlZFxuICAgICAgaWYgKCFuZXdab25lTWFwLmhhcyhvbGRJZCkpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuUmVtb3ZlZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgbmV3T2JqZWN0ID0gbmV3Wm9uZU1hcC5nZXQob2xkSWQpO1xuICAgICAgaWYgKG9sZE9iamVjdC5pc0Zsb2F0aW5nICE9PSBuZXdPYmplY3QhLmlzRmxvYXRpbmcpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuSXNGbG9hdGluZ0NoYW5nZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkT2JqZWN0LmlzVmlzaWJsZSAhPT0gbmV3T2JqZWN0IS5pc1Zpc2libGUpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuSXNWaXNpYmxlQ2hhbmdlZCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChvbGRPYmplY3QubmFtZSAhPT0gbmV3T2JqZWN0IS5uYW1lKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZElkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLk5hbWVDaGFuZ2VkKTtcbiAgICAgIH1cblxuICAgICAgaWYgKG9sZE9iamVjdC5wb3NpdGlvbi54ICE9PSBuZXdPYmplY3QhLnBvc2l0aW9uLnggfHwgb2xkT2JqZWN0LnBvc2l0aW9uLnkgIT09IG5ld09iamVjdCEucG9zaXRpb24ueSkge1xuICAgICAgICB0aGlzLmFkZENoYW5nZShvbGRJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5Qb3NpdGlvbkNoYW5nZWQpO1xuICAgICAgfVxuXG4gICAgICBpZiAob2xkT2JqZWN0LnNpemUud2lkdGggIT09IG5ld09iamVjdCEuc2l6ZS53aWR0aCB8fCBvbGRPYmplY3Quc2l6ZS5oZWlnaHQgIT09IG5ld09iamVjdCEuc2l6ZS5oZWlnaHQpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2Uob2xkSWQsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuU2l6ZUNoYW5nZWQpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2hlY2tpbmcgZm9yIGFueSBhZGRlZCB6b25lc1xuICAgIG5ld0Rhc2hib2FyZE9iamVjdHMuZm9yRWFjaCgobmV3T2JqZWN0KSA9PiB7XG4gICAgICBpZiAoIW9sZFpvbmVNYXAuaGFzKG5ld09iamVjdC5pZCkpIHtcbiAgICAgICAgdGhpcy5hZGRDaGFuZ2UobmV3T2JqZWN0LmlkLCB6b25lQ2hhbmdlcywgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLkFkZGVkKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIENoZWNraW5nIGlmIHpvbmUgc2VsZWN0aW9uIGhhcyBjaGFuZ2VkXG4gICAgaWYgKG9sZEFjdGl2ZVpvbmVJZCAhPT0gbmV3QWN0aXZlWm9uZUlkKSB7XG4gICAgICBpZiAobmV3QWN0aXZlWm9uZUlkICE9PSAwKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG5ld0FjdGl2ZVpvbmVJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5TZWxlY3RlZCk7XG4gICAgICB9XG4gICAgICBpZiAob2xkQWN0aXZlWm9uZUlkICE9PSAwKSB7XG4gICAgICAgIHRoaXMuYWRkQ2hhbmdlKG9sZEFjdGl2ZVpvbmVJZCwgem9uZUNoYW5nZXMsIERhc2hib2FyZExheW91dENoYW5nZS5EZXNlbGVjdGVkKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVja2luZyBpZiBzd2l0Y2hlZCB0byBhbm90aGVyIGRhc2hib2FyZFxuICAgIGlmIChuZXdBY3RpdmVEYXNoYm9hcmROYW1lICYmIG9sZEFjdGl2ZURhc2hib2FyZE5hbWUgIT09IG5ld0FjdGl2ZURhc2hib2FyZE5hbWUpIHtcbiAgICAgIHRoaXMuYWRkQ2hhbmdlKDAsIHpvbmVDaGFuZ2VzLCBEYXNoYm9hcmRMYXlvdXRDaGFuZ2UuRGFzaGJvYXJkQ2hhbmdlZCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHpvbmVDaGFuZ2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRDaGFuZ2Uoem9uZUlkOiBudW1iZXIsIHpvbmVDaGFuZ2VzOiBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzLCBjaGFuZ2U6IERhc2hib2FyZExheW91dENoYW5nZSk6IHZvaWQge1xuICAgIGlmICghem9uZUNoYW5nZXMuaGFzKHpvbmVJZCkpIHtcbiAgICAgIHpvbmVDaGFuZ2VzLnNldCh6b25lSWQsIFtdKTtcbiAgICB9XG5cbiAgICB6b25lQ2hhbmdlcy5nZXQoem9uZUlkKSEucHVzaChjaGFuZ2UpO1xuICB9XG5cbiAgcHVibGljIG1vdmVBbmRSZXNpemVEYXNoYm9hcmRPYmplY3RzQXN5bmMoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB6b25lU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxab25lU2VydmljZT4oU2VydmljZU5hbWVzLlpvbmUpO1xuXG4gICAgcmV0dXJuIHpvbmVTZXJ2aWNlLm1vdmVBbmRSZXNpemVBc3luYygvKkRhc2hib2FyZCBOYW1lKi8gdGhpcy5uYW1lLCB0aGlzLnpvbmVNYXAsIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5KTtcbiAgfVxuXG4gIHB1YmxpYyByZXBsYXlBbmltYXRpb25Bc3luYyhyZXBsYXlTcGVlZDogQ29udHJhY3QuUmVwbGF5U3BlZWRUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgYW5pbWF0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxBbmltYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuQW5pbWF0aW9uKTtcblxuICAgIHJldHVybiBhbmltYXRpb25TZXJ2aWNlLnJlcGxheUFzeW5jKHJlcGxheVNwZWVkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldE9yRW1iZWRkZWRJbkFjdGl2ZVN0b3J5UG9pbnQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RGFzaGJvYXJkRmlsdGVyc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZT4odXBkYXRlVHlwZSwgQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSwgJ0ZpbHRlclVwZGF0ZVR5cGUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZXMpKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ3ZhbHVlcyBwYXJhbWV0ZXIgZm9yIGFwcGx5RGFzaGJvYXJkRmlsdGVyQXN5bmMgbXVzdCBiZSBhbiBhcnJheScpO1xuICAgIH1cbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0T3JFbWJlZGRlZEluQWN0aXZlU3RvcnlQb2ludCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBseURhc2hib2FyZEZpbHRlckFzeW5jKGZpZWxkTmFtZSwgdmFsdWVzLCB1cGRhdGVUeXBlLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIEBXLTEyOTg2NDM5OiByZW1vdmUgb25jZSBpbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMgaXMgbW92ZWQgdG8gdGhlIGNvbnN0cnVjdG9yIGZvciB0aGlzIGNsYXNzXG4gIC8vIFRoaXMgbWV0aG9kIG9ubHkgZXhpc3RzIHNpbmNlIHdvcmtzaGVldHNJbXBsIGNhbiBiZSB1bmRlZmluZWQsIGJ1dCB3ZSBuZWVkIHRoZSB3b3Jrc2hlZXQgbmFtZXMgaW4gdGhlIEV4cG9ydCBBUElzXG4gIHB1YmxpYyBnZXRXb3Jrc2hlZXROYW1lc0Zyb21ab25lcygpOiBBcnJheTxzdHJpbmc+IHtcbiAgICBjb25zdCB3b3Jrc2hlZXROYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHpvbmUgb2YgdGhpcy5fem9uZXMpIHtcbiAgICAgIGlmICh6b25lLnpvbmVUeXBlICE9PSBEYXNoYm9hcmRPYmplY3RUeXBlLldvcmtzaGVldCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIC8vIHpvbmUuc2hlZXRJbmZvIHdhcyBub3QgaW5pdGlhbGl6ZWQgcHJpb3IgdG8gaW50ZXJuYWwtY29udHJhY3QgMS42LjBcbiAgICAgIGNvbnN0IHdvcmtzaGVldE5hbWUgPSB6b25lLnNoZWV0SW5mbyA/IHpvbmUuc2hlZXRJbmZvLm5hbWUgOiB6b25lLm5hbWU7XG4gICAgICB3b3Jrc2hlZXROYW1lcy5wdXNoKHdvcmtzaGVldE5hbWUpO1xuICAgIH1cblxuICAgIHJldHVybiB3b3Jrc2hlZXROYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgdmVyaWZ5QWN0aXZlU2hlZXRPckVtYmVkZGVkSW5BY3RpdmVTdG9yeVBvaW50KCkge1xuICAgIGNvbnN0IGlzUm9vdEFuZEFjdGl2ZURhc2hib2FyZCA9IHRoaXMuYWN0aXZlO1xuICAgIGNvbnN0IGlzV2l0aGluQWN0aXZlU3RvcnlQb2ludCA9IHRoaXMucGFyZW50U3RvcnlQb2ludCAhPSBudWxsICYmIHRoaXMucGFyZW50U3RvcnlQb2ludC5hY3RpdmU7XG4gICAgaWYgKCFpc1Jvb3RBbmRBY3RpdmVEYXNoYm9hcmQgJiYgIWlzV2l0aGluQWN0aXZlU3RvcnlQb2ludCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLk5vdEFjdGl2ZVNoZWV0LCAnT3BlcmF0aW9uIG5vdCBhbGxvd2VkIG9uIG5vbi1hY3RpdmUgc2hlZXQnKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0Rhc2hib2FyZEltcGwnO1xuaW1wb3J0IHsgV29ya3NoZWV0SW1wbCB9IGZyb20gJy4vV29ya3NoZWV0SW1wbCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGRhc2hib2FyZCBvYmplY3RzIC0gdGhlIHpvbmVzIGluIGEgZGFzaGJvYXJkLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkT2JqZWN0SW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9kYXNoYm9hcmRJbXBsOiBEYXNoYm9hcmRJbXBsLFxuICAgIHByaXZhdGUgX3R5cGU6IERhc2hib2FyZE9iamVjdFR5cGUsXG4gICAgcHJpdmF0ZSBfcG9zaXRpb246IENvbnRyYWN0LlBvaW50LFxuICAgIHByaXZhdGUgX3NpemU6IENvbnRyYWN0LlNpemUsXG4gICAgcHJpdmF0ZSBfd29ya3NoZWV0SW1wbDogV29ya3NoZWV0SW1wbCB8IHVuZGVmaW5lZCxcbiAgICBwcml2YXRlIF9uYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfaXNGbG9hdGluZzogYm9vbGVhbixcbiAgICBwcml2YXRlIF9pc1Zpc2libGU6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9maWVsZElkOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZEltcGwoKTogRGFzaGJvYXJkSW1wbCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogRGFzaGJvYXJkT2JqZWN0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBvc2l0aW9uKCk6IENvbnRyYWN0LlBvaW50IHtcbiAgICByZXR1cm4gdGhpcy5fcG9zaXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldEltcGwoKTogV29ya3NoZWV0SW1wbCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNGbG9hdGluZygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNGbG9hdGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1Zpc2libGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2lkO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDb25uZWN0aW9uU3VtbWFyeSB9IGZyb20gJy4uL0Nvbm5lY3Rpb25TdW1tYXJ5JztcbmltcG9ydCB7IEZpZWxkIH0gZnJvbSAnLi4vRmllbGQnO1xuaW1wb3J0IHsgTG9naWNhbFRhYmxlIH0gZnJvbSAnLi4vTG9naWNhbFRhYmxlJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9HZXREYXRhU2VydmljZSc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBUYWJsZVN1bW1hcnkgfSBmcm9tICcuLi9UYWJsZVN1bW1hcnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IEZpZWxkSW1wbCB9IGZyb20gJy4vRmllbGRJbXBsJztcblxuZXhwb3J0IGNsYXNzIERhdGFTb3VyY2VJbXBsIHtcbiAgcHJpdmF0ZSBfZmllbGRzOiBBcnJheTxGaWVsZD47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2RhdGFTb3VyY2VJbmZvOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFTb3VyY2UsXG4gICAgcHJpdmF0ZSBfcmVnaXN0cnlJZDogbnVtYmVyLFxuICApIHtcbiAgICB0aGlzLl9maWVsZHMgPSBfZGF0YVNvdXJjZUluZm8uZmllbGRzLm1hcCgoZmllbGRNb2RlbCkgPT4ge1xuICAgICAgY29uc3QgZmllbGRJbXBsID0gbmV3IEZpZWxkSW1wbChmaWVsZE1vZGVsLCB0aGlzKTtcbiAgICAgIHJldHVybiBuZXcgRmllbGQoZmllbGRJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXRhU291cmNlSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXh0cmFjdFVwZGF0ZVRpbWUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uZXh0cmFjdFVwZGF0ZVRpbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkcygpOiBBcnJheTxDb250cmFjdC5GaWVsZD4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZHM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXh0cmFjdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uaXNFeHRyYWN0O1xuICB9XG5cbiAgcHVibGljIGdldCBpc1B1Ymxpc2hlZCgpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZGF0YVNvdXJjZUluZm8uaXNQdWJsaXNoZWQ7XG4gIH1cblxuICBwdWJsaWMgcHVibGlzaGVkVXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2VJbmZvLnB1Ymxpc2hlZFVybDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhQYWdlUm93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLnJlZnJlc2hBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0Q29ubmVjdGlvblN1bW1hcmllc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuQ29ubmVjdGlvblN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLmdldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCkudGhlbjxDb250cmFjdC5Db25uZWN0aW9uU3VtbWFyeVtdPigoc3VtbWFyaWVzKSA9PiB7XG4gICAgICByZXR1cm4gc3VtbWFyaWVzLm1hcCgoc3VtbWFyeSkgPT4gbmV3IENvbm5lY3Rpb25TdW1tYXJ5KHN1bW1hcnkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBY3RpdmVUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlRhYmxlU3VtbWFyeT4+IHtcbiAgICBjb25zdCBkYXRhU291cmNlU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcblxuICAgIHJldHVybiBkYXRhU291cmNlU2VydmljZS5nZXRBY3RpdmVUYWJsZXNBc3luYyh0aGlzLl9kYXRhU291cmNlSW5mby5pZCkudGhlbjxBcnJheTxDb250cmFjdC5UYWJsZVN1bW1hcnk+PigodGFibGVJbmZvcykgPT4ge1xuICAgICAgcmV0dXJuIHRhYmxlSW5mb3MubWFwKCh0YWJsZUluZm8pID0+IG5ldyBUYWJsZVN1bW1hcnkodGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zPzogQ29udHJhY3QuRGF0YVNvdXJjZVVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgZ2V0RGF0YVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgIHJldHVybiBnZXREYXRhU2VydmljZS5nZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsIC8vIDAgYW5kIFtdIGFyZSBkZWZhdWx0c1xuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlIHx8IFtdLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zdCBnZXREYXRhU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIGdldERhdGFTZXJ2aWNlLmdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhcbiAgICAgIHRoaXMuaWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsIC8vIDAgYW5kIFtdIGFyZSBkZWZhdWx0c1xuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlIHx8IFtdLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5EYXRhU291cmNlVW5kZXJseWluZ0RhdGFPcHRpb25zLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIGNvbnN0IGdldERhdGFTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gZ2V0RGF0YVNlcnZpY2UuZ2V0TG9naWNhbFRhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgICAgdGhpcy5pZCxcbiAgICAgIGxvZ2ljYWxUYWJsZUlkLFxuICAgICAgcGFnZVJvd0NvdW50IHx8IHRoaXMuZ2V0TWF4UGFnZVJvd0xpbWl0KCksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcyhkYXRhU291cmNlOiBDb250cmFjdC5EYXRhU291cmNlKTogdm9pZCB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUludGVybmFsVmFsdWUoZGF0YVNvdXJjZSwgJ2RhdGFTb3VyY2UnKTtcblxuICAgIHRoaXMuX2ZpZWxkcyA9IHRoaXMuX2RhdGFTb3VyY2VJbmZvLmZpZWxkcy5tYXAoKGZpZWxkTW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IGZpZWxkSW1wbCA9IG5ldyBGaWVsZEltcGwoZmllbGRNb2RlbCwgZGF0YVNvdXJjZSk7XG4gICAgICByZXR1cm4gbmV3IEZpZWxkKGZpZWxkSW1wbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuTG9naWNhbFRhYmxlPj4ge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuXG4gICAgcmV0dXJuIGRhdGFTb3VyY2VTZXJ2aWNlLmdldExvZ2ljYWxUYWJsZXNBc3luYyh0aGlzLmlkKS50aGVuPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+KChsb2dpY2FsVGFibGVJbmZvcykgPT4ge1xuICAgICAgcmV0dXJuIGxvZ2ljYWxUYWJsZUluZm9zLm1hcCgobG9naWNhbFRhYmxlSW5mbykgPT4gbmV3IExvZ2ljYWxUYWJsZShsb2dpY2FsVGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcblxuZXhwb3J0IGNsYXNzIEZpZWxkSW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9maWVsZEluZm86IEludGVybmFsQ29udHJhY3QuRmllbGQsXG4gICAgcHJpdmF0ZSBfcGFyZW50RGF0YVNvdXJjZT86IENvbnRyYWN0LkRhdGFTb3VyY2UsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGVzY3JpcHRpb24oKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmRlc2NyaXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBDb250cmFjdC5EYXRhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5kYXRhVHlwZSA/PyBDb250cmFjdC5EYXRhVHlwZS5Vbmtub3duO1xuICB9XG5cbiAgcHVibGljIGdldCBhZ2dyZWdhdGlvbigpOiBDb250cmFjdC5GaWVsZEFnZ3JlZ2F0aW9uVHlwZSB7XG4gICAgcmV0dXJuIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5maWVsZEFnZ3JlZ2F0aW9uVHlwZS5jb252ZXJ0KHRoaXMuX2ZpZWxkSW5mby5hZ2dyZWdhdGlvbik7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGFTb3VyY2UoKTogQ29udHJhY3QuRGF0YVNvdXJjZSB7XG4gICAgaWYgKCF0aGlzLl9wYXJlbnREYXRhU291cmNlKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGF0YSBzb3VyY2UgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZSBmb3IgdGhpcyBmaWVsZC4gUGxlYXNlIHVzZSBnZXRGaWVsZEFzeW5jIG1ldGhvZCB0byBnZXQgZmllbGQncyBkYXRhIHNvdXJjZSBpbmZvcm1hdGlvbmAsXG4gICAgICApO1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnREYXRhU291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldCByb2xlKCk6IENvbnRyYWN0LkZpZWxkUm9sZVR5cGUge1xuICAgIHJldHVybiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZmllbGRSb2xlVHlwZS5jb252ZXJ0KHRoaXMuX2ZpZWxkSW5mby5yb2xlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sdW1uVHlwZSgpOiBDb250cmFjdC5Db2x1bW5UeXBlIHtcbiAgICBsZXQgZGVmaW5lZFZhbHVlOiBJbnRlcm5hbENvbnRyYWN0LkNvbHVtblR5cGUgPSB0aGlzLl9maWVsZEluZm8uY29sdW1uVHlwZSB8fCBJbnRlcm5hbENvbnRyYWN0LkNvbHVtblR5cGUuVW5rbm93bjtcbiAgICByZXR1cm4gSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmNvbHVtblR5cGUuY29udmVydChkZWZpbmVkVmFsdWUpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NhbGN1bGF0ZWRGaWVsZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlzQ2FsY3VsYXRlZEZpZWxkO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0NvbWJpbmVkRmllbGQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0NvbWJpbmVkRmllbGQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR2VuZXJhdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNHZW5lcmF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzR2Vvc3BhdGlhbCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmlzR2Vvc3BhdGlhbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNIaWRkZW4oKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSW5mby5pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9maWVsZEluZm8uaXNQcmVzZW50T25QdWJsaXNoZWREYXRhc291cmNlO1xuICB9XG5cbiAgcHVibGljIGdldCBzZW1hbnRpY1JvbGUoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLnNlbWFudGljUm9sZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YUZvcm1hdCgpOiBDb250cmFjdC5EYXRhRm9ybWF0IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJbmZvLmRhdGFGb3JtYXQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgUGFyYW1ldGVyVmFsdWVUeXBlLCBQZXJpb2RUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlckluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1BhcmFtZXRlcnNTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IERhdGFWYWx1ZUZhY3RvcnkgfSBmcm9tICcuLi9VdGlscy9EYXRhVmFsdWVGYWN0b3J5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uL1V0aWxzL1BhcmFtJztcblxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlckltcGwge1xuICBwcml2YXRlIF9hbGxvd2FibGVWYWx1ZXM6IENvbnRyYWN0LlBhcmFtZXRlckRvbWFpblJlc3RyaWN0aW9uO1xuICBwcml2YXRlIF9nbG9iYWxGaWVsZE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSBfcGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbztcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcGFyYW1ldGVySW5mbzogUGFyYW1ldGVySW5mbyxcbiAgICBwcml2YXRlIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICkge1xuICAgIHRoaXMuc2V0UGFyYW1ldGVySW5mbyhwYXJhbWV0ZXJJbmZvKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJJbmZvLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1cnJlbnRWYWx1ZSgpOiBEYXRhVmFsdWUge1xuICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VQYXJhbWV0ZXJEYXRhVmFsdWUodGhpcy5fcGFyYW1ldGVySW5mby5jdXJyZW50VmFsdWUsIHRoaXMuX3BhcmFtZXRlckluZm8uZGF0YVR5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBEYXRhVHlwZSB7XG4gICAgcmV0dXJuIEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncy5kYXRhVHlwZS5jb252ZXJ0KHRoaXMuX3BhcmFtZXRlckluZm8uZGF0YVR5cGUpO1xuICB9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9nbG9iYWxGaWVsZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFsbG93YWJsZVZhbHVlcygpOiBDb250cmFjdC5QYXJhbWV0ZXJEb21haW5SZXN0cmljdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX2FsbG93YWJsZVZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VWYWx1ZUFzeW5jKG5ld1ZhbHVlOiBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgRGF0ZSk6IFByb21pc2U8RGF0YVZhbHVlPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihuZXdWYWx1ZSwgJ25ld1ZhbHVlJyk7XG5cbiAgICBjb25zdCBjb2VyY2VkVmFsdWUgPSBQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZShuZXdWYWx1ZSk7XG4gICAgY29uc3QgcGFyYW1ldGVyc1NlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8UGFyYW1ldGVyc1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gcGFyYW1ldGVyc1NlcnZpY2UuY2hhbmdlUGFyYW1ldGVyVmFsdWVBc3luYyh0aGlzLl9nbG9iYWxGaWVsZE5hbWUsIGNvZXJjZWRWYWx1ZSkudGhlbigocGFyYW1ldGVySW5mbykgPT4ge1xuICAgICAgdGhpcy5zZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlckluZm8pO1xuICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFZhbHVlO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXRQYXJhbWV0ZXJJbmZvKHBhcmFtZXRlckluZm86IFBhcmFtZXRlckluZm8pOiB2b2lkIHtcbiAgICB0aGlzLl9wYXJhbWV0ZXJJbmZvID0gcGFyYW1ldGVySW5mbztcbiAgICB0aGlzLl9nbG9iYWxGaWVsZE5hbWUgPSBwYXJhbWV0ZXJJbmZvLmZpZWxkTmFtZTtcblxuICAgIGNvbnN0IHR5cGUgPSBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuYWxsb3dhYmxlVmFsdWVzLmNvbnZlcnQocGFyYW1ldGVySW5mby5hbGxvd2FibGVWYWx1ZXNUeXBlKTtcbiAgICBsZXQgbGlzdFZhbHVlczogQXJyYXk8RGF0YVZhbHVlPiB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbWluVmFsdWU6IERhdGFWYWx1ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgbWF4VmFsdWU6IERhdGFWYWx1ZSB8IHVuZGVmaW5lZDtcbiAgICBsZXQgc3RlcFNpemU6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBsZXQgZGF0ZVN0ZXBQZXJpb2Q6IFBlcmlvZFR5cGUgfCB1bmRlZmluZWQ7XG5cbiAgICBpZiAodHlwZSA9PT0gUGFyYW1ldGVyVmFsdWVUeXBlLkxpc3QpIHtcbiAgICAgIGNvbnN0IHZhbHVlcyA9IHBhcmFtZXRlckluZm8uYWxsb3dhYmxlVmFsdWVzIHx8IFtdO1xuICAgICAgbGlzdFZhbHVlcyA9IHZhbHVlcy5tYXAoKHZhbCkgPT4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlUGFyYW1ldGVyRGF0YVZhbHVlKHZhbCwgcGFyYW1ldGVySW5mby5kYXRhVHlwZSkpO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gUGFyYW1ldGVyVmFsdWVUeXBlLlJhbmdlKSB7XG4gICAgICBtaW5WYWx1ZSA9IHBhcmFtZXRlckluZm8ubWluVmFsdWUgJiYgRGF0YVZhbHVlRmFjdG9yeS5NYWtlUGFyYW1ldGVyRGF0YVZhbHVlKHBhcmFtZXRlckluZm8ubWluVmFsdWUsIHBhcmFtZXRlckluZm8uZGF0YVR5cGUpO1xuICAgICAgbWF4VmFsdWUgPSBwYXJhbWV0ZXJJbmZvLm1heFZhbHVlICYmIERhdGFWYWx1ZUZhY3RvcnkuTWFrZVBhcmFtZXRlckRhdGFWYWx1ZShwYXJhbWV0ZXJJbmZvLm1heFZhbHVlLCBwYXJhbWV0ZXJJbmZvLmRhdGFUeXBlKTtcbiAgICAgIHN0ZXBTaXplID0gcGFyYW1ldGVySW5mby5zdGVwU2l6ZTtcbiAgICAgIGRhdGVTdGVwUGVyaW9kID0gcGFyYW1ldGVySW5mby5kYXRlU3RlcFBlcmlvZCAmJiBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZGF0ZVN0ZXBQZXJpb2QuY29udmVydChwYXJhbWV0ZXJJbmZvLmRhdGVTdGVwUGVyaW9kKTtcbiAgICB9XG5cbiAgICB0aGlzLl9hbGxvd2FibGVWYWx1ZXMgPSB7XG4gICAgICB0eXBlOiB0eXBlLFxuICAgICAgYWxsb3dhYmxlVmFsdWVzOiBsaXN0VmFsdWVzLFxuICAgICAgbWluVmFsdWU6IG1pblZhbHVlLFxuICAgICAgbWF4VmFsdWU6IG1heFZhbHVlLFxuICAgICAgc3RlcFNpemU6IHN0ZXBTaXplLFxuICAgICAgZGF0ZVN0ZXBQZXJpb2Q6IGRhdGVTdGVwUGVyaW9kLFxuICAgIH07XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTaGVldFBhdGggfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ2xpZW50SW5mb1NlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9DbGllbnRJbmZvU2VydmljZSc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJzU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1BhcmFtZXRlcnNTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNpemVTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvU2l6ZVNlcnZpY2UnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uL1V0aWxzL1BhcmFtJztcbmltcG9ydCB7IFNoZWV0VXRpbHMgfSBmcm9tICcuLi9VdGlscy9TaGVldFV0aWxzJztcbmltcG9ydCB7IFBhcmFtZXRlckltcGwgfSBmcm9tICcuL1BhcmFtZXRlckltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5cbmludGVyZmFjZSBQYXJ0aWFsU2hlZXRTaXplIHtcbiAgLyoqXG4gICAqIENvbnRhaW5zIGFuIGVudW1lcmF0aW9uIHZhbHVlIG9mIG9uZSBvZiB0aGUgZm9sbG93aW5nOiBBVVRPTUFUSUMsIEVYQUNUTFksIFJBTkdFLCBBVExFQVNULCBhbmQgQVRNT1NULlxuICAgKi9cbiAgcmVhZG9ubHkgYmVoYXZpb3I6IENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiAgVGhpcyBpcyBvbmx5IGRlZmluZWQgd2hlbiBiZWhhdmlvciBpcyBFWEFDVExZLCBSQU5HRSwgb3IgQVRMRUFTVC5cbiAgICovXG4gIHJlYWRvbmx5IG1pblNpemU/OiBQYXJ0aWFsPENvbnRyYWN0LlNpemU+O1xuXG4gIC8qKlxuICAgKiAgVGhpcyBpcyBvbmx5IGRlZmluZWQgd2hlbiBiZWhhdmlvciBpcyBFWEFDVExZLCBSQU5HRSBvciBBVE1PU1QuXG4gICAqL1xuICByZWFkb25seSBtYXhTaXplPzogUGFydGlhbDxDb250cmFjdC5TaXplPjtcbn1cblxuZXhwb3J0IGNsYXNzIFNoZWV0SW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgX3NoZWV0SW5mb0ltcGw6IFNoZWV0SW5mb0ltcGwsXG4gICAgcHJvdGVjdGVkIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBzaGVldFR5cGUoKTogQ29udHJhY3QuU2hlZXRUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0UGF0aCgpOiBTaGVldFBhdGgge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLnNoZWV0UGF0aDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2l6ZSgpOiBDb250cmFjdC5TaXplIHwgQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5zaGVldFNpemU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGhpZGRlbigpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pc0hpZGRlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5pc0hpZGRlbjtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBpc0hpZGRlbiBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLl9zaGVldEluZm9JbXBsLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLmlzQWN0aXZlO1xuICAgIH1cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYGFjdGl2ZSBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgYWN0aXZlKGFjdGl2ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLl9zaGVldEluZm9JbXBsLmlzQWN0aXZlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHRoaXMuX3NoZWV0SW5mb0ltcGwuYWN0aXZlID0gYWN0aXZlO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5kZXgoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5fc2hlZXRJbmZvSW1wbC5pbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2hlZXRJbmZvSW1wbC5pbmRleDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBpbmRleCBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXJsKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuX3NoZWV0SW5mb0ltcGwudXJsICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9zaGVldEluZm9JbXBsLnVybDtcbiAgICB9XG4gICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGB1cmwgbm90IGltcGxlbWVudGVkYCk7XG4gIH1cblxuICBwcml2YXRlIGdldFNoZWV0U2l6ZSgpOiBDb250cmFjdC5TaGVldFNpemUge1xuICAgIGlmICghU2hlZXRVdGlscy5pc1ZhbGlkU2hlZXRTaXplKHRoaXMuc2l6ZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnc2l6ZSBpcyBub3Qgb2YgdHlwZSBTaGVldFNpemUnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zaXplO1xuICB9XG5cbiAgcHVibGljIGZpbmRQYXJhbWV0ZXJBc3luYyhwYXJhbWV0ZXJOYW1lOiBzdHJpbmcpOiBQcm9taXNlPFBhcmFtZXRlckltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHBhcmFtZXRlck5hbWUsICdwYXJhbWV0ZXJOYW1lJyk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFBhcmFtZXRlcnNTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuUGFyYW1ldGVycyk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZmluZFBhcmFtZXRlckJ5TmFtZUFzeW5jKHBhcmFtZXRlck5hbWUpO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmFtZXRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PFBhcmFtZXRlckltcGw+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxQYXJhbWV0ZXJzU2VydmljZT4oU2VydmljZU5hbWVzLlBhcmFtZXRlcnMpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFBhcmFtZXRlcnNGb3JTaGVldEFzeW5jKHRoaXMuc2hlZXRQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VTaXplQXN5bmMobmV3U2l6ZTogQ29udHJhY3QuU2hlZXRTaXplKTogUHJvbWlzZTxDb250cmFjdC5TaGVldFNpemU+IHtcbiAgICBjb25zdCBpbnZhbGlkU2l6ZUVycm9yID0gbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnSW52YWxpZCBzaGVldCBzaXplIHBhcmFtZXRlcicpO1xuICAgIGlmICghbmV3U2l6ZSB8fCAhbmV3U2l6ZS5iZWhhdmlvcikge1xuICAgICAgdGhyb3cgaW52YWxpZFNpemVFcnJvcjtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJ0aWFsU2hlZXRTaXplID0gdGhpcy5ub3JtYWxpemVTaGVldFNpemUobmV3U2l6ZSk7XG5cbiAgICBjb25zdCBpc0F1dG9tYXRpYyA9IHBhcnRpYWxTaGVldFNpemUuYmVoYXZpb3IgPT09IENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkF1dG9tYXRpYztcbiAgICBpZiAoIWlzQXV0b21hdGljICYmICFwYXJ0aWFsU2hlZXRTaXplLm1pblNpemUgJiYgIXBhcnRpYWxTaGVldFNpemUubWF4U2l6ZSkge1xuICAgICAgdGhyb3cgaW52YWxpZFNpemVFcnJvcjtcbiAgICB9XG5cbiAgICBpZiAoIWlzQXV0b21hdGljICYmIHRoaXMuc2hlZXRUeXBlID09PSBDb250cmFjdC5TaGVldFR5cGUuV29ya3NoZWV0KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplQmVoYXZpb3JPbldvcmtzaGVldCxcbiAgICAgICAgJ09ubHkgU2hlZXRTaXplQmVoYXZpb3IuQXV0b21hdGljIGlzIGFsbG93ZWQgb24gV29ya3NoZWV0cycsXG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChpc0F1dG9tYXRpYyAmJiB0aGlzLmdldFNoZWV0U2l6ZSgpLmJlaGF2aW9yID09PSBwYXJ0aWFsU2hlZXRTaXplLmJlaGF2aW9yKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ld1NpemUpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2Nlc3NlZE5ld1NpemUgPSB0aGlzLnByb2Nlc3NOZXdTaXplKHBhcnRpYWxTaGVldFNpemUpO1xuXG4gICAgY29uc3Qgc2l6ZVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U2l6ZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TaXplKTtcbiAgICByZXR1cm4gc2l6ZVNlcnZpY2UuY2hhbmdlU2l6ZUFzeW5jKHRoaXMubmFtZSwgcHJvY2Vzc2VkTmV3U2l6ZSkudGhlbigoKSA9PiB7XG4gICAgICBjb25zdCBjbGllbnRJbmZvU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxDbGllbnRJbmZvU2VydmljZT4oU2VydmljZU5hbWVzLkNsaWVudEluZm8pO1xuXG4gICAgICByZXR1cm4gY2xpZW50SW5mb1NlcnZpY2UuZ2V0Q2xpZW50SW5mb0FzeW5jKCkudGhlbigoYm9vdHN0cmFwSW5mbykgPT4ge1xuICAgICAgICBjb25zdCBzaGVldCA9IGJvb3RzdHJhcEluZm8ucHVibGlzaGVkU2hlZXRzLmZpbmQoKHMpID0+IHMubmFtZSA9PT0gdGhpcy5uYW1lKTtcbiAgICAgICAgaWYgKCFzaGVldCkge1xuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgQ2FuJ3QgZmluZCBzaGVldCB3aXRoIG5hbWUgJHt0aGlzLm5hbWV9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzaGVldFNpemUgPSBTaGVldFV0aWxzLmdldFNoZWV0U2l6ZUZyb21TaXplQ29uc3RyYWludHMoc2hlZXQuc2l6ZUNvbnN0cmFpbnQpO1xuICAgICAgICB0aGlzLl9zaGVldEluZm9JbXBsLnNoZWV0U2l6ZSA9IHNoZWV0U2l6ZTtcblxuICAgICAgICByZXR1cm4gc2hlZXRTaXplO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZVNoZWV0U2l6ZShuZXdTaXplOiBDb250cmFjdC5TaGVldFNpemUpOiBQYXJ0aWFsU2hlZXRTaXplIHtcbiAgICBjb25zdCB7IGJlaGF2aW9yIH0gPSBuZXdTaXplO1xuXG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxDb250cmFjdC5TaGVldFNpemVCZWhhdmlvcj4oYmVoYXZpb3IsIENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLCAnU2hlZXRTaXplQmVoYXZpb3InKTtcblxuICAgIGNvbnN0IG1pblNpemUgPSBTaGVldEltcGwucGFyc2VEaW1lbnNpb25zKG5ld1NpemUubWluU2l6ZSk7XG4gICAgY29uc3QgbWF4U2l6ZSA9IFNoZWV0SW1wbC5wYXJzZURpbWVuc2lvbnMobmV3U2l6ZS5tYXhTaXplKTtcblxuICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplIH07XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NOZXdTaXplKG5ld1NpemU6IFBhcnRpYWxTaGVldFNpemUpOiBDb250cmFjdC5TaGVldFNpemUge1xuICAgIGNvbnN0IHsgYmVoYXZpb3IsIG1pblNpemU6IG1pblNpemVNYXliZSwgbWF4U2l6ZTogbWF4U2l6ZU1heWJlIH0gPSBuZXdTaXplO1xuXG4gICAgY29uc3QgaGFzTWluV2lkdGggPSAhUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQobWluU2l6ZU1heWJlPy53aWR0aCk7XG4gICAgY29uc3QgaGFzTWluSGVpZ2h0ID0gIVBhcmFtLmlzTnVsbE9yVW5kZWZpbmVkKG1pblNpemVNYXliZT8uaGVpZ2h0KTtcbiAgICBjb25zdCBoYXNNYXhXaWR0aCA9ICFQYXJhbS5pc051bGxPclVuZGVmaW5lZChtYXhTaXplTWF5YmU/LndpZHRoKTtcbiAgICBjb25zdCBoYXNNYXhIZWlnaHQgPSAhUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQobWF4U2l6ZU1heWJlPy5oZWlnaHQpO1xuICAgIGNvbnN0IGhhc1ZhbGlkTWluU2l6ZSA9IGhhc01pbldpZHRoICYmIGhhc01pbkhlaWdodDtcbiAgICBjb25zdCBoYXNWYWxpZE1heFNpemUgPSBoYXNNYXhXaWR0aCAmJiBoYXNNYXhIZWlnaHQ7XG5cbiAgICBzd2l0Y2ggKGJlaGF2aW9yKSB7XG4gICAgICBjYXNlIENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkF1dG9tYXRpYzoge1xuICAgICAgICByZXR1cm4geyBiZWhhdmlvciB9O1xuICAgICAgfVxuXG4gICAgICBjYXNlIENvbnRyYWN0LlNoZWV0U2l6ZUJlaGF2aW9yLkF0TW9zdDoge1xuICAgICAgICBpZiAoIW1heFNpemVNYXliZSB8fCAhaGFzVmFsaWRNYXhTaXplKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLk1pc3NpbmdNYXhTaXplLCAnTWlzc2luZyBtYXhTaXplIGZvciBTaGVldFNpemVCZWhhdmlvci5BdE1vc3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1heFNpemUgPSB7IHdpZHRoOiBtYXhTaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1heFNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgIGlmIChtYXhTaXplLndpZHRoIDwgMCB8fCBtYXhTaXplLmhlaWdodCA8IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZFNpemUsICdTaXplIHZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgYmVoYXZpb3IsIG1heFNpemUgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdExlYXN0OiB7XG4gICAgICAgIGlmICghbWluU2l6ZU1heWJlIHx8ICFoYXNWYWxpZE1pblNpemUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuTWlzc2luZ01pblNpemUsICdNaXNzaW5nIG1pblNpemUgZm9yIFNoZWV0U2l6ZUJlaGF2aW9yLkF0TGVhc3QnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG1pblNpemUgPSB7IHdpZHRoOiBtaW5TaXplTWF5YmUud2lkdGghLCBoZWlnaHQ6IG1pblNpemVNYXliZS5oZWlnaHQhIH07XG4gICAgICAgIGlmIChtaW5TaXplLndpZHRoIDwgMCB8fCBtaW5TaXplLmhlaWdodCA8IDApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZFNpemUsICdTaXplIHZhbHVlIGNhbm5vdCBiZSBsZXNzIHRoYW4gemVybycpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgYmVoYXZpb3IsIG1pblNpemUgfTtcbiAgICAgIH1cblxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5SYW5nZToge1xuICAgICAgICBpZiAoIW1pblNpemVNYXliZSB8fCAhbWF4U2l6ZU1heWJlIHx8ICFoYXNWYWxpZE1pblNpemUgfHwgIWhhc1ZhbGlkTWF4U2l6ZSkge1xuICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5NaXNzaW5nTWluTWF4U2l6ZSwgJ01pc3NpbmcgbWluU2l6ZSBvciBtYXhTaXplIGZvciBTaGVldFNpemVCZWhhdmlvci5SYW5nZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgbWluU2l6ZSA9IHsgd2lkdGg6IG1pblNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWluU2l6ZU1heWJlLmhlaWdodCEgfTtcbiAgICAgICAgY29uc3QgbWF4U2l6ZSA9IHsgd2lkdGg6IG1heFNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWF4U2l6ZU1heWJlLmhlaWdodCEgfTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgbWluU2l6ZS53aWR0aCA8IDAgfHxcbiAgICAgICAgICBtaW5TaXplLmhlaWdodCA8IDAgfHxcbiAgICAgICAgICBtYXhTaXplLndpZHRoIDwgMCB8fFxuICAgICAgICAgIG1heFNpemUuaGVpZ2h0IDwgMCB8fFxuICAgICAgICAgIG1pblNpemUud2lkdGggPiBtYXhTaXplLndpZHRoIHx8XG4gICAgICAgICAgbWluU2l6ZS5oZWlnaHQgPiBtYXhTaXplLmhlaWdodFxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuSW52YWxpZFNpemUsICdNaXNzaW5nIG1pblNpemUgb3IgbWF4U2l6ZSBmb3IgU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplIH07XG4gICAgICB9XG5cbiAgICAgIGNhc2UgQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuRXhhY3RseToge1xuICAgICAgICBpZiAobWluU2l6ZU1heWJlICYmIG1heFNpemVNYXliZSkge1xuICAgICAgICAgIGlmIChoYXNWYWxpZE1pblNpemUgJiYgaGFzVmFsaWRNYXhTaXplKSB7XG4gICAgICAgICAgICBjb25zdCBtaW5TaXplID0geyB3aWR0aDogbWluU2l6ZU1heWJlLndpZHRoISwgaGVpZ2h0OiBtaW5TaXplTWF5YmUuaGVpZ2h0ISB9O1xuICAgICAgICAgICAgY29uc3QgbWF4U2l6ZSA9IHsgd2lkdGg6IG1heFNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWF4U2l6ZU1heWJlLmhlaWdodCEgfTtcblxuICAgICAgICAgICAgaWYgKG1pblNpemUud2lkdGggIT09IG1heFNpemUud2lkdGggfHwgbWluU2l6ZS5oZWlnaHQgIT09IG1heFNpemUuaGVpZ2h0KSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbnZhbGlkU2l6ZSwgJ0NvbmZsaWN0aW5nIHNpemUgdmFsdWVzIGZvciBTaGVldFNpemVCZWhhdmlvci5FeGFjdGx5Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc1ZhbGlkTWluU2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgbWluU2l6ZSA9IHsgd2lkdGg6IG1pblNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWluU2l6ZU1heWJlLmhlaWdodCEgfTtcbiAgICAgICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplOiBtaW5TaXplIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGhhc1ZhbGlkTWF4U2l6ZSkge1xuICAgICAgICAgICAgY29uc3QgbWF4U2l6ZSA9IHsgd2lkdGg6IG1heFNpemVNYXliZS53aWR0aCEsIGhlaWdodDogbWF4U2l6ZU1heWJlLmhlaWdodCEgfTtcbiAgICAgICAgICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplOiBtYXhTaXplLCBtYXhTaXplIH07XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkludmFsaWRTaXplLCAnSW52YWxpZCBzaGVldCBzaXplIHBhcmFtZXRlcicpO1xuICAgICAgfVxuXG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgVW5zdXBwb3J0ZWQgc2hlZXQgc2l6ZSBiZWhhdmlvcjogJHtiZWhhdmlvcn1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBwYXJzZURpbWVuc2lvbnMgPSAoc2l6ZTogQ29udHJhY3QuU2l6ZSB8IHVuZGVmaW5lZCk6IFBhcnRpYWw8Q29udHJhY3QuU2l6ZT4gPT4ge1xuICAgIGNvbnN0IGVtcHR5ID0geyB3aWR0aDogdW5kZWZpbmVkLCBoZWlnaHQ6IHVuZGVmaW5lZCB9O1xuXG4gICAgaWYgKCFzaXplKSB7XG4gICAgICByZXR1cm4gZW1wdHk7XG4gICAgfVxuXG4gICAgY29uc3QgeyBzdWNjZXNzOiB3aWR0aFBhcnNlZCwgcGFyc2VkOiBwYXJzZWRXaWR0aCB9ID0gUGFyYW0udHJ5UGFyc2VOdW1iZXIoc2l6ZS53aWR0aCk7XG4gICAgY29uc3QgeyBzdWNjZXNzOiBoZWlnaHRQYXJzZWQsIHBhcnNlZDogcGFyc2VkSGVpZ2h0IH0gPSBQYXJhbS50cnlQYXJzZU51bWJlcihzaXplLmhlaWdodCk7XG5cbiAgICBpZiAod2lkdGhQYXJzZWQgJiYgaGVpZ2h0UGFyc2VkKSB7XG4gICAgICByZXR1cm4geyB3aWR0aDogcGFyc2VkV2lkdGghLCBoZWlnaHQ6IHBhcnNlZEhlaWdodCEgfTtcbiAgICB9XG5cbiAgICBpZiAod2lkdGhQYXJzZWQpIHtcbiAgICAgIHJldHVybiB7IHdpZHRoOiBwYXJzZWRXaWR0aCEgfTtcbiAgICB9XG5cbiAgICBpZiAoaGVpZ2h0UGFyc2VkKSB7XG4gICAgICByZXR1cm4geyBoZWlnaHQ6IHBhcnNlZEhlaWdodCEgfTtcbiAgICB9XG5cbiAgICByZXR1cm4gZW1wdHk7XG4gIH07XG59XG4iLCJpbXBvcnQgeyBTaGVldFNpemUgYXMgRW1iZWRkaW5nU2hlZXRTaXplLCBTaXplIGFzIEV4dGVuc2lvblNoZWV0U2l6ZSwgU2hlZXRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNoZWV0UGF0aCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBTaGVldEluZm9JbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX25hbWU6IHN0cmluZyxcbiAgICBwcml2YXRlIF9zaGVldFR5cGU6IFNoZWV0VHlwZSxcbiAgICBwcml2YXRlIF9zaGVldFNpemU6IEV4dGVuc2lvblNoZWV0U2l6ZSB8IEVtYmVkZGluZ1NoZWV0U2l6ZSxcbiAgICBwcml2YXRlIF9pbmRleD86IG51bWJlcixcbiAgICBwcml2YXRlIF9pc0FjdGl2ZT86IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNIaWRkZW4/OiBib29sZWFuLFxuICAgIHByaXZhdGUgX3VybD86IHN0cmluZyxcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIHNldCBuYW1lKHNoZWV0TmFtZTogc3RyaW5nKSB7XG4gICAgdGhpcy5fbmFtZSA9IHNoZWV0TmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRTaXplKCk6IEV4dGVuc2lvblNoZWV0U2l6ZSB8IEVtYmVkZGluZ1NoZWV0U2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0U2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBzZXQgc2hlZXRTaXplKHZhbHVlOiBFeHRlbnNpb25TaGVldFNpemUgfCBFbWJlZGRpbmdTaGVldFNpemUpIHtcbiAgICB0aGlzLl9zaGVldFNpemUgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRUeXBlKCk6IFNoZWV0VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgc2hlZXRQYXRoKCk6IFNoZWV0UGF0aCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNoZWV0TmFtZTogdGhpcy5uYW1lLFxuICAgICAgaXNEYXNoYm9hcmQ6IHRoaXMuc2hlZXRUeXBlID09PSBTaGVldFR5cGUuRGFzaGJvYXJkLFxuICAgICAgLy8gVE9ETyAtIFN0b3JpZXNcbiAgICB9O1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pbmRleDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBY3RpdmUoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQWN0aXZlO1xuICB9XG5cbiAgcHVibGljIHNldCBhY3RpdmUoYWN0aXZlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNBY3RpdmUgPSBhY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzSGlkZGVuKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9pc0hpZGRlbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXJsKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VybDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2luZ2xlRXZlbnRNYW5hZ2VyIH0gZnJvbSAnLi4vU2luZ2xlRXZlbnRNYW5hZ2VyJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIFNpbmdsZUV2ZW50TWFuYWdlciBpbnRlcmZhY2UgZm9yIGEgc2luZ2xlIHR5cGUgb2YgVGFibGVhdSBldmVudFxuICpcbiAqIEB0ZW1wbGF0ZSBURXZlbnRUeXBlIFRoZSBUYWJsZWF1IGV2ZW50IHR5cGUgdGhpcyBjbGFzcyBzcGVjaWFsaXplc1xuICovXG5leHBvcnQgY2xhc3MgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxURXZlbnRUeXBlIGV4dGVuZHMgQ29udHJhY3QuVGFibGVhdUV2ZW50PiBpbXBsZW1lbnRzIFNpbmdsZUV2ZW50TWFuYWdlciB7XG4gIHByaXZhdGUgX2V2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZTtcbiAgcHJpdmF0ZSBfaGFuZGxlcnM6IEFycmF5PChldmVudE9iajogVEV2ZW50VHlwZSkgPT4gdm9pZD47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGV2ZW50VHlwZTogVGFibGVhdUV2ZW50VHlwZSkge1xuICAgIHRoaXMuX2V2ZW50VHlwZSA9IGV2ZW50VHlwZTtcbiAgICB0aGlzLl9oYW5kbGVycyA9IFtdO1xuICB9XG5cbiAgcHVibGljIGdldCBldmVudFR5cGUoKTogVGFibGVhdUV2ZW50VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2V2ZW50VHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRFdmVudExpc3RlbmVyKGhhbmRsZXI6IChldmVudE9iajogVEV2ZW50VHlwZSkgPT4gdm9pZCk6IENvbnRyYWN0LlRhYmxlYXVFdmVudFVucmVnaXN0ZXJGbiB7XG4gICAgdGhpcy5faGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKGhhbmRsZXIpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUV2ZW50TGlzdGVuZXIoaGFuZGxlcjogKGV2ZW50T2JqOiBURXZlbnRUeXBlKSA9PiB2b2lkKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYmVmb3JlQ291bnQgPSB0aGlzLl9oYW5kbGVycy5sZW5ndGg7XG4gICAgdGhpcy5faGFuZGxlcnMgPSB0aGlzLl9oYW5kbGVycy5maWx0ZXIoKGgpID0+IGggIT09IGhhbmRsZXIpO1xuICAgIHJldHVybiBiZWZvcmVDb3VudCA+IHRoaXMuX2hhbmRsZXJzLmxlbmd0aDtcbiAgfVxuXG4gIHB1YmxpYyB0cmlnZ2VyRXZlbnQoZXZlbnRHZW5lcmF0b3I6ICgpID0+IFRFdmVudFR5cGUpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGhhbmRsZXIgb2YgdGhpcy5faGFuZGxlcnMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IGV2ZW50TW9kZWwgPSBldmVudEdlbmVyYXRvcigpO1xuICAgICAgICBoYW5kbGVyKGV2ZW50TW9kZWwpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyBTaW5jZSB0aGlzIGhhbmRsZXIgY291bGQgYmUgb3V0c2lkZSBvdXIgY29udHJvbCwganVzdCBjYXRjaCBhbnl0aGluZyBpdCB0aHJvd3MgYW5kIGNvbnRpbnVlIG9uXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNoZWV0SW5mbywgU3RvcnlNb2RlbCwgU3RvcnlQb2ludE1vZGVsIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFN0b3J5QWN0aXZhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9TdG9yeUFjdGl2YXRpb25TZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgU2hvcnRMaXZlZERlZmVycmVkIH0gZnJvbSAnLi4vVXRpbHMvU2hvcnRMaXZlZERlZmVycmVkJztcbmltcG9ydCB7IFNoZWV0SW1wbCB9IGZyb20gJy4vU2hlZXRJbXBsJztcbmltcG9ydCB7IFNoZWV0SW5mb0ltcGwgfSBmcm9tICcuL1NoZWV0SW5mb0ltcGwnO1xuaW1wb3J0IHsgU3RvcnlQb2ludEltcGwgfSBmcm9tICcuL1N0b3J5UG9pbnRJbXBsJztcbmltcG9ydCB7IFN0b3J5UG9pbnRJbmZvSW1wbCB9IGZyb20gJy4vU3RvcnlQb2ludEluZm9JbXBsJztcblxuZXhwb3J0IGNsYXNzIFN0b3J5SW1wbCBleHRlbmRzIFNoZWV0SW1wbCB7XG4gIHByaXZhdGUgX2FjdGl2ZVN0b3J5UG9pbnRJbXBsOiBTdG9yeVBvaW50SW1wbDtcbiAgcHJpdmF0ZSBfc3RvcnlQb2ludEluZm9JbXBsczogQXJyYXk8U3RvcnlQb2ludEluZm9JbXBsPiA9IFtdO1xuICBwcml2YXRlIF9kZWZlcnJlZDogU2hvcnRMaXZlZERlZmVycmVkPFN0b3J5UG9pbnRJbXBsPjtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIF9zaGVldEluZm9JbXBsOiBTaGVldEluZm9JbXBsLFxuICAgIHN0b3J5TW9kZWw6IFN0b3J5TW9kZWwsXG4gICAgcHJpdmF0ZSBfcHVibGlzaGVkU2hlZXRJbmZvczogQXJyYXk8U2hlZXRJbmZvPixcbiAgICBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgKSB7XG4gICAgc3VwZXIoX3NoZWV0SW5mb0ltcGwsIF9yZWdpc3RyeUlkKTtcbiAgICB0aGlzLl9kZWZlcnJlZCA9IG5ldyBTaG9ydExpdmVkRGVmZXJyZWQ8U3RvcnlQb2ludEltcGw+KCk7XG4gICAgdGhpcy5pbml0aWFsaXplU3Rvcnkoc3RvcnlNb2RlbCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTdG9yeShzdG9yeU1vZGVsOiBTdG9yeU1vZGVsKSB7XG4gICAgc3RvcnlNb2RlbC5zdG9yeVBvaW50cy5mb3JFYWNoKChzdG9yeVBvaW50TW9kZWwpID0+IHtcbiAgICAgIGNvbnN0IGlzQWN0aXZlID0gc3RvcnlQb2ludE1vZGVsLmluZGV4ID09PSBzdG9yeU1vZGVsLmFjdGl2ZVN0b3J5UG9pbnRJbmRleDtcbiAgICAgIGNvbnN0IHN0b3J5UG9pbnRJbmZvSW1wbCA9IG5ldyBTdG9yeVBvaW50SW5mb0ltcGwoXG4gICAgICAgIHN0b3J5UG9pbnRNb2RlbC5jYXB0aW9uLFxuICAgICAgICBzdG9yeVBvaW50TW9kZWwuaW5kZXgsXG4gICAgICAgIHN0b3J5UG9pbnRNb2RlbC5zdG9yeVBvaW50SWQsXG4gICAgICAgIGlzQWN0aXZlLFxuICAgICAgICBzdG9yeVBvaW50TW9kZWwudXBkYXRlZCxcbiAgICAgICAgdGhpcyxcbiAgICAgICk7XG4gICAgICB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzLnB1c2goc3RvcnlQb2ludEluZm9JbXBsKTtcblxuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsID0gbmV3IFN0b3J5UG9pbnRJbXBsKFxuICAgICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbCxcbiAgICAgICAgICB0aGlzLl9wdWJsaXNoZWRTaGVldEluZm9zLFxuICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICAgICAgc3RvcnlQb2ludE1vZGVsLmNvbnRhaW5lZFNoZWV0SW5mbyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlU3RvcnlJbmZvKGluZGV4OiBudW1iZXIsIHN0b3J5UG9pbnRNb2RlbDogU3RvcnlQb2ludE1vZGVsKSB7XG4gICAgaWYgKCF0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHN0b3J5SW5mb0ltcGwgPSB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzW2luZGV4XTtcbiAgICBpZiAoc3RvcnlJbmZvSW1wbC5zdG9yeVBvaW50SWQgIT09IHN0b3J5UG9pbnRNb2RlbC5zdG9yeVBvaW50SWQpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIENvbnRyYWN0LkVtYmVkZGluZ0Vycm9yQ29kZXMuU3RvcnlQb2ludElkTWlzbWF0Y2gsXG4gICAgICAgIGBXZSBzaG91bGQgbm90IGJlIHVwZGF0aW5nIGEgc3RvcnkgcG9pbnQgd2hlbiB0aGUgSURzIGRvbid0IG1hdGNoLiBFeGlzdGluZyBzdG9yeVBvaW50SUQ9JHtzdG9yeUluZm9JbXBsLnN0b3J5UG9pbnRJZH0sIG5ld1N0b3J5UG9pbnRJRD0ke3N0b3J5UG9pbnRNb2RlbC5zdG9yeVBvaW50SWR9YCxcbiAgICAgICk7XG4gICAgfVxuICAgIHN0b3J5SW5mb0ltcGwuY2FwdGlvbiA9IHN0b3J5UG9pbnRNb2RlbC5jYXB0aW9uO1xuICAgIHN0b3J5SW5mb0ltcGwudXBkYXRlZCA9IHN0b3J5UG9pbnRNb2RlbC51cGRhdGVkO1xuXG4gICAgaWYgKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLnN0b3J5UG9pbnRJZCA9PT0gc3RvcnlQb2ludE1vZGVsLnN0b3J5UG9pbnRJZCkge1xuICAgICAgdGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwudXBkYXRlZCA9IHN0b3J5SW5mb0ltcGwudXBkYXRlZDtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdXBkYXRlU3Rvcnkoc3RvcnlQb2ludE1vZGVsOiBTdG9yeVBvaW50TW9kZWwpIHtcbiAgICBpZiAoIXRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbHMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzLmZvckVhY2goKHN0b3J5UG9pbnRJbmZvSW1wbCkgPT4ge1xuICAgICAgY29uc3QgaXNBY3RpdmUgPSBzdG9yeVBvaW50SW5mb0ltcGwuc3RvcnlQb2ludElkID09PSBzdG9yeVBvaW50TW9kZWwuc3RvcnlQb2ludElkO1xuICAgICAgaWYgKGlzQWN0aXZlKSB7XG4gICAgICAgIC8vIHVwZGF0ZSB0aGUgc3RhdGVcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLmNhcHRpb24gPSBzdG9yeVBvaW50TW9kZWwuY2FwdGlvbjtcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLmluZGV4ID0gc3RvcnlQb2ludE1vZGVsLmluZGV4O1xuICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwuYWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgc3RvcnlQb2ludEluZm9JbXBsLnVwZGF0ZWQgPSBzdG9yeVBvaW50TW9kZWwudXBkYXRlZDtcblxuICAgICAgICAvLyByZS1pbml0aWFsaXplIGFjdGl2ZVN0b3J5UG9pbnRJbXBsXG4gICAgICAgIHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsID0gbmV3IFN0b3J5UG9pbnRJbXBsKFxuICAgICAgICAgIHN0b3J5UG9pbnRJbmZvSW1wbCxcbiAgICAgICAgICB0aGlzLl9wdWJsaXNoZWRTaGVldEluZm9zLFxuICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5SWQsXG4gICAgICAgICAgc3RvcnlQb2ludE1vZGVsLmNvbnRhaW5lZFNoZWV0SW5mbyxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHNldCBvbGQgb25lcyB0byBmYWxzZVxuICAgICAgICBzdG9yeVBvaW50SW5mb0ltcGwuYWN0aXZlID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5hY3RpdmVTdG9yeVBvaW50KSB7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZXNvbHZlKHRoaXMuYWN0aXZlU3RvcnlQb2ludCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBhY3RpdmVTdG9yeVBvaW50KCk6IFN0b3J5UG9pbnRJbXBsIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0b3J5UG9pbnRzSW5mbygpOiBBcnJheTxTdG9yeVBvaW50SW5mb0ltcGw+IHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBscztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBY3RpdmUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0SW5mb0ltcGwuYWN0aXZlO1xuICB9XG5cbiAgcHVibGljIGdldCBpc0hpZGRlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLl9zaGVldEluZm9JbXBsLmlzSGlkZGVuO1xuICB9XG5cbiAgcHVibGljIGFjdGl2YXRlTmV4dFN0b3J5UG9pbnRBc3luYygpOiBQcm9taXNlPFN0b3J5UG9pbnRJbXBsPiB7XG4gICAgaWYgKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLmluZGV4ID09PSB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzLmxlbmd0aCAtIDEpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwpO1xuICAgIH1cblxuICAgIGxldCBwcm9taXNlID0gdGhpcy5fZGVmZXJyZWQuZ2V0TmV3UHJvbWlzZU9yVGhyb3dJZkJ1c3koKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U3RvcnlBY3RpdmF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlN0b3J5QWN0aXZhdGlvbik7XG4gICAgc2VydmljZS5hY3RpdmF0ZU5leHRTdG9yeVBvaW50QXN5bmMoKTtcbiAgICByZXR1cm4gcHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludEFzeW5jKCk6IFByb21pc2U8U3RvcnlQb2ludEltcGw+IHtcbiAgICBpZiAodGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwuaW5kZXggPT09IDApIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fYWN0aXZlU3RvcnlQb2ludEltcGwpO1xuICAgIH1cblxuICAgIGxldCBwcm9taXNlID0gdGhpcy5fZGVmZXJyZWQuZ2V0TmV3UHJvbWlzZU9yVGhyb3dJZkJ1c3koKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8U3RvcnlBY3RpdmF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLlN0b3J5QWN0aXZhdGlvbik7XG4gICAgc2VydmljZS5hY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludEFzeW5jKCk7XG4gICAgcmV0dXJuIHByb21pc2U7XG4gIH1cblxuICBwdWJsaWMgYWN0aXZhdGVTdG9yeVBvaW50QXN5bmMoaW5kZXg6IG51bWJlcik6IFByb21pc2U8U3RvcnlQb2ludEltcGw+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGluZGV4LCAnaW5kZXgnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShpbmRleCwgJ251bWJlcicsICdpbmRleCcpO1xuXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkluZGV4T3V0T2ZSYW5nZSwgJ1RoZSBpbmRleCBwYXNzZWQgdG8gdGhpcyBjb21tYW5kIGlzIG91dCBvZiByYW5nZS4nKTtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPT09IHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsLmluZGV4KSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2FjdGl2ZVN0b3J5UG9pbnRJbXBsKTtcbiAgICB9XG5cbiAgICBsZXQgcHJvbWlzZSA9IHRoaXMuX2RlZmVycmVkLmdldE5ld1Byb21pc2VPclRocm93SWZCdXN5KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFN0b3J5QWN0aXZhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TdG9yeUFjdGl2YXRpb24pO1xuICAgIHNlcnZpY2UuYWN0aXZhdGVTdG9yeVBvaW50QXN5bmMoaW5kZXgpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgcHVibGljIHJldmVydFN0b3J5UG9pbnRBc3luYyhpbmRleDogbnVtYmVyKTogUHJvbWlzZTxTdG9yeVBvaW50SW5mb0ltcGw+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGluZGV4LCAnaW5kZXgnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShpbmRleCwgJ251bWJlcicsICdpbmRleCcpO1xuXG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGxzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FbWJlZGRpbmdFcnJvckNvZGVzLkluZGV4T3V0T2ZSYW5nZSwgJ1RoZSBpbmRleCBwYXNzZWQgdG8gdGhpcyBjb21tYW5kIGlzIG91dCBvZiByYW5nZS4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFN0b3J5QWN0aXZhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TdG9yeUFjdGl2YXRpb24pO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UucmV2ZXJ0U3RvcnlQb2ludEFzeW5jKGluZGV4KS50aGVuPFN0b3J5UG9pbnRJbmZvSW1wbD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLnVwZGF0ZVN0b3J5SW5mbyhyZXNwb25zZS5pbmRleCwgcmVzcG9uc2UpO1xuICAgICAgY29uc3Qgc3RvcnlQb2ludEluZm9JbXBsID0gbmV3IFN0b3J5UG9pbnRJbmZvSW1wbChcbiAgICAgICAgcmVzcG9uc2UuY2FwdGlvbixcbiAgICAgICAgcmVzcG9uc2UuaW5kZXgsXG4gICAgICAgIHJlc3BvbnNlLnN0b3J5UG9pbnRJZCxcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIHJlc3BvbnNlLnVwZGF0ZWQsXG4gICAgICAgIHRoaXMsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHN0b3J5UG9pbnRJbmZvSW1wbDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclBlbmRpbmdQcm9taXNlcygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZGVmZXJyZWQpIHtcbiAgICAgIHRoaXMuX2RlZmVycmVkLnJlamVjdCgnQWxsIHBlbmRpbmcgcHJvbWlzZXMgY2xlYXJlZCcpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IENvbnRhaW5lZFNoZWV0SW5mb01vZGVsLCBTaGVldEluZm8sIFNoZWV0UGF0aCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFNoZWV0VXRpbHMgfSBmcm9tICcuLi9VdGlscy9TaGVldFV0aWxzJztcbmltcG9ydCB7IERhc2hib2FyZEltcGwgfSBmcm9tICcuL0Rhc2hib2FyZEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9TaGVldEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5pbXBvcnQgeyBTdG9yeUltcGwgfSBmcm9tICcuL1N0b3J5SW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW5mb0ltcGwgfSBmcm9tICcuL1N0b3J5UG9pbnRJbmZvSW1wbCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRJbXBsIH0gZnJvbSAnLi9Xb3Jrc2hlZXRJbXBsJztcblxuZXhwb3J0IGNsYXNzIFN0b3J5UG9pbnRJbXBsIHtcbiAgcHJpdmF0ZSBfY29udGFpbmVkU2hlZXRJbXBsOiBTaGVldEltcGw7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3N0b3J5UG9pbnRJbmZvSW1wbDogU3RvcnlQb2ludEluZm9JbXBsLFxuICAgIHNoZWV0SW5mb3M6IEFycmF5PFNoZWV0SW5mbz4sXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIGNvbnRhaW5lZFNoZWV0SW5mbz86IENvbnRhaW5lZFNoZWV0SW5mb01vZGVsLFxuICApIHtcbiAgICBpZiAoY29udGFpbmVkU2hlZXRJbmZvKSB7XG4gICAgICB0aGlzLl9jb250YWluZWRTaGVldEltcGwgPSB0aGlzLmNyZWF0ZUNvbnRhaW5lZFNoZWV0KGNvbnRhaW5lZFNoZWV0SW5mbywgc2hlZXRJbmZvcywgcmVnaXN0cnlJZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGwuaW5kZXg7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLmNhcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLmFjdGl2ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdXBkYXRlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLnVwZGF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgc2V0IHVwZGF0ZWQodXBkYXRlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX3N0b3J5UG9pbnRJbmZvSW1wbC51cGRhdGVkID0gdXBkYXRlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50U3RvcnkoKTogU3RvcnlJbXBsIHtcbiAgICByZXR1cm4gdGhpcy5fc3RvcnlQb2ludEluZm9JbXBsLnBhcmVudFN0b3J5O1xuICB9XG5cbiAgcHVibGljIGdldCBjb250YWluZWRTaGVldCgpOiBTaGVldEltcGwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9jb250YWluZWRTaGVldEltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHN0b3J5UG9pbnRJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9zdG9yeVBvaW50SW5mb0ltcGwuc3RvcnlQb2ludElkO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVDb250YWluZWRTaGVldChjb250YWluZWRTaGVldEluZm86IENvbnRhaW5lZFNoZWV0SW5mb01vZGVsLCBzaGVldEluZm9zOiBBcnJheTxTaGVldEluZm8+LCByZWdpc3RyeUlkOiBudW1iZXIpOiBTaGVldEltcGwge1xuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0SWR4ID0gLTE7XG5cbiAgICBjb25zdCBwdWJsaXNoZWRTaGVldEluZm8gPSBTaGVldFV0aWxzLmdldFB1Ymxpc2hlZFNoZWV0SW5mb0J5TmFtZShjb250YWluZWRTaGVldEluZm8ubmFtZSwgc2hlZXRJbmZvcyk7XG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRTaXplID0gU2hlZXRVdGlscy5jcmVhdGVBdXRvbWF0aWNTaXplKCk7XG4gICAgY29uc3QgaXNDb250YWluZWRTaGVldEhpZGRlbiA9IHB1Ymxpc2hlZFNoZWV0SW5mbyA9PT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGNvbnRhaW5lZFNoZWV0VXJsID0gcHVibGlzaGVkU2hlZXRJbmZvID8gcHVibGlzaGVkU2hlZXRJbmZvLnVybCA6ICcnO1xuICAgIC8vIENvbnRhaW5lZCBzaGVldHMgYXJlbid0IGFjdGl2ZSAtIHRoZSBjb250YWluaW5nIHNoZWV0IGlzIGFjdGl2ZS5cbiAgICBjb25zdCBjb250YWluZWRTaGVldEFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgY29uc3QgY29udGFpbmVkU2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKFxuICAgICAgY29udGFpbmVkU2hlZXRJbmZvLm5hbWUsXG4gICAgICBTaGVldFV0aWxzLmdldFNoZWV0VHlwZUVudW0oY29udGFpbmVkU2hlZXRJbmZvLnNoZWV0VHlwZSksXG4gICAgICBjb250YWluZWRTaGVldFNpemUsXG4gICAgICBjb250YWluZWRTaGVldElkeCxcbiAgICAgIGNvbnRhaW5lZFNoZWV0QWN0aXZlLFxuICAgICAgaXNDb250YWluZWRTaGVldEhpZGRlbixcbiAgICAgIGNvbnRhaW5lZFNoZWV0VXJsLFxuICAgICk7XG5cbiAgICBsZXQgc2hlZXRJbXBsOiBTaGVldEltcGw7XG4gICAgc3dpdGNoIChjb250YWluZWRTaGVldEluZm9JbXBsLnNoZWV0VHlwZSkge1xuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFR5cGUuV29ya3NoZWV0OiB7XG4gICAgICAgIGNvbnN0IHZpeklkOiBWaXN1YWxJZCA9IHtcbiAgICAgICAgICB3b3Jrc2hlZXQ6IGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwubmFtZSxcbiAgICAgICAgfTtcblxuICAgICAgICBzaGVldEltcGwgPSBuZXcgV29ya3NoZWV0SW1wbChjb250YWluZWRTaGVldEluZm9JbXBsLCByZWdpc3RyeUlkLCB2aXpJZCwgbnVsbCwgdGhpcyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSBDb250cmFjdC5TaGVldFR5cGUuRGFzaGJvYXJkOiB7XG4gICAgICAgIGNvbnN0IHNoZWV0UGF0aDogU2hlZXRQYXRoID0ge1xuICAgICAgICAgIHNoZWV0TmFtZTogY29udGFpbmVkU2hlZXRJbmZvSW1wbC5uYW1lLFxuICAgICAgICAgIGlzRGFzaGJvYXJkOiB0cnVlLFxuICAgICAgICB9O1xuXG4gICAgICAgIHNoZWV0SW1wbCA9IG5ldyBEYXNoYm9hcmRJbXBsKGNvbnRhaW5lZFNoZWV0SW5mb0ltcGwsIGNvbnRhaW5lZFNoZWV0SW5mby5kYXNoYm9hcmRab25lcywgc2hlZXRQYXRoLCByZWdpc3RyeUlkLCB0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5TZXJ2ZXJFcnJvciwgJ0ludmFsaWQgU2hlZXRUeXBlJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHNoZWV0SW1wbDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU3RvcnlJbXBsIH0gZnJvbSAnLi9TdG9yeUltcGwnO1xuXG5leHBvcnQgY2xhc3MgU3RvcnlQb2ludEluZm9JbXBsIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2NhcHRpb246IHN0cmluZyxcbiAgICBwcml2YXRlIF9pbmRleDogbnVtYmVyLFxuICAgIHByaXZhdGUgX3N0b3J5UG9pbnRJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX2FjdGl2ZTogYm9vbGVhbixcbiAgICBwcml2YXRlIF91cGRhdGVkOiBib29sZWFuLFxuICAgIHByaXZhdGUgX3BhcmVudFN0b3J5SW1wbDogU3RvcnlJbXBsLFxuICApIHt9XG5cbiAgcHVibGljIGdldCBjYXB0aW9uKCkge1xuICAgIHJldHVybiB0aGlzLl9jYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIHNldCBjYXB0aW9uKGNhcHRpb246IHN0cmluZykge1xuICAgIHRoaXMuX2NhcHRpb24gPSBjYXB0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gIH1cblxuICBwdWJsaWMgc2V0IGluZGV4KGluZGV4OiBudW1iZXIpIHtcbiAgICB0aGlzLl9pbmRleCA9IGluZGV4O1xuICB9XG5cbiAgcHVibGljIGdldCBzdG9yeVBvaW50SWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3N0b3J5UG9pbnRJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLl9hY3RpdmU7XG4gIH1cblxuICBwdWJsaWMgc2V0IGFjdGl2ZShpc0FjdGl2ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX2FjdGl2ZSA9IGlzQWN0aXZlO1xuICB9XG5cbiAgcHVibGljIGdldCB1cGRhdGVkKCkge1xuICAgIHJldHVybiB0aGlzLl91cGRhdGVkO1xuICB9XG5cbiAgcHVibGljIHNldCB1cGRhdGVkKGlzVXBkYXRlZDogYm9vbGVhbikge1xuICAgIHRoaXMuX3VwZGF0ZWQgPSBpc1VwZGF0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHBhcmVudFN0b3J5KCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeUltcGw7XG4gIH1cbn1cbiIsImV4cG9ydCBjbGFzcyBXb3JrYm9va0ltcGwge31cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlNZW51VHlwZSxcbiAgQ29udGV4dE1lbnVPcHRpb25zLFxuICBEYXRlUmFuZ2VUeXBlLFxuICBFcnJvckNvZGVzLFxuICBGaWx0ZXJOdWxsT3B0aW9uLFxuICBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgUGVyaW9kVHlwZSxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgU2hhcmVkRXJyb3JDb2RlcyxcbiAgVG9vbHRpcENvbnRleHQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU2NoZW1hLCBEYXRhU291cmNlIGFzIERhdGFTb3VyY2VJbmZvLCBWaXN1YWxJZCwgV29ya3NoZWV0RGF0YVNvdXJjZUluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNvdXJjZSB9IGZyb20gJy4uL0RhdGFTb3VyY2UnO1xuaW1wb3J0IHsgTG9naWNhbFRhYmxlIH0gZnJvbSAnLi4vTG9naWNhbFRhYmxlJztcbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvQWNjZXNzaWJpbGl0eVNlcnZpY2UnO1xuaW1wb3J0IHsgQW5ub3RhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9Bbm5vdGF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBEYXRhU291cmNlU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0RhdGFTb3VyY2VTZXJ2aWNlJztcbmltcG9ydCB7IEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgR2V0RGF0YVNlcnZpY2UsIEdldERhdGFUeXBlIH0gZnJvbSAnLi4vU2VydmljZXMvR2V0RGF0YVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL1NlbGVjdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgVmlzdWFsTW9kZWxTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvVmlzdWFsTW9kZWxTZXJ2aWNlJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkSW1wbCB9IGZyb20gJy4vRGFzaGJvYXJkSW1wbCc7XG5pbXBvcnQgeyBEYXRhU291cmNlSW1wbCB9IGZyb20gJy4vRGF0YVNvdXJjZUltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbXBsIH0gZnJvbSAnLi9TaGVldEltcGwnO1xuaW1wb3J0IHsgU2hlZXRJbmZvSW1wbCB9IGZyb20gJy4vU2hlZXRJbmZvSW1wbCc7XG5pbXBvcnQgeyBTdG9yeVBvaW50SW1wbCB9IGZyb20gJy4vU3RvcnlQb2ludEltcGwnO1xuXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0SW1wbCBleHRlbmRzIFNoZWV0SW1wbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBzaGVldEluZm9JbXBsOiBTaGVldEluZm9JbXBsLFxuICAgIF9yZWdpc3RyeUlkOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIHByaXZhdGUgX3BhcmVudERhc2hib2FyZEltcGw6IERhc2hib2FyZEltcGwgfCBudWxsLFxuICAgIHByaXZhdGUgX3BhcmVudFN0b3J5UG9pbnRJbXBsOiBTdG9yeVBvaW50SW1wbCB8IG51bGwsXG4gICAgcHJpdmF0ZSBfYmFja2dyb3VuZENvbG9yOiBzdHJpbmcgfCBudWxsID0gbnVsbCxcbiAgICBwcml2YXRlIF9mb3JtYXR0aW5nOiBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nIHwgbnVsbCA9IG51bGwsXG4gICkge1xuICAgIHN1cGVyKHNoZWV0SW5mb0ltcGwsIF9yZWdpc3RyeUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50RGFzaGJvYXJkKCk6IERhc2hib2FyZEltcGwgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFyZW50U3RvcnlQb2ludCgpOiBTdG9yeVBvaW50SW1wbCB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdmlzdWFsSWQoKTogVmlzdWFsSWQge1xuICAgIHJldHVybiB0aGlzLl92aXN1YWxJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRNYXhQYWdlUm93TGltaXQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gMTAwMDA7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGJhY2tncm91bmRDb2xvcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fYmFja2dyb3VuZENvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0aW5nKCk6IENvbnRyYWN0LldvcmtzaGVldEZvcm1hdHRpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlPih1cGRhdGVUeXBlLCBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLCAnQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZScpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoZmllbGROYW1lLCAnZmllbGROYW1lJyk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWx0ZXJPcHRpb25zLCAnZmlsdGVyT3B0aW9ucycpO1xuICAgIGlmIChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pIHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RmlsdGVyTnVsbE9wdGlvbj4oZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uLCBGaWx0ZXJOdWxsT3B0aW9uLCAnRmlsdGVyTnVsbE9wdGlvbicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5UmFuZ2VQYXJhbVR5cGUoZmlsdGVyT3B0aW9ucy5taW4sIGZpbHRlck9wdGlvbnMubWF4KTtcbiAgICB9XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5hcHBseVJhbmdlRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lLCBmaWx0ZXJPcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUhpZXJhcmNoaWNhbEZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPiB8IENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscyxcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIG9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHZhbHVlcywgJ3ZhbHVlcycpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8Q29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZT4odXBkYXRlVHlwZSwgQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSwgJ0NvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUnKTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVzKSAmJiAhdmFsdWVzLmxldmVscykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAndmFsdWVzIHBhcmFtZXRlciBmb3IgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyBtdXN0IGJlIGFuIGFycmF5IG9yIGNvbnRhaW4gYSBsZXZlbHMga2V5JyxcbiAgICAgICk7XG4gICAgfVxuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIHZhbHVlcywgdXBkYXRlVHlwZSwgb3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJGaWx0ZXJBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihmaWVsZE5hbWUsICdmaWVsZE5hbWUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmNsZWFyRmlsdGVyQXN5bmModGhpcy52aXN1YWxJZCwgZmllbGROYW1lKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJlbGF0aXZlRGF0ZUZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBvcHRpb25zOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXJPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U3RyaW5nUGFyYW1ldGVyKGZpZWxkTmFtZSwgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIob3B0aW9ucywgJ29wdGlvbnMnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFBlcmlvZFR5cGU+KG9wdGlvbnMucGVyaW9kVHlwZSwgUGVyaW9kVHlwZSwgJ1BlcmlvZFR5cGUnKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPERhdGVSYW5nZVR5cGU+KG9wdGlvbnMucmFuZ2VUeXBlLCBEYXRlUmFuZ2VUeXBlLCAnRGF0ZVJhbmdlVHlwZScpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgcmV0dXJuIHNlcnZpY2UuYXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXJBc3luYyh0aGlzLnZpc3VhbElkLCBmaWVsZE5hbWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0RGF0YVNvdXJjZXNBc3luYyh0aGlzLnZpc3VhbElkKS50aGVuPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PigocmVzdWx0KSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hOiBEYXRhU2NoZW1hID0gcmVzdWx0O1xuICAgICAgY29uc3Qgd29ya3NoZWV0RGF0YVNvdXJjZUluZm86IFdvcmtzaGVldERhdGFTb3VyY2VJbmZvID0gZGF0YVNjaGVtYS53b3Jrc2hlZXREYXRhU2NoZW1hTWFwW3RoaXMubmFtZV07XG5cbiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzOiBBcnJheTxDb250cmFjdC5EYXRhU291cmNlPiA9IFtdO1xuXG4gICAgICAvLyBGaXJzdCwgYWRkIHRoZSBwcmltYXJ5IGRhdGFzb3VyY2UuICBCeSBjb252ZW50aW9uLCBpdCBjb21lcyBmaXJzdCBpbiB0aGUgcmV0dXJuZWQgYXJyYXkuXG4gICAgICBjb25zdCBwcmltYXJ5SWQ6IHN0cmluZyA9IHdvcmtzaGVldERhdGFTb3VyY2VJbmZvLnByaW1hcnlEYXRhU291cmNlO1xuICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU2NoZW1hLmRhdGFTb3VyY2VzW3ByaW1hcnlJZF0pKTtcblxuICAgICAgLy8gVGhlbiwgbG9vcCB0aHJvdWdoIGFueSBzZWNvbmRhcnkgZGF0YSBzb3VyY2VzIGFuZCBhZGQgdGhlbS5cbiAgICAgIGZvciAoY29uc3Qgc2Vjb25kYXJ5SWQgb2Ygd29ya3NoZWV0RGF0YVNvdXJjZUluZm8ucmVmZXJlbmNlZERhdGFTb3VyY2VMaXN0KSB7XG4gICAgICAgIGlmIChzZWNvbmRhcnlJZCAhPT0gcHJpbWFyeUlkKSB7XG4gICAgICAgICAgZGF0YVNvdXJjZXMucHVzaCh0aGlzLmNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU2NoZW1hLmRhdGFTb3VyY2VzW3NlY29uZGFyeUlkXSkpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkYXRhU291cmNlcztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRGaWx0ZXJzQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U2VsZWN0ZWRNYXJrc0FzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuTWFya3NDb2xsZWN0aW9uPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFNlbGVjdGVkTWFya3NBc3luYyh0aGlzLnZpc3VhbElkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0SGlnaGxpZ2h0ZWRNYXJrc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0U3VtbWFyeURhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nRGF0YUFzeW5jKFxuICAgICAgdGhpcy52aXN1YWxJZCxcbiAgICAgIEdldERhdGFUeXBlLlN1bW1hcnksXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVTZWxlY3Rpb24sXG4gICAgICB0cnVlLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgICBvcHRpb25zLmFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyA/PyBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMocGFnZVJvd0NvdW50OiBudW1iZXIsIG9wdGlvbnM6IENvbnRyYWN0LkdldFN1bW1hcnlEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBwYWdlUm93Q291bnQgfHwgdGhpcy5nZXRNYXhQYWdlUm93TGltaXQoKSxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVBbGlhc2VzLFxuICAgICAgISFvcHRpb25zLmlnbm9yZVNlbGVjdGlvbixcbiAgICAgIHRydWUsIC8vIGluY2x1ZGVBbGxDb2x1bW5zIChjYW4gYmUgb3ZlcnJpZGRlbiBieSBjb2x1bW5zVG9JbmNsdWRlQnlJZClcbiAgICAgIG9wdGlvbnMuY29sdW1uc1RvSW5jbHVkZUJ5SWQgfHwgW10sXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICAgIG9wdGlvbnMuYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nID8/IGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGFkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jKFxuICAgIG1hcmtzQ2FyZEluZGV4OiBudW1iZXIsXG4gICAgZW5jb2RpbmdUeXBlOiBDb250cmFjdC5FbmNvZGluZ1R5cGUsXG4gICAgY29sdW1uczogc3RyaW5nW10sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFZpc3VhbE1vZGVsU2VydmljZT4oU2VydmljZU5hbWVzLlZpc3VhbE1vZGVsKTtcblxuICAgIHJldHVybiBzZXJ2aWNlLmFkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jKHRoaXMudmlzdWFsSWQsIG1hcmtzQ2FyZEluZGV4LCBlbmNvZGluZ1R5cGUsIGNvbHVtbnMsIHN0YXJ0SW5kZXgpO1xuICB9XG5cbiAgcHVibGljIG1vdmVNYXJrc0NhcmRGaWVsZEFzeW5jKG1hcmtzQ2FyZEluZGV4OiBudW1iZXIsIGZyb21JbmRleDogbnVtYmVyLCB0b0luZGV4OiBudW1iZXIsIGZpZWxkQ291bnQ6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuXG4gICAgcmV0dXJuIHNlcnZpY2UubW92ZU1hcmtzQ2FyZEZpZWxkQXN5bmModGhpcy52aXN1YWxJZCwgbWFya3NDYXJkSW5kZXgsIGZyb21JbmRleCwgdG9JbmRleCwgZmllbGRDb3VudCk7XG4gIH1cblxuICBwdWJsaWMgc3BsaWNlTWFya3NDYXJkRmllbGRzQXN5bmMoXG4gICAgbWFya3NDYXJkSW5kZXg6IG51bWJlcixcbiAgICBlbmNvZGluZ1R5cGU6IENvbnRyYWN0LkVuY29kaW5nVHlwZSxcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgZGVsZXRlQ291bnQ6IG51bWJlcixcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxWaXN1YWxNb2RlbFNlcnZpY2U+KFNlcnZpY2VOYW1lcy5WaXN1YWxNb2RlbCk7XG5cbiAgICByZXR1cm4gc2VydmljZS5zcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyh0aGlzLnZpc3VhbElkLCBtYXJrc0NhcmRJbmRleCwgZW5jb2RpbmdUeXBlLCBzdGFydEluZGV4LCBkZWxldGVDb3VudCwgY29sdW1ucyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0U3VtbWFyeUNvbHVtbnNJbmZvQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Db2x1bW4+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBHZXREYXRhVHlwZS5VbmRlcmx5aW5nLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMubWF4Um93cyB8fCAwLFxuICAgICAgb3B0aW9ucy5pbmNsdWRlRGF0YVZhbHVlc09wdGlvbiB8fCBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbi5BbGxWYWx1ZXMsXG4gICAgICBvcHRpb25zLmFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZyA/PyBmYWxzZSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdUYWJsZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPERhdGFTb3VyY2VTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2UpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdUYWJsZXNBc3luYyh0aGlzLnZpc3VhbElkKS50aGVuPEFycmF5PENvbnRyYWN0LkxvZ2ljYWxUYWJsZT4+KChsb2dpY2FsVGFibGVJbmZvcykgPT4ge1xuICAgICAgcmV0dXJuIGxvZ2ljYWxUYWJsZUluZm9zLm1hcCgobG9naWNhbFRhYmxlSW5mbykgPT4gbmV3IExvZ2ljYWxUYWJsZShsb2dpY2FsVGFibGVJbmZvKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT4ge1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8R2V0RGF0YVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5HZXREYXRhKTtcbiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMoXG4gICAgICB0aGlzLnZpc3VhbElkLFxuICAgICAgbG9naWNhbFRhYmxlSWQsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlQWxpYXNlcyxcbiAgICAgICEhb3B0aW9ucy5pZ25vcmVTZWxlY3Rpb24sXG4gICAgICAhIW9wdGlvbnMuaW5jbHVkZUFsbENvbHVtbnMsXG4gICAgICBvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkIHx8IFtdLFxuICAgICAgb3B0aW9ucy5tYXhSb3dzIHx8IDAsXG4gICAgICBvcHRpb25zLmluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIHx8IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLkFsbFZhbHVlcyxcbiAgICAgIG9wdGlvbnMuYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nID8/IGZhbHNlLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgcGFnZVJvd0NvdW50PzogbnVtYmVyLFxuICAgIG9wdGlvbnM/OiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMsXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFVuZGVybHlpbmdUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICAgIHRoaXMudmlzdWFsSWQsXG4gICAgICBsb2dpY2FsVGFibGVJZCxcbiAgICAgIHBhZ2VSb3dDb3VudCB8fCB0aGlzLmdldE1heFBhZ2VSb3dMaW1pdCgpLFxuICAgICAgISFvcHRpb25zLmlnbm9yZUFsaWFzZXMsXG4gICAgICAhIW9wdGlvbnMuaWdub3JlU2VsZWN0aW9uLFxuICAgICAgISFvcHRpb25zLmluY2x1ZGVBbGxDb2x1bW5zLFxuICAgICAgb3B0aW9ucy5jb2x1bW5zVG9JbmNsdWRlQnlJZCB8fCBbXSxcbiAgICAgIG9wdGlvbnMuaW5jbHVkZURhdGFWYWx1ZXNPcHRpb24gfHwgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24uQWxsVmFsdWVzLFxuICAgICAgb3B0aW9ucy5hcHBseVdvcmtzaGVldEZvcm1hdHRpbmcgPz8gZmFsc2UsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkTWFya3NBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLmNsZWFyU2VsZWN0ZWRNYXJrc0FzeW5jKHRoaXMudmlzdWFsSWQpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jKHNlbGVjdGlvbnM6IEFycmF5PENvbnRyYWN0LlNlbGVjdGlvbkNyaXRlcmlhPiwgc2VsZWN0aW9uVXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2VsZWN0aW9ucywgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8U2VsZWN0aW9uVXBkYXRlVHlwZT4oc2VsZWN0aW9uVXBkYXRlVHlwZSwgU2VsZWN0aW9uVXBkYXRlVHlwZSwgJ1NlbGVjdGlvblVwZGF0ZVR5cGUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jKHRoaXMudmlzdWFsSWQsIHNlbGVjdGlvbnMsIHNlbGVjdGlvblVwZGF0ZVR5cGUpO1xuICB9XG5cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlJZEFzeW5jKHNlbGVjdGlvbnM6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiwgc2VsZWN0aW9uVXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2VsZWN0aW9ucywgJ2ZpZWxkTmFtZScpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8U2VsZWN0aW9uVXBkYXRlVHlwZT4oc2VsZWN0aW9uVXBkYXRlVHlwZSwgU2VsZWN0aW9uVXBkYXRlVHlwZSwgJ1NlbGVjdGlvblVwZGF0ZVR5cGUnKTtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFNlbGVjdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5TZWxlY3Rpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLnNlbGVjdE1hcmtzQnlJZEFzeW5jKHRoaXMudmlzdWFsSWQsIHNlbGVjdGlvbnMsIHNlbGVjdGlvblVwZGF0ZVR5cGUpO1xuICB9XG5cbiAgcHVibGljIGFubm90YXRlTWFya0FzeW5jKG1hcms6IENvbnRyYWN0Lk1hcmtJbmZvLCBhbm5vdGF0aW9uVGV4dDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlcihtYXJrLCAnbWFyaycpO1xuICAgIHRoaXMudmVyaWZ5QWN0aXZlU2hlZXQoKTtcblxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QW5ub3RhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5hbm5vdGF0ZU1hcmtBc3luYyh0aGlzLnZpc3VhbElkLCBtYXJrLCBhbm5vdGF0aW9uVGV4dCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QW5ub3RhdGlvbnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxBbm5vdGF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLkFubm90YXRpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldEFubm90YXRpb25zQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQW5ub3RhdGlvbkFzeW5jKGFubm90YXRpb246IENvbnRyYWN0LkFubm90YXRpb24pIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGFubm90YXRpb24sICdhbm5vdGF0aW9uJyk7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxBbm5vdGF0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLkFubm90YXRpb24pO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbW92ZUFubm90YXRpb25Bc3luYyh0aGlzLnZpc3VhbElkLCBhbm5vdGF0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBlbmRDb250ZXh0TWVudUFzeW5jKHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBjb25maWc6IENvbnRleHRNZW51T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLmFwcGVuZENvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIGNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgcmVtb3ZlQ29udGV4dE1lbnVBc3luYyh0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgdGhpcy52ZXJpZnlBY3RpdmVTaGVldCgpO1xuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxFeHRlcm5hbENvbnRleHRNZW51U2VydmljZT4oU2VydmljZU5hbWVzLkV4dGVybmFsQ29udGV4dE1lbnUpO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbW92ZUNvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIG1lbnVJdGVtSWQpO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGVDb250ZXh0TWVudUFzeW5jKHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRXh0ZXJuYWxDb250ZXh0TWVudSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZXhlY3V0ZUNvbnRleHRNZW51QXN5bmModGhpcy52aXN1YWxJZC53b3Jrc2hlZXQsIHRhcmdldE1lbnUsIG1lbnVJdGVtSWQpO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZUNvbnRleHRNZW51QXN5bmModGFyZ2V0TWVudTogQXBpTWVudVR5cGUsIG1lbnVIZWFkZXI6IHN0cmluZywgbWVudURlc2NyaXB0aW9uOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLnZlcmlmeUFjdGl2ZVNoZWV0KCk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRXh0ZXJuYWxDb250ZXh0TWVudSk7XG4gICAgcmV0dXJuIHNlcnZpY2UucmVuYW1lQ29udGV4dE1lbnVBc3luYyh0aGlzLnZpc3VhbElkLndvcmtzaGVldCwgdGFyZ2V0TWVudSwgbWVudUhlYWRlciwgbWVudURlc2NyaXB0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBob3ZlclR1cGxlQXN5bmMoaG92ZXJlZFR1cGxlPzogbnVtYmVyLCB0b29sdGlwPzogVG9vbHRpcENvbnRleHQgfCBudWxsLCBhbGxvd0hvdmVyQWN0aW9ucz86IGJvb2xlYW4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5pc0luc2lkZURhc2hib2FyZEV4dGVuc2lvbigpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoXG4gICAgICAgIG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCBgaG92ZXJUdXBsZUFzeW5jIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFzaGJvYXJkIGV4dGVuc2lvbnNgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5ob3ZlclR1cGxlQXN5bmModGhpcy52aXN1YWxJZCwgaG92ZXJlZFR1cGxlLCB0b29sdGlwLCBhbGxvd0hvdmVyQWN0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0VHVwbGVzQXN5bmMoc2VsZWN0ZWRUdXBsZXM6IEFycmF5PG51bWJlcj4sIHNlbGVjdE9wdGlvbjogQ29udHJhY3QuU2VsZWN0T3B0aW9ucywgdG9vbHRpcD86IFRvb2x0aXBDb250ZXh0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYHNlbGVjdFR1cGxlc0FzeW5jIGlzIG5vdCBzdXBwb3J0ZWQgaW4gZGFzaGJvYXJkIGV4dGVuc2lvbnNgKSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZWxlY3Rpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uKTtcbiAgICByZXR1cm4gc2VydmljZS5zZWxlY3RUdXBsZXNBc3luYyh0aGlzLnZpc3VhbElkLCBzZWxlY3RlZFR1cGxlcywgc2VsZWN0T3B0aW9uLCB0b29sdGlwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb29sdGlwVGV4dEFzeW5jKHR1cGxlSWQ6IG51bWJlcik6IFByb21pc2U8U3RyaW5nPiB7XG4gICAgaWYgKHRoaXMuaXNJbnNpZGVEYXNoYm9hcmRFeHRlbnNpb24oKSkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KFxuICAgICAgICBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYGdldFRvb2x0aXBUZXh0QXN5bmMgaXMgbm90IHN1cHBvcnRlZCBpbiBkYXNoYm9hcmQgZXh0ZW5zaW9uc2ApLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxBY2Nlc3NpYmlsaXR5U2VydmljZT4oU2VydmljZU5hbWVzLkFjY2Vzc2liaWxpdHkpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldFRvb2x0aXBUZXh0QXN5bmModGhpcy52aXN1YWxJZCwgdHVwbGVJZCk7XG4gIH1cblxuICBwdWJsaWMgbGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzSW5zaWRlRGFzaGJvYXJkRXh0ZW5zaW9uKCkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChcbiAgICAgICAgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgICBDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsXG4gICAgICAgICAgYGxlYXZlTWFya05hdmlnYXRpb25Bc3luYyBpcyBub3Qgc3VwcG9ydGVkIGluIGRhc2hib2FyZCBleHRlbnNpb25zYCxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8QWNjZXNzaWJpbGl0eVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5BY2Nlc3NpYmlsaXR5KTtcbiAgICByZXR1cm4gc2VydmljZS5sZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmModGhpcy52aXN1YWxJZCk7XG4gIH1cblxuICBwdWJsaWMgZWRpdEFsaWFzZXNEaWFsb2dBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VmlzdWFsTW9kZWxTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWwpO1xuICAgIHJldHVybiBzZXJ2aWNlLmVkaXRBbGlhc2VzRGlhbG9nQXN5bmMoZmllbGROYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRGF0YVNvdXJjZUZyb21JbmZvKGRhdGFTb3VyY2VJbmZvOiBEYXRhU291cmNlSW5mbyk6IENvbnRyYWN0LkRhdGFTb3VyY2Uge1xuICAgIGNvbnN0IGRhdGFTb3VyY2VJbXBsID0gbmV3IERhdGFTb3VyY2VJbXBsKGRhdGFTb3VyY2VJbmZvLCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICBjb25zdCBkYXRhU291cmNlID0gbmV3IERhdGFTb3VyY2UoZGF0YVNvdXJjZUltcGwpO1xuICAgIGRhdGFTb3VyY2VJbXBsLmluaXRpYWxpemVXaXRoUHVibGljSW50ZXJmYWNlcyhkYXRhU291cmNlKTtcbiAgICByZXR1cm4gZGF0YVNvdXJjZTtcbiAgfVxuXG4gIHByaXZhdGUgdmVyaWZ5QWN0aXZlU2hlZXQoKSB7XG4gICAgY29uc3QgaXNSb290QW5kQWN0aXZlV29ya3NoZWV0ID0gdGhpcy5hY3RpdmU7XG4gICAgY29uc3QgaXNJbnNpZGVBY3RpdmVEYXNoYm9hcmQgPSB0aGlzLmlzSW5zaWRlQWN0aXZlRGFzaGJvYXJkKCk7XG4gICAgY29uc3QgaXNJbnNpZGVBY3RpdmVTdG9yeVBvaW50ID0gdGhpcy5pc0luc2lkZUFjdGl2ZVN0b3J5UG9pbnQoKTtcblxuICAgIGlmICghaXNSb290QW5kQWN0aXZlV29ya3NoZWV0ICYmICFpc0luc2lkZUFjdGl2ZURhc2hib2FyZCAmJiAhaXNJbnNpZGVBY3RpdmVTdG9yeVBvaW50KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuTm90QWN0aXZlU2hlZXQsICdPcGVyYXRpb24gbm90IGFsbG93ZWQgb24gbm9uLWFjdGl2ZSBzaGVldCcpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNJbnNpZGVBY3RpdmVTdG9yeVBvaW50KCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbCAmJiB0aGlzLl9wYXJlbnRTdG9yeVBvaW50SW1wbC5hY3RpdmU7XG4gIH1cblxuICBwcml2YXRlIGlzSW5zaWRlQWN0aXZlRGFzaGJvYXJkKCkge1xuICAgIHJldHVybiB0aGlzLl9wYXJlbnREYXNoYm9hcmRJbXBsICYmIHRoaXMuX3BhcmVudERhc2hib2FyZEltcGwuYWN0aXZlO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0luc2lkZURhc2hib2FyZEV4dGVuc2lvbigpIHtcbiAgICByZXR1cm4gdGhpcy5fcGFyZW50RGFzaGJvYXJkSW1wbCAhPT0gbnVsbDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IExvZ2ljYWxUYWJsZUluZm8gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIGEgbG9naWNhbCB0YWJsZS5cbiAqIFRoaXMgZG9lcyBub3QgZm9sbG93IHRoZSBJbXBsIHBhdHRlcm4gYXMgaXQgaXMganVzdCBhIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIExvZ2ljYWxUYWJsZSBpbXBsZW1lbnRzIENvbnRyYWN0LkxvZ2ljYWxUYWJsZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9sb2dpY2FsVGFibGU6IExvZ2ljYWxUYWJsZUluZm8pIHt9XG5cbiAgcHVibGljIGdldCBpZCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sb2dpY2FsVGFibGUuaWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGNhcHRpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fbG9naWNhbFRhYmxlLmNhcHRpb247XG4gIH1cbn1cbiIsImltcG9ydCB7IFRvb2x0aXBUZXh0UmVxdWVzdCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgVG9vbHRpcFRleHRSZXF1ZXN0TW9kZWwgaW1wbGVtZW50cyBUb29sdGlwVGV4dFJlcXVlc3Qge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHZpc3VhbElkUHJlc01vZGVsOiBWaXN1YWxJZCxcbiAgICBwdWJsaWMgdHVwbGVJZDogbnVtYmVyLFxuICApIHt9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0ZVJhbmdlVHlwZSwgRmlsdGVyRG9tYWluVHlwZSwgRmlsdGVyVHlwZSwgUGVyaW9kVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBIaWVyYXJjaGljYWxMZXZlbFNlbGVjdGlvblN0YXRlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzL2xpYi9zcmMvRXh0ZXJuYWxDb250cmFjdC9TaGFyZWQvTmFtZXNwYWNlcy9UYWJsZWF1JztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvRGF0YVNvdXJjZVNlcnZpY2UnO1xuaW1wb3J0IHsgRmlsdGVyU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0ZpbHRlclNlcnZpY2UnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcblxuZXhwb3J0IGNsYXNzIEZpbHRlciBpbXBsZW1lbnRzIENvbnRyYWN0LkZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgX3dvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfZmlsdGVyVHlwZTogRmlsdGVyVHlwZSxcbiAgICBwcm90ZWN0ZWQgX2ZpZWxkSWQ6IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0TmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGROYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBmaWVsZElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpbHRlclR5cGUoKTogRmlsdGVyVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpbHRlclR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmllbGRBc3luYygpOiBQcm9taXNlPENvbnRyYWN0LkZpZWxkPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxEYXRhU291cmNlU2VydmljZT4oU2VydmljZU5hbWVzLkRhdGFTb3VyY2VTZXJ2aWNlKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRGaWVsZEFzeW5jKHRoaXMuX2ZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIGdldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5nZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQpO1xuICB9XG5cbiAgcHVibGljIHNldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoYXBwbHlUb1dvcmtzaGVldHM6IEFycmF5PHN0cmluZz4pOiBQcm9taXNlPEFycmF5PHN0cmluZz4+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGFwcGx5VG9Xb3Jrc2hlZXRzLCAnYXBwbHlUb1dvcmtzaGVldHMnKTtcbiAgICBjb25zdCB1bmlxdWVXb3Jrc2hlZXRzID0gbmV3IFNldChhcHBseVRvV29ya3NoZWV0cyk7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxGaWx0ZXJTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuRmlsdGVyKTtcbiAgICByZXR1cm4gc2VydmljZS5zZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkTmFtZSwgdGhpcy5fZmllbGRJZCwgQXJyYXkuZnJvbSh1bmlxdWVXb3Jrc2hlZXRzKSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGVnb3JpY2FsRmlsdGVyIGV4dGVuZHMgRmlsdGVyIGltcGxlbWVudHMgQ29udHJhY3QuQ2F0ZWdvcmljYWxGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+LFxuICAgIHByaXZhdGUgX2lzRXhjbHVkZU1vZGU6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfaXNBbGxTZWxlY3RlZD86IGJvb2xlYW4sXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzQWxsU2VsZWN0ZWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzQWxsU2VsZWN0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwcGxpZWRWYWx1ZXMoKTogQXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2FwcGxpZWRWYWx1ZXM7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRXhjbHVkZU1vZGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRXhjbHVkZU1vZGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0RG9tYWluQXN5bmMoZG9tYWluVHlwZT86IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluPiB7XG4gICAgaWYgKCFkb21haW5UeXBlKSB7XG4gICAgICBkb21haW5UeXBlID0gRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudDtcbiAgICB9XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlckRvbWFpblR5cGU+KGRvbWFpblR5cGUsIEZpbHRlckRvbWFpblR5cGUsICdGaWx0ZXJEb21haW5UeXBlJyk7XG5cbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEZpbHRlclNlcnZpY2U+KFNlcnZpY2VOYW1lcy5GaWx0ZXIpO1xuICAgIHJldHVybiBzZXJ2aWNlLmdldENhdGVnb3JpY2FsRG9tYWluQXN5bmModGhpcy5fd29ya3NoZWV0TmFtZSwgdGhpcy5fZmllbGRJZCwgZG9tYWluVHlwZSk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbERhdGFWYWx1ZSBpbXBsZW1lbnRzIENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZSB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF92YWx1ZTogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX2hpZXJhcmNoaWNhbFBhdGg6IHN0cmluZyxcbiAgICBwcml2YXRlIF9sZXZlbDogbnVtYmVyLFxuICApIHt9XG5cbiAgcHVibGljIGdldCB2YWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl92YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaGllcmFyY2hpY2FsUGF0aCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9oaWVyYXJjaGljYWxQYXRoO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWwgaW1wbGVtZW50cyBDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9uYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfbGV2ZWxTZWxlY3Rpb25TdGF0ZTogSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSxcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9uYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbFNlbGVjdGlvblN0YXRlKCk6IEhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUge1xuICAgIHJldHVybiB0aGlzLl9sZXZlbFNlbGVjdGlvblN0YXRlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBIaWVyYXJjaGljYWxGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9kaW1lbnNpb25OYW1lOiBzdHJpbmcsXG4gICAgcHJpdmF0ZSBfaGllcmFyY2h5Q2FwdGlvbjogc3RyaW5nLFxuICAgIHByaXZhdGUgX251bWJlck9mTGV2ZWxzOiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfbGV2ZWxEZXRhaWxzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbD4sXG4gICAgcHJpdmF0ZSBfYXBwbGllZFZhbHVlczogQXJyYXk8Q29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyRGF0YVZhbHVlPixcbiAgICBwcml2YXRlIF9pc0FsbFNlbGVjdGVkOiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQsIHJlZ2lzdHJ5SWQpO1xuICB9XG4gIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBDb250cmFjdC5GaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIHRocm93IG5ldyBFcnJvcignTWV0aG9kIG5vdCBpbXBsZW1lbnRlZC4nKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGltZW5zaW9uTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kaW1lbnNpb25OYW1lO1xuICB9XG5cbiAgcHVibGljIGdldCBoaWVyYXJjaHlDYXB0aW9uKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2hpZXJhcmNoeUNhcHRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IG51bWJlck9mTGV2ZWxzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX251bWJlck9mTGV2ZWxzO1xuICB9XG5cbiAgcHVibGljIGdldCBsZXZlbERldGFpbHMoKTogQ29udHJhY3QuSGllcmFyY2hpY2FsTGV2ZWxEZXRhaWxbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xldmVsRGV0YWlscztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNBbGxTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faXNBbGxTZWxlY3RlZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYXBwbGllZFZhbHVlcygpOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXJEYXRhVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5fYXBwbGllZFZhbHVlcztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmFuZ2VGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5SYW5nZUZpbHRlciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICB3b3Jrc2hlZXROYW1lOiBzdHJpbmcsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgZmllbGRJZDogc3RyaW5nLFxuICAgIGZpbHRlclR5cGU6IEZpbHRlclR5cGUsXG4gICAgcmVnaXN0cnlJZDogbnVtYmVyLFxuICAgIHByaXZhdGUgX21pbjogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX21heDogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX2luY2x1ZGVOdWxsVmFsdWVzOiBib29sZWFuLFxuICApIHtcbiAgICBzdXBlcih3b3Jrc2hlZXROYW1lLCBmaWVsZE5hbWUsIGZpbHRlclR5cGUsIGZpZWxkSWQsIHJlZ2lzdHJ5SWQpO1xuICB9XG5cbiAgcHVibGljIGdldCBtaW5WYWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1heFZhbHVlKCk6IENvbnRyYWN0LkRhdGFWYWx1ZSB7XG4gICAgcmV0dXJuIHRoaXMuX21heDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaW5jbHVkZU51bGxWYWx1ZXMoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2luY2x1ZGVOdWxsVmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldERvbWFpbkFzeW5jKGRvbWFpblR5cGU/OiBGaWx0ZXJEb21haW5UeXBlKTogUHJvbWlzZTxDb250cmFjdC5SYW5nZURvbWFpbj4ge1xuICAgIGNvbnN0IHNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHRoaXMuX3JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RmlsdGVyU2VydmljZT4oU2VydmljZU5hbWVzLkZpbHRlcik7XG4gICAgaWYgKCFkb21haW5UeXBlKSB7XG4gICAgICBkb21haW5UeXBlID0gRmlsdGVyRG9tYWluVHlwZS5SZWxldmFudDtcbiAgICB9XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPEZpbHRlckRvbWFpblR5cGU+KGRvbWFpblR5cGUsIEZpbHRlckRvbWFpblR5cGUsICdGaWx0ZXJEb21haW5UeXBlJyk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRSYW5nZURvbWFpbkFzeW5jKHRoaXMuX3dvcmtzaGVldE5hbWUsIHRoaXMuX2ZpZWxkSWQsIGRvbWFpblR5cGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSZWxhdGl2ZURhdGVGaWx0ZXIgZXh0ZW5kcyBGaWx0ZXIgaW1wbGVtZW50cyBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBmaWx0ZXJUeXBlOiBGaWx0ZXJUeXBlLFxuICAgIHJlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9hbmNob3JEYXRlOiBDb250cmFjdC5EYXRhVmFsdWUsXG4gICAgcHJpdmF0ZSBfcGVyaW9kVHlwZTogUGVyaW9kVHlwZSxcbiAgICBwcml2YXRlIF9yYW5nZVR5cGU6IERhdGVSYW5nZVR5cGUsXG4gICAgcHJpdmF0ZSBfcmFuZ2VOOiBudW1iZXIsXG4gICkge1xuICAgIHN1cGVyKHdvcmtzaGVldE5hbWUsIGZpZWxkTmFtZSwgZmlsdGVyVHlwZSwgZmllbGRJZCwgcmVnaXN0cnlJZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFuY2hvckRhdGUoKTogQ29udHJhY3QuRGF0YVZhbHVlIHtcbiAgICByZXR1cm4gdGhpcy5fYW5jaG9yRGF0ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGVyaW9kVHlwZSgpOiBQZXJpb2RUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fcGVyaW9kVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcmFuZ2VUeXBlKCk6IERhdGVSYW5nZVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZVR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHJhbmdlTigpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9yYW5nZU47XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIENhdGVnb3JpY2FsRG9tYWluIGltcGxlbWVudHMgQ29udHJhY3QuQ2F0ZWdvcmljYWxEb21haW4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfdmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+LFxuICAgIHByaXZhdGUgX2RvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHZhbHVlcygpOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWVzO1xuICB9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IEZpbHRlckRvbWFpblR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kb21haW5UeXBlO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBSYW5nZURvbWFpbiBpbXBsZW1lbnRzIENvbnRyYWN0LlJhbmdlRG9tYWluIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX21pbjogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX21heDogQ29udHJhY3QuRGF0YVZhbHVlLFxuICAgIHByaXZhdGUgX2RvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogRmlsdGVyRG9tYWluVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX2RvbWFpblR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1pbigpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9taW47XG4gIH1cblxuICBwdWJsaWMgZ2V0IG1heCgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLl9tYXg7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhVHlwZSwgTWFya1R5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlIGltcGxlbWVudHMgQ29udHJhY3QuRGF0YVRhYmxlIHtcbiAgcHJpdmF0ZSBfbmFtZTogc3RyaW5nO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9kYXRhOiBBcnJheTxBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+PixcbiAgICBwcml2YXRlIF9jb2x1bW5zOiBBcnJheTxDb250cmFjdC5Db2x1bW4+LFxuICAgIHByaXZhdGUgX3RvdGFsUm93Q291bnQ6IG51bWJlcixcbiAgICBwcml2YXRlIF9pc1RvdGFsUm93Q291bnRMaW1pdGVkOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2lzU3VtbWFyeURhdGE6IGJvb2xlYW4sXG4gICAgcHJpdmF0ZSBfbWFya3NJbmZvPzogQXJyYXk8TWFya0luZm8+LFxuICApIHtcbiAgICB0aGlzLl9uYW1lID0gX2lzU3VtbWFyeURhdGEgPyAnU3VtbWFyeSBEYXRhIFRhYmxlJyA6ICdVbmRlcmx5aW5nIERhdGEgVGFibGUnO1xuICB9XG5cbiAgcHVibGljIGdldCBuYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX25hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhdGEoKTogQXJyYXk8QXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPj4ge1xuICAgIHJldHVybiB0aGlzLl9kYXRhO1xuICB9XG5cbiAgcHVibGljIGdldCBjb2x1bW5zKCk6IEFycmF5PENvbnRyYWN0LkNvbHVtbj4ge1xuICAgIHJldHVybiB0aGlzLl9jb2x1bW5zO1xuICB9XG5cbiAgcHVibGljIGdldCBtYXJrc0luZm8oKTogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+IHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fbWFya3NJbmZvO1xuICB9XG5cbiAgcHVibGljIGdldCB0b3RhbFJvd0NvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3RvdGFsUm93Q291bnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzVG90YWxSb3dDb3VudExpbWl0ZWQoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzVG90YWxSb3dDb3VudExpbWl0ZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzU3VtbWFyeURhdGEoKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2lzU3VtbWFyeURhdGE7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1hcmtJbmZvIGltcGxlbWVudHMgQ29udHJhY3QuTWFya0luZm8ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfdHlwZTogTWFya1R5cGUsXG4gICAgcHJpdmF0ZSBfY29sb3I6IHN0cmluZyxcbiAgICBwcml2YXRlIF90dXBsZUlkPzogbnVtYmVyLFxuICApIHt9XG5cbiAgcHVibGljIGdldCB0eXBlKCk6IE1hcmtUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fdHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29sb3IoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY29sb3I7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR1cGxlSWQoKTogbnVtYmVyIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fdHVwbGVJZDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29sdW1uIGltcGxlbWVudHMgQ29udHJhY3QuQ29sdW1uIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2ZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgX2ZpZWxkSWQ6IHN0cmluZyxcbiAgICBwcml2YXRlIF9kYXRhVHlwZTogRGF0YVR5cGUsXG4gICAgcHJpdmF0ZSBfaXNSZWZlcmVuY2VkOiBib29sZWFuLFxuICAgIHByaXZhdGUgX2luZGV4OiBudW1iZXIsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IGZpZWxkTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9maWVsZE5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGZpZWxkSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZmllbGRJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZGF0YVR5cGUoKTogRGF0YVR5cGUge1xuICAgIHJldHVybiB0aGlzLl9kYXRhVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNSZWZlcmVuY2VkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9pc1JlZmVyZW5jZWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2luZGV4O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhVmFsdWUgaW1wbGVtZW50cyBDb250cmFjdC5EYXRhVmFsdWUge1xuICAvKiB0c2xpbnQ6ZGlzYWJsZTpuby1hbnkgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX3ZhbHVlOiBhbnksXG4gICAgcHJpdmF0ZSBfbmF0aXZlVmFsdWU6IGFueSxcbiAgICBwcml2YXRlIF9mb3JtYXR0ZWRWYWx1ZT86IHN0cmluZyxcbiAgICBwcml2YXRlIF9hbGlhc1ZhbHVlPzogc3RyaW5nLFxuICAgIHByaXZhdGUgX2hhc0FsaWFzPzogYm9vbGVhbixcbiAgKSB7fVxuXG4gIHB1YmxpYyBnZXQgdmFsdWUoKTogYW55IHtcbiAgICByZXR1cm4gdGhpcy5fdmFsdWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hdGl2ZVZhbHVlKCk6IGFueSB7XG4gICAgcmV0dXJuIHRoaXMuX25hdGl2ZVZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0ZWRWYWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxpYXNWYWx1ZSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9hbGlhc1ZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBoYXNBbGlhcygpOiBib29sZWFuIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5faGFzQWxpYXM7XG4gIH1cbiAgLyogdHNsaW50OmVuYWJsZTpuby1hbnkgKi9cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0dldERhdGFTZXJ2aWNlJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSwgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5cbmV4cG9ydCBjbGFzcyBEYXRhVGFibGVSZWFkZXIgaW1wbGVtZW50cyBDb250cmFjdC5EYXRhVGFibGVSZWFkZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJvdGVjdGVkIF9pZDogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfdG90YWxSb3dDb3VudDogbnVtYmVyLFxuICAgIHByb3RlY3RlZCBfcGFnZVJvd0NvdW50LFxuICAgIHByaXZhdGUgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgKSB7XG4gICAgdGhpcy5fcGFnZUNvdW50ID0gTWF0aC5jZWlsKF90b3RhbFJvd0NvdW50IC8gX3BhZ2VSb3dDb3VudCk7XG4gIH1cbiAgcHJvdGVjdGVkIF9wYWdlQ291bnQ6IG51bWJlcjtcblxuICBwdWJsaWMgZ2V0IHRvdGFsUm93Q291bnQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fdG90YWxSb3dDb3VudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcGFnZUNvdW50KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3BhZ2VDb3VudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYWdlQXN5bmMocGFnZU51bWJlcjogbnVtYmVyKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UmFuZ2UocGFnZU51bWJlciwgMCwgdGhpcy5fcGFnZUNvdW50KTtcbiAgICBjb25zdCBzZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldCh0aGlzLl9yZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEdldERhdGFTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuR2V0RGF0YSk7XG4gICAgcmV0dXJuIHNlcnZpY2UuZ2V0UGFnZUFzeW5jKHRoaXMuX2lkLCBwYWdlTnVtYmVyLCB0aGlzLl9wYWdlUm93Q291bnQpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldEFsbFBhZ2VzQXN5bmMobWF4Um93cz86IG51bWJlcik6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgY29uc3QgZmlyc3RQYWdlOiBDb250cmFjdC5EYXRhVGFibGUgPSBhd2FpdCB0aGlzLmdldFBhZ2VBc3luYygwKTtcbiAgICBtYXhSb3dzID0gbWF4Um93cyB8fCB0aGlzLnRvdGFsUm93Q291bnQ7XG4gICAgY29uc3Qgcm93c1JlcXVlc3RlZCA9IE1hdGgubWluKG1heFJvd3MsIHRoaXMudG90YWxSb3dDb3VudCk7XG4gICAgY29uc3QgcGFnZXNSZXF1ZXN0ZWQgPSBNYXRoLmNlaWwocm93c1JlcXVlc3RlZCAvIHRoaXMuX3BhZ2VSb3dDb3VudCk7XG5cbiAgICAvLyBGZXRjaCB1cCB0byA0MDAgcGFnZXMsIHdpdGggYSBkZWZhdWx0IG9mIDEwLDAwMCBwYWdlUm93Q291bnQgdGhhdCBnaXZlcyB1cyA0LDAwMCwwMDAgcm93c1xuICAgIGNvbnN0IHBhZ2VzVG9GZXRjaCA9IE1hdGgubWluKHBhZ2VzUmVxdWVzdGVkLCA0MDApO1xuICAgIGNvbnN0IGlzRGF0YUxpbWl0ZWQgPSBwYWdlc1RvRmV0Y2ggPCBwYWdlc1JlcXVlc3RlZDtcbiAgICBsZXQgcmVtYWluaW5nRGF0YTogQXJyYXk8QXJyYXk8QXJyYXk8Q29udHJhY3QuRGF0YVZhbHVlPj4+ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwYWdlc1RvRmV0Y2g7IGkrKykge1xuICAgICAgY29uc3QgcGFnZSA9IGF3YWl0IHRoaXMuZ2V0UGFnZUFzeW5jKGkpO1xuICAgICAgcmVtYWluaW5nRGF0YS5wdXNoKHBhZ2UuZGF0YSk7XG4gICAgfVxuXG4gICAgbGV0IGZ1bGxEYXRhID0gZmlyc3RQYWdlLmRhdGEuY29uY2F0KC4uLnJlbWFpbmluZ0RhdGEpO1xuICAgIC8vIFRoaXMgc2xpY2VzIHRoZSBhcnJheSBvbmx5IGlmIG1heFJvd3MgaGFzIGJlZW4gc2V0IGFuZCBpcyBsZXNzIHRoYW4gdG90YWxSb3dDb3VudFxuICAgIGZ1bGxEYXRhLmxlbmd0aCA9IHJvd3NSZXF1ZXN0ZWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbmFtZTogZmlyc3RQYWdlLm5hbWUsXG4gICAgICBkYXRhOiBmdWxsRGF0YSxcbiAgICAgIGNvbHVtbnM6IGZpcnN0UGFnZS5jb2x1bW5zLFxuICAgICAgdG90YWxSb3dDb3VudDogaXNEYXRhTGltaXRlZCA/IHBhZ2VzVG9GZXRjaCAqIHRoaXMuX3BhZ2VSb3dDb3VudCA6IHJvd3NSZXF1ZXN0ZWQsXG4gICAgICBpc1RvdGFsUm93Q291bnRMaW1pdGVkOiBpc0RhdGFMaW1pdGVkLFxuICAgICAgaXNTdW1tYXJ5RGF0YTogZmlyc3RQYWdlLmlzU3VtbWFyeURhdGEsXG4gICAgfTtcbiAgfVxuXG4gIHB1YmxpYyByZWxlYXNlQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQodGhpcy5fcmVnaXN0cnlJZCkuZ2V0U2VydmljZTxHZXREYXRhU2VydmljZT4oU2VydmljZU5hbWVzLkdldERhdGEpO1xuICAgIHJldHVybiBzZXJ2aWNlLnJlbGVhc2VBc3luYyh0aGlzLl9pZCk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFRvb2x0aXBDb250ZXh0IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEhvdmVyVHVwbGVJbnRlcmFjdGlvbiwgU2VsZWN0T3B0aW9ucywgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb24sIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBTZWxlY3Rpb24gTW9kZWwuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25Nb2RlbCB7XG4gIHB1YmxpYyBxdWFsaWZpZWRGaWVsZENhcHRpb246IHN0cmluZztcbn1cblxuLyoqXG4gKiBWYWx1ZSBiYXNlZCBzZWxlY3Rpb24gbW9kZWwuIE1lYW50IGZvciBoaWVyYXJjaGljYWwsIHJhbmdlIGFuZCBjYXRlZ29yaWNhbCBzZWxlY3Rpb25zLlxuICovXG5leHBvcnQgY2xhc3MgVmFsdWVTZWxlY3Rpb25Nb2RlbCBleHRlbmRzIFNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHNlbGVjdFZhbHVlczogQXJyYXk8c3RyaW5nPiA9IFtdO1xufVxuXG4vKipcbiAqIEhpZXJhcmNoaWNhbCB2YWx1ZSBzZWxlY3Rpb24gbW9kZWxcbiAqL1xuZXhwb3J0IGNsYXNzIEhpZXJhcmNoaWNhbFNlbGVjdGlvbk1vZGVsIGV4dGVuZHMgVmFsdWVTZWxlY3Rpb25Nb2RlbCB7fVxuXG4vKipcbiAqIFJhbmdlIGJhc2VkIHZhbHVlIHNlbGVjdGlvbiBtb2RlbFxuICovXG5leHBvcnQgY2xhc3MgUmFuZ2VTZWxlY3Rpb25Nb2RlbCBleHRlbmRzIFNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIG1pblZhbHVlOiBzdHJpbmc7XG4gIHB1YmxpYyBtYXhWYWx1ZTogc3RyaW5nO1xuICBwdWJsaWMgaW5jbHVkZWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBEaW1lbnNpb24gdmFsdWUgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBEaW1lbnNpb25TZWxlY3Rpb25Nb2RlbCBleHRlbmRzIFZhbHVlU2VsZWN0aW9uTW9kZWwge31cbi8qKlxuICogVHVwbGUgYmFzZWQgc2VsZWN0aW9uIG1vZGVsXG4gKi9cbmV4cG9ydCBjbGFzcyBUdXBsZVNlbGVjdGlvbk1vZGVsIHtcbiAgcHVibGljIHNlbGVjdGlvblR5cGU6IHN0cmluZztcbiAgcHVibGljIG9iamVjdElkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xufVxuXG4vKipcbiAqIENvbnRhaW5lciBjbGFzcyB0byBwb3B1bGF0ZSBhbGwgdGhlIHNlbGVjdGlvbiBtb2RlbHMgd2hlbiBwYXJzaW5nIGlucHV0XG4gKi9cbmV4cG9ydCBjbGFzcyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICBwdWJsaWMgaGllck1vZGVsQXJyOiBBcnJheTxIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbD4gPSBbXTtcbiAgcHVibGljIGRpbU1vZGVsQXJyOiBBcnJheTxEaW1lbnNpb25TZWxlY3Rpb25Nb2RlbD4gPSBbXTtcbiAgcHVibGljIHF1YW50TW9kZWxBcnI6IEFycmF5PFJhbmdlU2VsZWN0aW9uTW9kZWw+ID0gW107XG4gIHB1YmxpYyBzZWxlY3Rpb246IFR1cGxlU2VsZWN0aW9uTW9kZWw7XG59XG5cbmV4cG9ydCBjbGFzcyBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbk1vZGVsIGltcGxlbWVudHMgU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb24ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHZpc3VhbElkUHJlc01vZGVsOiBWaXN1YWxJZCxcbiAgICBwdWJsaWMgdHVwbGVJZHM6IEFycmF5PG51bWJlcj4gPSBbXSxcbiAgICBwdWJsaWMgc2VsZWN0T3B0aW9uczogU2VsZWN0T3B0aW9ucyxcbiAgICBwdWJsaWMgdG9vbHRpcENvbnRleHQ/OiBUb29sdGlwQ29udGV4dCxcbiAgKSB7fVxufVxuXG5leHBvcnQgY2xhc3MgSG92ZXJUdXBsZUludGVyYWN0aW9uTW9kZWwgaW1wbGVtZW50cyBIb3ZlclR1cGxlSW50ZXJhY3Rpb24ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHVibGljIHZpc3VhbElkUHJlc01vZGVsOiBWaXN1YWxJZCxcbiAgICBwdWJsaWMgdHVwbGVJZDogbnVtYmVyLFxuICAgIHB1YmxpYyB0b29sdGlwQ29udGV4dD86IFRvb2x0aXBDb250ZXh0IHwgbnVsbCxcbiAgICBwdWJsaWMgYWxsb3dIb3ZlckFjdGlvbnM/OiBib29sZWFuLFxuICApIHt9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgUG9pbnQgaW1wbGVtZW50cyBDb250cmFjdC5Qb2ludCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF94OiBudW1iZXIsXG4gICAgcHJpdmF0ZSBfeTogbnVtYmVyLFxuICApIHt9XG5cbiAgcHVibGljIGdldCB4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX3g7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHkoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5feTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2UgfSBmcm9tICcuL1NlcnZpY2VSZWdpc3RyeSc7XG5cbi8qKlxuICogRGVmaW5lcyB3aGljaCB0eXBlIG9mIGdldERhdGEgY2FsbCB0byBtYWtlLlxuICovXG5leHBvcnQgZW51bSBHZXREYXRhVHlwZSB7XG4gIFN1bW1hcnkgPSAnc3VtbWFyeScsXG4gIFVuZGVybHlpbmcgPSAndW5kZXJseWluZycsXG59XG5cbi8qKlxuICogU2VydmljZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBsb2dpYyBmb3IgdmFyaW91cyBnZXREYXRhIGNhbGxzXG4gKlxuICogQGludGVyZmFjZSBHZXREYXRhU2VydmljZVxuICogQGV4dGVuZHMge0FwaVNlcnZpY2V9XG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgR2V0RGF0YVNlcnZpY2UgZXh0ZW5kcyBBcGlTZXJ2aWNlIHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIGxpbWl0IG9mIHJvd3MgZm9yIGdldFVuZGVybHlpbmdEYXRhQXN5bmNcbiAgICovXG4gIGdldE1heFJvd0xpbWl0KCk6IG51bWJlcjtcblxuICAvKipcbiAgICogR2V0cyB0aGUgdW5kZXJseWluZyBkYXRhIGZvciBhIHBhcnRpY3VsYXIgdmlzdWFsXG4gICAqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7R2V0RGF0YVR5cGV9IGdldFR5cGUgIFRoZSB0eXBlIG9mIGdldERhdGEgY2FsbCB0byBtYWtlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBvciBub3QgYWxpYXNlcyBzaG91bGQgYmUgaWdub3JlZFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBvciBub3Qgc2VsZWN0aW9uIHNob3VsZCBiZSBpZ25vcmVkXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFNob3VsZCBhbGwgY29sdW1ucyBiZSBpbmNsdWRlZFxuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zLlxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyAgTWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXR1cm5cbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldFVuZGVybHlpbmdEYXRhQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGdldFR5cGU6IEdldERhdGFUeXBlLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIG1heFJvd3M6IG51bWJlcixcbiAgICBpbmNsdWRlRGF0YVZhbHVlc09wdGlvbjogSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gICAgYXBwbHlXb3Jrc2hlZXRGb3JtYXR0aW5nOiBib29sZWFuLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBwYWdlUm93Q291bnQgVGhlIG51bWJlciBvZiByb3dzIHBlciBwYWdlLiBUaGUgZGVmYXVsdCBhbmQgbWF4aW11bSBpcyAxMCwwMDAgcm93cy5cbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZVNlbGVjdGlvbiAgV2hldGhlciBzZWxlY3Rpb25zIGluIHRoaXMgdml6IHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5jbHVkZUFsbENvbHVtbnMgIFNob3VsZCBhbGwgY29sdW1ucyBiZSBpbmNsdWRlZFxuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj59ICBEYXRhIHRhYmxlIHJlYWRlciB0byBhY2Nlc3MgdGhlIHVuZGVybHlpbmcgZGF0YVxuICAgKi9cbiAgZ2V0U3VtbWFyeURhdGFSZWFkZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgcGFnZVJvd0NvdW50OiBudW1iZXIsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICAgIGFwcGx5V29ya3NoZWV0Rm9ybWF0dGluZzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGVSZWFkZXI+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgbWFya3MgZm9yIGEgZ2l2ZW4gdmlzdWFsXG4gICAqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFjdGl2ZU1hcmtzPn0gIENvbGxlY3Rpb24gb2YgZGF0YSB0YWJsZXMgd2l0aCB0aGUgYWN0aXZlIG1hcmtzXG4gICAqL1xuICBnZXRTZWxlY3RlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+O1xuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgaGlnaGxpZ2h0ZWQgbWFya3MgZm9yIGEgZ2l2ZW4gdmlzdWFsXG4gICAqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPEFjdGl2ZU1hcmtzPn0gIENvbGxlY3Rpb24gb2YgZGF0YSB0YWJsZXMgd2l0aCB0aGUgYWN0aXZlIG1hcmtzXG4gICAqL1xuICBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+O1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YXNvdXJjZUlkICBUaGUgaWQgb2YgdGhlIGRhdGFzb3VyY2VcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVBbGlhc2VzICBXaGV0aGVyIGFsaWFzIHZhbHVlcyBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gbWF4Um93cyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0byByZXRyaWV2ZVxuICAgKiBAcGFyYW0ge0FycmF5PHN0cmluZz59IGNvbHVtbnNUb0luY2x1ZGUgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IGNhcHRpb24uIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZUJ5SWQgQ29sdW1ucyB3aGljaCBzaG91bGQgYmUgcmV0dXJuZWQgc3BlY2lmaWVkIGJ5IG5hbWUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXREYXRhU291cmNlRGF0YUFzeW5jKFxuICAgIGRhdGFzb3VyY2VJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhc291cmNlSWQgIFRoZSBpZCBvZiB0aGUgZGF0YXNvdXJjZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naWNhbFRhYmxlSWQgIFRoZSBpZCBvZiB0aGUgbG9nY2lhbCB0YWJsZVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSb3dzIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIHJldHJpZXZlXG4gICAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nPn0gY29sdW1uc1RvSW5jbHVkZSBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgY2FwdGlvbi4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgbmFtZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldExvZ2ljYWxUYWJsZURhdGFBc3luYyhcbiAgICBkYXRhc291cmNlSWQ6IHN0cmluZyxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGNvbHVtbnNUb0luY2x1ZGU6IEFycmF5PHN0cmluZz4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBkYXRhc291cmNlSWQgIFRoZSBpZCBvZiB0aGUgZGF0YXNvdXJjZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbG9naWNhbFRhYmxlSWQgIFRoZSBpZCBvZiB0aGUgbG9nY2lhbCB0YWJsZVxuICAgKiBAcGFyYW0ge251bWJlcn0gcGFnZVJvd0NvdW50IFRoZSBudW1iZXIgb2Ygcm93cyBwZXIgcGFnZS4gVGhlIGRlZmF1bHQgYW5kIG1heGltdW0gaXMgMTAsMDAwIHJvd3MuXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBDb2x1bW5zIHdoaWNoIHNob3VsZCBiZSByZXR1cm5lZCBzcGVjaWZpZWQgYnkgbmFtZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnNcbiAgICogQHJldHVybnMge1Byb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPn0gIERhdGEgdGFibGUgd2l0aCB0aGUgcmVxdWVzdGVkIGRhdGFcbiAgICovXG4gIGdldExvZ2ljYWxUYWJsZURhdGFSZWFkZXJBc3luYyhcbiAgICBkYXRhc291cmNlSWQ6IHN0cmluZyxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgaW5jbHVkZURhdGFWYWx1ZXNPcHRpb246IEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uLFxuICApOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7VmlzdWFsSWR9IHZpc3VhbElkICBUaGUgdmlzdWFsIGlkXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBsb2dpY2FsVGFibGVJZCAgVGhlIGlkIG9mIHRoZSBsb2djaWFsIHRhYmxlXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlQWxpYXNlcyAgV2hldGhlciBhbGlhcyB2YWx1ZXMgc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpZ25vcmVTZWxlY3Rpb24gIFdoZXRoZXIgc2VsZWN0aW9ucyBpbiB0aGlzIHZpeiBzaG91bGQgYmUgaWdub3JlZCBpbiB0aGUgcmV0dXJuZWQgZGF0YVxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGluY2x1ZGVBbGxDb2x1bW5zICBXaGV0aGVyIHRvIGluY2x1ZGUgYWxsIGNvbHVtbnMgb3Igb25seSB0aGUgcmVmZXJlbmNlZCBjb2x1bW5zXG4gICAqIEBwYXJhbSB7QXJyYXl9IGNvbHVtbnNUb0luY2x1ZGVCeUlkIE92ZXJyaWRlcyBpbmNsdWRlQWxsQ29sdW1ucywgbGlzdHMgdGhlIGNvbHVtbnMgdG8gaW5jbHVkZS4gRW1wdHkgbWVhbnMgYWxsIGNvbHVtbnMuXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBtYXhSb3dzIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRvIHJldHJpZXZlXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT59ICBEYXRhIHRhYmxlIHdpdGggdGhlIHJlcXVlc3RlZCBkYXRhXG4gICAqL1xuICBnZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsXG4gICAgaWdub3JlQWxpYXNlczogYm9vbGVhbixcbiAgICBpZ25vcmVTZWxlY3Rpb246IGJvb2xlYW4sXG4gICAgaW5jbHVkZUFsbENvbHVtbnM6IGJvb2xlYW4sXG4gICAgY29sdW1uc1RvSW5jbHVkZUJ5SWQ6IEFycmF5PHN0cmluZz4sXG4gICAgbWF4Um93czogbnVtYmVyLFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmc6IGJvb2xlYW4sXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGxvZ2ljYWxUYWJsZUlkICBUaGUgaWQgb2YgdGhlIGxvZ2NpYWwgdGFibGVcbiAgICogQHBhcmFtIHtudW1iZXJ9IHBhZ2VSb3dDb3VudCBUaGUgbnVtYmVyIG9mIHJvd3MgcGVyIHBhZ2UuIFRoZSBkZWZhdWx0IGFuZCBtYXhpbXVtIGlzIDEwLDAwMCByb3dzLlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlnbm9yZUFsaWFzZXMgIFdoZXRoZXIgYWxpYXMgdmFsdWVzIHNob3VsZCBiZSBpZ25vcmVkIGluIHRoZSByZXR1cm5lZCBkYXRhXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gaWdub3JlU2VsZWN0aW9uICBXaGV0aGVyIHNlbGVjdGlvbnMgaW4gdGhpcyB2aXogc2hvdWxkIGJlIGlnbm9yZWQgaW4gdGhlIHJldHVybmVkIGRhdGFcbiAgICogQHBhcmFtIHtib29sZWFufSBpbmNsdWRlQWxsQ29sdW1ucyAgV2hldGhlciB0byBpbmNsdWRlIGFsbCBjb2x1bW5zIG9yIG9ubHkgdGhlIHJlZmVyZW5jZWQgY29sdW1uc1xuICAgKiBAcGFyYW0ge0FycmF5fSBjb2x1bW5zVG9JbmNsdWRlQnlJZCBPdmVycmlkZXMgaW5jbHVkZUFsbENvbHVtbnMsIGxpc3RzIHRoZSBjb2x1bW5zIHRvIGluY2x1ZGUuIEVtcHR5IG1lYW5zIGFsbCBjb2x1bW5zLlxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+fSAgRGF0YSB0YWJsZSB3aXRoIHRoZSByZXF1ZXN0ZWQgZGF0YVxuICAgKi9cbiAgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBsb2dpY2FsVGFibGVJZDogc3RyaW5nLFxuICAgIHBhZ2VSb3dDb3VudDogbnVtYmVyLFxuICAgIGlnbm9yZUFsaWFzZXM6IGJvb2xlYW4sXG4gICAgaWdub3JlU2VsZWN0aW9uOiBib29sZWFuLFxuICAgIGluY2x1ZGVBbGxDb2x1bW5zOiBib29sZWFuLFxuICAgIGNvbHVtbnNUb0luY2x1ZGVCeUlkOiBBcnJheTxzdHJpbmc+LFxuICAgIGluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uOiBJbmNsdWRlRGF0YVZhbHVlc09wdGlvbixcbiAgICBhcHBseVdvcmtzaGVldEZvcm1hdHRpbmcsXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPjtcblxuICAvKipcbiAgICogQHBhcmFtIHtWaXN1YWxJZH0gdmlzdWFsSWQgIFRoZSB2aXN1YWwgaWRcbiAgICovXG4gIGdldFN1bW1hcnlDb2x1bW5zSW5mb0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuQ29sdW1uPj47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB0YWJsZUlkICAgICBUaGUgdGFibGUgaWQgdXNlZCB0byBmZXRjaCBkYXRhLlxuICAgKiBAcGFyYW0gcGFnZU51bWJlciAgVGhlIHBhZ2UgbnVtYmVyICh6ZXJvLWJhc2VkKS5cbiAgICogQHBhcmFtIHBhZ2VTaXplICAgIFRoZSBwYWdlIHNpemUgb2YgdGhlIG93bmluZyBEYXRhVGFibGVSZWFkZXJcbiAgICogQHJldHVybnMgICAgICAgICAgIEEgRGF0YVRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBwYWdlLiBUaGUgbnVtYmVyIG9mIHJvd3MgcmV0dXJuZWRcbiAgICogICAgICAgICAgICAgICAgICAgIGNhbiBiZSBsZXNzIHRoYW4gcmVxdWVzdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEuXG4gICAqL1xuICBnZXRQYWdlQXN5bmModGFibGVJZDogc3RyaW5nLCBwYWdlTnVtYmVyOiBudW1iZXIsIHBhZ2VTaXplOiBudW1iZXIpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZT47XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB0YWJsZUlkICAgICBUaGUgdGFibGUgaWQgdXNlZCB0byBmZXRjaCBkYXRhLlxuICAgKi9cbiAgcmVsZWFzZUFzeW5jKHRhYmxlSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG59XG4iLCJpbXBvcnQgeyBJbnRlcm5hbEFwaURpc3BhdGNoZXIgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5IH0gZnJvbSAnLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgQWNjZXNzaWJpbGl0eVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0FjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9BbmltYXRpb25TZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBBbm5vdGF0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvQW5ub3RhdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IERhdGFTb3VyY2VTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9EYXRhU291cmNlU2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXhwb3J0U2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvRXhwb3J0U2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL0V4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBGaWx0ZXJTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9GaWx0ZXJTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBHZXREYXRhU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvR2V0RGF0YVNlcnZpY2VJbXBsJztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL05vdGlmaWNhdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlSW1wbCB9IGZyb20gJy4vaW1wbC9QYXJhbWV0ZXJzU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvU2VsZWN0aW9uU2VydmljZUltcGwnO1xuaW1wb3J0IHsgU2l6ZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1NpemVTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBWaXN1YWxNb2RlbFNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1Zpc3VhbE1vZGVsU2VydmljZUltcGwnO1xuaW1wb3J0IHsgVml6U2VydmljZUltcGwgfSBmcm9tICcuL2ltcGwvVml6U2VydmljZUltcGwnO1xuaW1wb3J0IHsgWm9uZVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9pbXBsL1pvbmVTZXJ2aWNlSW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckFsbFNoYXJlZFNlcnZpY2VzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgcmVnaXN0cnlJZDogbnVtYmVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBBbmltYXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBEYXRhU291cmNlU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgRXhwb3J0U2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgR2V0RGF0YVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEZpbHRlclNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsKGRpc3BhdGNoZXIpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFBhcmFtZXRlcnNTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBTZWxlY3Rpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBBbm5vdGF0aW9uU2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KHJlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgWm9uZVNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFNpemVTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBWaXN1YWxNb2RlbFNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFZpelNlcnZpY2VJbXBsKGRpc3BhdGNoZXIsIHJlZ2lzdHJ5SWQpKTtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LmdldChyZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IEV4dGVybmFsQ29udGV4dE1lbnVTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCByZWdpc3RyeUlkKSk7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQocmVnaXN0cnlJZCkucmVnaXN0ZXJTZXJ2aWNlKG5ldyBBY2Nlc3NpYmlsaXR5U2VydmljZUltcGwoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCkpO1xufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIEJhc2UgaW50ZXJmYWNlIGZvciBhbiBhcGkgc2VydmljZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFwaVNlcnZpY2Uge1xuICAvKipcbiAgICogR2V0cyB0aGUgbmFtZSBmb3IgdGhpcyBzZXJ2aWNlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2VydmljZU5hbWU6IHN0cmluZztcbn1cblxuLyoqXG4gKiBDb2xsZWN0aW9uIG9mIHNlcnZpY2UgbmFtZSB3aGljaCB3aWxsIGJlIHJlZ2lzdGVyZWQgaW4gdGhlIGFwaS1zaGFyZWQgcHJvamVjdFxuICovXG5leHBvcnQgY29uc3QgZW51bSBTZXJ2aWNlTmFtZXMge1xuICBBY2Nlc3NpYmlsaXR5ID0gJ2FjY2Vzc2liaWxpdHknLFxuICBBdXRoZW50aWNhdGlvbiA9ICdhdXRoZW50aWNhdGlvbicsXG4gIENsaWVudEluZm8gPSAnY2xpZW50LWluZm8tc2VydmljZScsXG4gIERhdGFTb3VyY2VTZXJ2aWNlID0gJ2RhdGEtc291cmNlLXNlcnZpY2UnLFxuICBHZXREYXRhID0gJ2dldC1kYXRhLXNlcnZpY2UnLFxuICBGaWx0ZXIgPSAnZmlsdGVyLXNlcnZpY2UnLFxuICBOb3RpZmljYXRpb24gPSAnbm90aWZpY2F0aW9uLXNlcnZpY2UnLFxuICBQYXJhbWV0ZXJzID0gJ3BhcmFtZXRlcnMtc2VydmljZScsXG4gIFNlbGVjdGlvbiA9ICdzZWxlY3Rpb24tc2VydmljZScsXG4gIEFubm90YXRpb24gPSAnYW5ub3RhdGlvbi1zZXJ2aWNlJyxcbiAgWm9uZSA9ICd6b25lLXNlcnZpY2UnLFxuICBBbmltYXRpb24gPSAnYW5pbWF0aW9uLXNlcnZpY2UnLFxuICBWaXogPSAndml6LXNlcnZpY2UnLFxuICBFeHRlcm5hbENvbnRleHRNZW51ID0gJ2V4dGVybmFsLWNvbnRleHQtbWVudS1zZXJ2aWNlJyxcbiAgSW5pdGlhbGl6YXRpb24gPSAnaW5pdGlhbGl6YXRpb24tc2VydmljZScsXG4gIFN0b3J5QWN0aXZhdGlvbiA9ICdzdG9yeS1hY3RpdmF0aW9uLXNlcnZpY2UnLFxuICBTaXplID0gJ3NpemUtc2VydmljZScsXG4gIEV4cG9ydCA9ICdleHBvcnQtc2VydmljZScsXG4gIFZpc3VhbE1vZGVsID0gJ3Zpc3VhbC1tb2RlbC1zZXJ2aWNlJyxcbn1cblxuLyoqXG4gKiBEbyBzb21lIGdsb2JhbCBkZWNsYXJhdGlvbnMgc28gd2UgY2FuIGNyZWF0ZSBhIHNpbmdsZXRvbiBvbiB0aGUgd2luZG93IG9iamVjdFxuICovXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIF9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeTogeyBbcmVnaXN0cnlJZDogbnVtYmVyXTogU2VydmljZVJlZ2lzdHJ5IH07XG4gIH1cbn1cblxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG4gIHdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnkgPSB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5IHx8IHt9O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNlcnZpY2VSZWdpc3RyeSB7XG4gIC8qKlxuICAgKiBSZWdpc3RlcnMgYSBuZXcgc2VydmljZSBpbnRvIHRoZSBzZXJ2aWNlIHJlZ2lzdHJ5LiBBbnkgZXhpc3Rpbmcgb25lIHdpbGxcbiAgICogYmUgb3ZlcndyaXR0ZW4uIHRoZSBzZXJ2aWNlIGlzIHJlZ2lzdGVyZWQgdW5kZXIgc2VydmljZS5zZXJ2aWNlTmFtZVxuICAgKlxuICAgKiBAcGFyYW0ge0FwaVNlcnZpY2V9IHNlcnZpY2UgVGhlIHNlcnZpdmUgdG8gcmVnaXN0ZXJcbiAgICovXG4gIHJlZ2lzdGVyU2VydmljZShzZXJ2aWNlOiBBcGlTZXJ2aWNlKTogdm9pZDtcblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBnaXZlbiBzZXJ2aWNlIGZyb20gdGhlIHJlZ2lzdHJ5LiBJZiB0aGVyZSBpcyBub3QgYVxuICAgKiBzZXJ2aWNlIHJlZ2lzdGVyZWQgdW5kZXIgdGhhdCBuYW1lLCB0aHJvd3MgYW5kIGVycm9yXG4gICAqXG4gICAqIEB0ZW1wbGF0ZSBUIFRoZSB0eXBlIG9mIHRoZSBzZXJ2aWNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZXJ2aWNlTmFtZSBUaGUgbmFtZSBvZiB0aGUgc2VydmljZS5cbiAgICogQHJldHVybnMge1R9IFRoZSByZXF1ZXN0ZWQgc2VydmljZVxuICAgKi9cbiAgZ2V0U2VydmljZTxUIGV4dGVuZHMgQXBpU2VydmljZT4oc2VydmljZU5hbWU6IHN0cmluZyk6IFQ7XG59XG5cbmNsYXNzIFNlcnZpY2VSZWdpc3RyeUltcGwgaW1wbGVtZW50cyBTZXJ2aWNlUmVnaXN0cnkge1xuICBwcml2YXRlIF9zZXJ2aWNlczogeyBbc2VydmljZU5hbWU6IHN0cmluZ106IEFwaVNlcnZpY2UgfTtcblxuICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgdGhpcy5fc2VydmljZXMgPSB7fTtcbiAgfVxuXG4gIHB1YmxpYyByZWdpc3RlclNlcnZpY2Uoc2VydmljZTogQXBpU2VydmljZSk6IHZvaWQge1xuICAgIHRoaXMuX3NlcnZpY2VzW3NlcnZpY2Uuc2VydmljZU5hbWVdID0gc2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZXJ2aWNlPFQgZXh0ZW5kcyBBcGlTZXJ2aWNlPihzZXJ2aWNlTmFtZTogc3RyaW5nKTogVCB7XG4gICAgaWYgKCF0aGlzLl9zZXJ2aWNlcy5oYXNPd25Qcm9wZXJ0eShzZXJ2aWNlTmFtZSkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgU2VydmljZSBub3QgcmVnaXN0ZXJlZDogJHtzZXJ2aWNlTmFtZX1gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5fc2VydmljZXNbc2VydmljZU5hbWVdIGFzIFQ7XG4gIH1cbn1cblxuLyoqXG4gKiBTdGF0aWMgY2xhc3MgdXNlZCBmb3IgZ2V0dGluZyBhY2Nlc3MgdG8gdGhlIHNpbmdsZSBpbnN0YW5jZVxuICogb2YgdGhlIEFwaVNlcnZpY2VSZWdpc3RyeSBhc3NvY2lhdGVkIHdpdGggdGhlIHJlZ2lzdHJ5SWQuXG4gKlxuICogRXh0ZW5zaW9ucyBieSBkZXNpZ24gZG9uJ3QgbmVlZCB0byBzdG9yZS9hY2Nlc3MgbXVsdGlwbGUgc2VydmljZSByZWdpc3RyaWVzLiBUaGVpciBzaW5nbGUgaW5zdGFuY2Ugb2YgU2VydmljZVJlZ2lzdHJ5IGlzXG4gKiBzdG9yZWQvYWNjZXNzIHdpdGggcmVnaXN0cnlJZCA9IDAuXG4gKlxuICogV2hlcmVhcyBFbWJlZGRpbmcgbmVlZHMgdG8gYmUgYXdhcmUgb2Ygd2hpY2ggU2VydmljZVJlZ2lzdHJ5IHRvIHVzZSB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSB2aXp6ZXMgZW1iZWRkZWQuXG4gKiBBbiBleGFtcGxlIG9mIGhvdyB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5IHdpbGwgbG9vayB3aGVuIHRoZXJlIGFyZSB0d28gdml6emVzOiB7IDAgOiBTZXJ2aWNlUmVnaXN0cnksIDEgOiBTZXJ2aWNlUmVnaXN0cnl9XG4gKiB3aGVyZSByZWdpc3RyeSBJRCBvZiAwICYgMSByZWZlcnMgdG8gdml6J3MgaW50ZXJuYWwgaWRlbnRpZmllciAod2hpY2ggaXMgZ2VuZXJhdGVkIGJ5IFZpek1hbmFnZXIpLlxuICovXG5leHBvcnQgY2xhc3MgQXBpU2VydmljZVJlZ2lzdHJ5IHtcbiAgLyoqXG4gICAqIEdldHMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgU2VydmljZVJlZ2lzdHJ5XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGdldChyZWdpc3RyeUlkOiBudW1iZXIpOiBTZXJ2aWNlUmVnaXN0cnkge1xuICAgIGlmICghd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeSB8fCAhd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeVtyZWdpc3RyeUlkXSkge1xuICAgICAgQXBpU2VydmljZVJlZ2lzdHJ5LnNldEluc3RhbmNlKHJlZ2lzdHJ5SWQsIG5ldyBTZXJ2aWNlUmVnaXN0cnlJbXBsKCkpO1xuICAgIH1cblxuICAgIGlmICghd2luZG93Ll9fdGFibGVhdUFwaVNlcnZpY2VSZWdpc3RyeVtyZWdpc3RyeUlkXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdTZXJ2aWNlIHJlZ2lzdHJ5IGZhaWxlZCcpO1xuICAgIH1cblxuICAgIHJldHVybiB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5W3JlZ2lzdHJ5SWRdO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdGhhdCBzZXRzIHRoZSBzZXJ2aWNlIHJlZ2lzdHJ5IGluc3RhbmNlIGZvciB0aGUgY29ycmVzcG9uZGluZyByZWdpc3RyeUlkLiBDYW4gYmUgdXNlZCBieSB1bml0IHRlc3RzXG4gICAqXG4gICAqIEBwYXJhbSB7U2VydmljZVJlZ2lzdHJ5fSBzZXJ2aWNlUmVnaXN0cnkgVGhlIG5ldyByZWdpc3RyeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRJbnN0YW5jZShyZWdpc3RyeUlkOiBudW1iZXIsIHNlcnZpY2VSZWdpc3RyeTogU2VydmljZVJlZ2lzdHJ5KTogdm9pZCB7XG4gICAgaWYgKCF3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5KSB7XG4gICAgICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5ID0ge307XG4gICAgfVxuICAgIHdpbmRvdy5fX3RhYmxlYXVBcGlTZXJ2aWNlUmVnaXN0cnlbcmVnaXN0cnlJZF0gPSBzZXJ2aWNlUmVnaXN0cnk7XG4gIH1cblxuICAvKipcbiAgICogT25seSB1c2VkIGJ5IHVuaXQgdGVzdHNcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgY2xlYXJSZWdpc3RyeSgpOiB2b2lkIHtcbiAgICB3aW5kb3cuX190YWJsZWF1QXBpU2VydmljZVJlZ2lzdHJ5ID0ge307XG4gIH1cblxuICAvLyBQcml2YXRlIHRvIGF2b2lkIGFueW9uZSBjb25zdHJ1Y3RpbmcgdGhpc1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cbn1cbiIsImltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgVmVyYklkLCBWaXN1YWxJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUb29sdGlwVGV4dFJlcXVlc3RNb2RlbCB9IGZyb20gJy4uLy4uL01vZGVscy9BY2Nlc3NpYmlsaXR5TW9kZWxzJztcbmltcG9ydCB7IEFjY2Vzc2liaWxpdHlTZXJ2aWNlIH0gZnJvbSAnLi4vQWNjZXNzaWJpbGl0eVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEFjY2Vzc2liaWxpdHlTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuQWNjZXNzaWJpbGl0eTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb29sdGlwVGV4dEFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgdHVwbGVJZDogbnVtYmVyKTogUHJvbWlzZTxTdHJpbmc+IHtcbiAgICBsZXQgdG9vbHRpcFRleHRSZXF1ZXN0ID0gbmV3IFRvb2x0aXBUZXh0UmVxdWVzdE1vZGVsKHZpc3VhbElkLCB0dXBsZUlkKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRUb29sdGlwVGV4dEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Ub29sdGlwVGV4dFJlcXVlc3RdOiB0b29sdGlwVGV4dFJlcXVlc3QsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFRvb2x0aXBUZXh0LCBwYXJhbWV0ZXJzKS50aGVuPFN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIFN0cmluZztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2xlYXZlTWFya05hdmlnYXRpb25Bc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuUmFpc2VMZWF2ZU1hcmtOYXZOb3RpZmljYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFJlcGxheVNwZWVkVHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyBhcyBFeHRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IEVycm9ySGVscGVycyB9IGZyb20gJy4uLy4uL1V0aWxzL0Vycm9ySGVscGVycyc7XG5pbXBvcnQgeyBBbmltYXRpb25TZXJ2aWNlIH0gZnJvbSAnLi4vQW5pbWF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgQW5pbWF0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBBbmltYXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuQW5pbWF0aW9uO1xuICB9XG5cbiAgcHVibGljIHJlcGxheUFzeW5jKHJlcGxheVNwZWVkOiBSZXBsYXlTcGVlZFR5cGUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLlJlcGxheVNwZWVkXTogMS4wLFxuICAgIH07XG5cbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RW51bVZhbHVlPFJlcGxheVNwZWVkVHlwZT4ocmVwbGF5U3BlZWQsIFJlcGxheVNwZWVkVHlwZSwgJ1JlcGxheVNwZWVkVHlwZScpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuUmVwbGF5U3BlZWRdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLnNldFJlcGxheVNwZWVkVHlwZS5jb252ZXJ0KHJlcGxheVNwZWVkKTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlcGxheUFuaW1hdGlvbiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFubm90YXRlRW51bSwgQW5ub3RhdGlvbiwgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQsIFZpc3VhbElkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyB9IGZyb20gJy4uLy4uL0VudW1NYXBwaW5ncy9JbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MnO1xuaW1wb3J0IHsgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyLCBUdXBsZVNlbGVjdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vTW9kZWxzL1NlbGVjdGlvbk1vZGVscyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgQW5ub3RhdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Bbm5vdGF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgQW5ub3RhdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgQW5ub3RhdGlvblNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5Bbm5vdGF0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBhbm5vdGF0ZSBhIG1hcmsgb24gdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBtYXJrXG4gICAqIEBwYXJhbSBhbm5vdGF0aW9uVGV4dFxuICAgKi9cbiAgcHVibGljIGFubm90YXRlTWFya0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgbWFyazogQ29udHJhY3QuTWFya0luZm8sIGFubm90YXRpb25UZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gdGhpcy5wYXJzZU1hcmtTZWxlY3Rpb25JZHMoW21hcmtdKTtcbiAgICBjb25zdCBkdW1teVRhcmdldFBvaW50ID0geyB4OiAwLCB5OiAwIH07XG4gICAgY29uc3QgZm9ybWF0dGVkVGV4dCA9IGA8Zm9ybWF0dGVkLXRleHQ+PHJ1bj4ke2Fubm90YXRpb25UZXh0fTwvcnVuPjwvZm9ybWF0dGVkLXRleHQ+YDtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhbm5vdGF0ZU1hcmtBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuVmlzdWFsSWRdOiB2aXN1YWxJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Bbm5vdGF0ZUVudW1dOiBBbm5vdGF0ZUVudW0uTWFyayxcbiAgICAgIFtQYXJhbWV0ZXJJZC5UYXJnZXRQb2ludF06IGR1bW15VGFyZ2V0UG9pbnQsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0aW9uTGlzdF06IFtzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb25dLFxuICAgICAgW1BhcmFtZXRlcklkLkZvcm1hdHRlZFRleHRdOiBmb3JtYXR0ZWRUZXh0LFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuQ3JlYXRlQW5ub3RhdGlvbiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIC8vIEV4cGVjdGluZyBhbiBlbXB0eSBtb2RlbCBhbmQgaGVuY2UgdGhlIHZvaWQgcmVzcG9uc2UuXG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHJldHJpZXZlIGFubm90YXRpb25zIGZvciB0aGUgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8QW5ub3RhdGlvbj4+fVxuICAgKi9cbiAgcHVibGljIGdldEFubm90YXRpb25zQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRBbm5vdGF0aW9uc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0QW5ub3RhdGlvbnMsIHBhcmFtZXRlcnMpLnRoZW48QXJyYXk8Q29udHJhY3QuQW5ub3RhdGlvbj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgYW5ub3RhdGlvbnNMaXN0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEFycmF5PEFubm90YXRpb24+O1xuICAgICAgcmV0dXJuIHRoaXMuYW5ub3RhdGlvbkZpbHRlck1hcChhbm5vdGF0aW9uc0xpc3QpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byByZW1vdmUgYW4gYW5ub3RhdGlvbiBmcm9tIGEgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHBhcmFtIGFubm90YXRpb25cbiAgICovXG4gIHB1YmxpYyByZW1vdmVBbm5vdGF0aW9uQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VBbm5vdGF0aW9uU2VsZWN0aW9uSWRzKFthbm5vdGF0aW9uXSk7XG5cbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVtb3ZlQW5ub3RhdGlvbkFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvbkxpc3RdOiBbc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uXSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlbW92ZUFubm90YXRpb24sIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBwcmVwYXJlIHRoZSBwcmVzIG1vZGVscyBmb3Igc2VsZWN0aW9uIGJ5IE1hcmtzSW5mb1xuICAgKiBAcGFyYW0gbWFya3NcbiAgICovXG4gIHByaXZhdGUgcGFyc2VNYXJrU2VsZWN0aW9uSWRzKG1hcmtzOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IGlkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG4gICAgbWFya3MuZm9yRWFjaCgobWFyaykgPT4ge1xuICAgICAgY29uc3QgdHVwbGVJZDogbnVtYmVyIHwgdW5kZWZpbmVkID0gbWFyay50dXBsZUlkO1xuICAgICAgaWYgKHR1cGxlSWQgIT09IHVuZGVmaW5lZCAmJiB0dXBsZUlkICE9PSBudWxsICYmIHR1cGxlSWQgPiAwKSB7XG4gICAgICAgIGlkcy5wdXNoKHR1cGxlSWQudG9TdHJpbmcoKSk7IC8vIGNvbGxlY3QgdGhlIHR1cGxlIGlkc1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIHR1cGxlSWQnKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgLy8gdHVwbGUgaWRzIGJhc2VkIHNlbGVjdGlvblxuICAgICAgY29uc3QgdHVwbGVTZWxlY3Rpb25Nb2RlbDogVHVwbGVTZWxlY3Rpb25Nb2RlbCA9IG5ldyBUdXBsZVNlbGVjdGlvbk1vZGVsKCk7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLnNlbGVjdGlvblR5cGUgPSAndHVwbGVzJztcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwub2JqZWN0SWRzID0gaWRzO1xuICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uID0gdHVwbGVTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBwcmVwYXJlIHRoZSBwcmVzIG1vZGVscyBmb3Igc2VsZWN0aW9uIGJ5IE1hcmtBbm5vdGF0aW9uSW5mb1xuICAgKiBAcGFyYW0gbWFya3NcbiAgICovXG4gIHByaXZhdGUgcGFyc2VBbm5vdGF0aW9uU2VsZWN0aW9uSWRzKGFubm90YXRpb25zOiBBcnJheTxDb250cmFjdC5Bbm5vdGF0aW9uPik6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciB7XG4gICAgY29uc3QgaWRzOiBBcnJheTxzdHJpbmc+ID0gW107XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IG5ldyBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIoKTtcbiAgICBhbm5vdGF0aW9ucy5mb3JFYWNoKChhbm5vdGF0aW9uKSA9PiB7XG4gICAgICBjb25zdCBhbm5vdGF0aW9uSWQ6IG51bWJlciB8IHVuZGVmaW5lZCA9IGFubm90YXRpb24uYW5ub3RhdGlvbklkO1xuICAgICAgaWYgKGFubm90YXRpb25JZCAhPT0gdW5kZWZpbmVkICYmIGFubm90YXRpb25JZCAhPT0gbnVsbCAmJiBhbm5vdGF0aW9uSWQgPj0gMCkge1xuICAgICAgICBpZHMucHVzaChhbm5vdGF0aW9uSWQudG9TdHJpbmcoKSk7IC8vIGNvbGxlY3QgdGhlIGFubm90YXRpb24gaWRzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgYW5ub3RhdGlvbklkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgaWYgKGlkcy5sZW5ndGggIT09IDApIHtcbiAgICAgIC8vIGFubm90YXRpb24gaWRzIGJhc2VkIHNlbGVjdGlvblxuICAgICAgY29uc3QgdHVwbGVTZWxlY3Rpb25Nb2RlbDogVHVwbGVTZWxlY3Rpb25Nb2RlbCA9IG5ldyBUdXBsZVNlbGVjdGlvbk1vZGVsKCk7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLnNlbGVjdGlvblR5cGUgPSAnYW5ub3RhdGlvbnMnO1xuICAgICAgdHVwbGVTZWxlY3Rpb25Nb2RlbC5vYmplY3RJZHMgPSBpZHM7XG4gICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5zZWxlY3Rpb24gPSB0dXBsZVNlbGVjdGlvbk1vZGVsO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZWxDb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIG1hcCBBbm5vdGF0aW9uIHRvIE1hcmtBbm5vdGF0aW9uSW5mb1xuICAgKiBAcGFyYW0gYW5ub3RhdGlvblxuICAgKiBAcmV0dXJucyB7QW5ub3RhdGlvbn1cbiAgICovXG4gIHByaXZhdGUgbWFwQW5ub3RhdGlvbihhbm5vdGF0aW9uOiBBbm5vdGF0aW9uKTogQ29udHJhY3QuQW5ub3RhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGFubm90YXRpb25IVE1MOiBhbm5vdGF0aW9uLmFubm90YXRpb25UZXh0LFxuICAgICAgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uLmFubm90YXRpb25JZCxcbiAgICAgIGFubm90YXRpb25UZXh0OiBhbm5vdGF0aW9uLmFubm90YXRpb25QbGFpblRleHQsXG4gICAgICBhbm5vdGF0aW9uVHlwZTogSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzLmFubm90YXRpb25UeXBlLmNvbnZlcnQoYW5ub3RhdGlvbi5hbm5vdGF0ZUVudW0pLFxuICAgICAgdHVwbGVJZDogYW5ub3RhdGlvbi50dXBsZUlkISxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbHRlciB0aGUgQW5ub3RhdGlvbnMgdG8gTWFyayBBbm5vdGF0aW9ucywgYW5kIG1hcCB0aGVtIHRvIE1hcmtBbm5vdGF0aW9uSW5mb1xuICAgKiBAcGFyYW0gYW5ub3RhdGlvbnNcbiAgICogQHJldHVybnMge0FycmF5PEFubm90YXRpb24+fVxuICAgKi9cbiAgcHJpdmF0ZSBhbm5vdGF0aW9uRmlsdGVyTWFwKGFubm90YXRpb25zOiBBcnJheTxBbm5vdGF0aW9uPik6IEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+IHtcbiAgICBjb25zdCBhbm5vdGF0aW9uSW5mb3MgPSBhbm5vdGF0aW9ucy5tYXAoKGFubm90YXRpb24pID0+IHRoaXMubWFwQW5ub3RhdGlvbihhbm5vdGF0aW9uKSk7XG5cbiAgICByZXR1cm4gYW5ub3RhdGlvbkluZm9zO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFbWJlZGRpbmdCb290c3RyYXBJbmZvLCBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDbGllbnRJbmZvU2VydmljZSB9IGZyb20gJy4uL0NsaWVudEluZm9TZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBDbGllbnRJbmZvU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBDbGllbnRJbmZvU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkNsaWVudEluZm87XG4gIH1cblxuICBwdWJsaWMgZ2V0Q2xpZW50SW5mb0FzeW5jKCk6IFByb21pc2U8RW1iZWRkaW5nQm9vdHN0cmFwSW5mbz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RW1iZWRkaW5nQ2xpZW50SW5mbztcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0Q2xpZW50SW5mb0FzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEVtYmVkZGluZ0Jvb3RzdHJhcEluZm8+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY2xpZW50SW5mbyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFbWJlZGRpbmdCb290c3RyYXBJbmZvO1xuICAgICAgcmV0dXJuIGNsaWVudEluZm87XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCAqIGFzIEludGVybmFsQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnksXG4gIERhdGFTY2hlbWEsXG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXIsXG4gIExvZ2ljYWxUYWJsZUluZm8sXG4gIFBhcmFtZXRlcklkLFxuICBUYWJsZUluZm8sXG4gIFRhYmxlSW5mb3MsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXRhU291cmNlIH0gZnJvbSAnLi4vLi4vRGF0YVNvdXJjZSc7XG5pbXBvcnQgeyBGaWVsZCB9IGZyb20gJy4uLy4uL0ZpZWxkJztcbmltcG9ydCB7IERhdGFTb3VyY2VJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9EYXRhU291cmNlSW1wbCc7XG5pbXBvcnQgeyBGaWVsZEltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0ZpZWxkSW1wbCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRGF0YVNvdXJjZVNlcnZpY2UgfSBmcm9tICcuLi9EYXRhU291cmNlU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuZXhwb3J0IGNsYXNzIERhdGFTb3VyY2VTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIERhdGFTb3VyY2VTZXJ2aWNlIHtcbiAgLy8gU2luY2UgT2JqZWN0IE1vZGVsIGlzIHN1cHBvcnRlZCBzaW5jZSBUYWJsZWF1IDIwMjAuMiwgRGF0YVNvdXJjZVNlcnZpY2VJbXBsIGNhbiBiZSBpbml0aWFsaXplZCB3aXRoIHRoZVxuICAvLyBwbGF0Zm9ybSB2ZXJzaW9uIHdoZW4gT00gd2FzIHN1cHBvcnRlZC4gT25jZSB3ZSBkcm9wIHN1cHBvcnQgZm9yIFRhYmxlYXUgdmVyc2lvbnMgPD0gMjAyMC4xLCBhbGwgYWRkaXRpb25hbFxuICAvLyBjb2RlIGluIGhlcmUgZm9yIE9iamVjdCBNb2RlbCBjYW4gYmUgcmVtb3ZlZC5cbiAgcHVibGljIGNvbnN0cnVjdG9yKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgcmVnaXN0cnlJZDogbnVtYmVyKSB7XG4gICAgc3VwZXIoZGlzcGF0Y2hlciwgcmVnaXN0cnlJZCk7XG4gIH1cbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuRGF0YVNvdXJjZVNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgcmVmcmVzaEFzeW5jKGRhdGFTb3VyY2VJZD86IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdyZWZyZXNoQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkRlbHRhVGltZU1zXTogMCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaG91bGRSZWZyZXNoRFNdOiB0cnVlLFxuICAgIH07XG5cbiAgICAvLyBPbiBzZXJ2ZXI6IE5vdCBwYXNzaW5nIHRoZSBkYXRhc291cmNlIGlkIHdpbGwgcmVmcmVzaCBhbGwgZGF0YXNvdXJjZXMuXG4gICAgaWYgKGRhdGFTb3VyY2VJZCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5EYXRhU291cmNlSWRdID0gZGF0YVNvdXJjZUlkO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlJlZnJlc2hEYXRhU291cmNlLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEFjdGl2ZVRhYmxlc0FzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxUYWJsZUluZm8+PiB7XG4gICAgY29uc3Qgam9pblBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRBY3RpdmVUYWJsZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YVNvdXJjZUlkLFxuICAgIH07XG5cbiAgICAvLyBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0YWJsZXMgdXNlZCBieSB0aGlzIGNvbm5lY3Rpb25cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRBY3RpdmVUYWJsZXMsIGpvaW5QYXJhbWV0ZXJzKS50aGVuPEFycmF5PFRhYmxlSW5mbz4+KChqb2luUmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlSW5mb3MgPSBqb2luUmVzcG9uc2UucmVzdWx0IGFzIFRhYmxlSW5mb3M7XG5cbiAgICAgIC8vIGdldEFjdGl2ZVRhYmxlcyBpcyB1bnN1cHBvcnRlZCBmb3IgY3ViZXMgYW5kIEdBLiBXZSBkbyBub3QgaGF2ZSBhIGNvbm5lY3Rpb24gdHlwZSBwcm9wZXJ0eVxuICAgICAgLy8gYXZhaWxhYmxlIGZyb20gdGhlIHBsYXRmb3JtIChpbnRlbnRpb25hbGx5LCB0byByZWR1Y2UgY29kZSBjaHVybiBhcyBuZXcgY29ubmVjdGlvbnMgYXJlIGFkZGVkKS5cbiAgICAgIC8vIEluc3RlYWQsanVzdCBjaGVjayBpZiBhbnkgdGFibGVzIGFyZSByZXR1cm5lZC4gVGhpcyBhcnJheSB3aWxsIGJlIGVtcHR5IGZvciBhbnkgbm9uLXRhYmxlIGJhc2VkIGRhdGFzb3VyY2UuXG4gICAgICBpZiAodGFibGVJbmZvcy50YWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5VbnN1cHBvcnRlZE1ldGhvZEZvckRhdGFTb3VyY2VUeXBlLCBgZ2V0QWN0aXZlVGFibGVzIGlzIG5vdCBzdXBwb3J0ZWQgZm9yOiAke2RhdGFTb3VyY2VJZH1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRhYmxlSW5mb3MudGFibGVzO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldERhdGFTb3VyY2VzQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkKTogUHJvbWlzZTxEYXRhU2NoZW1hPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldERhdGFTb3VyY2VzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXREYXRhU291cmNlcywgcGFyYW1ldGVycykudGhlbjxEYXRhU2NoZW1hPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRhdGFTY2hlbWEgPSByZXNwb25zZS5yZXN1bHQgYXMgRGF0YVNjaGVtYTtcbiAgICAgIHJldHVybiBkYXRhU2NoZW1hO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEFsbERhdGFTb3VyY2VzQXN5bmMoKTogUHJvbWlzZTxEYXRhU2NoZW1hPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEFsbERhdGFTb3VyY2VzQXN5bmMnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0QWxsRGF0YVNvdXJjZXMsIHBhcmFtZXRlcnMpLnRoZW48RGF0YVNjaGVtYT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkYXRhU2NoZW1hID0gcmVzcG9uc2UucmVzdWx0IGFzIERhdGFTY2hlbWE7XG4gICAgICByZXR1cm4gZGF0YVNjaGVtYTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDb25uZWN0aW9uU3VtbWFyaWVzQXN5bmMoZGF0YVNvdXJjZUlkOiBzdHJpbmcpOiBQcm9taXNlPENvbm5lY3Rpb25EZXNjcmlwdGlvblN1bW1hcnlbXT4ge1xuICAgIGNvbnN0IHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldENvbm5lY3Rpb25TdW1tYXJpZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YVNvdXJjZUlkLFxuICAgIH07XG5cbiAgICAvLyBHZXQgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSB0YWJsZXMgdXNlZCBieSB0aGlzIGNvbm5lY3Rpb25cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJpZXMsIHBhcmFtcykudGhlbjxDb25uZWN0aW9uRGVzY3JpcHRpb25TdW1tYXJ5W10+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZGVzY3JpcHRpb25TdW1tYXJpZXMgPSByZXNwb25zZS5yZXN1bHQgYXMgQ29ubmVjdGlvbkRlc2NyaXB0aW9uU3VtbWFyeVtdO1xuICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uU3VtbWFyaWVzO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEZpZWxkQXN5bmMoZ2xvYmFsZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPENvbnRyYWN0LkZpZWxkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRGaWVsZEFuZERhdGFTb3VyY2U7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEZpZWxkQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkZpZWxkSWRdOiBnbG9iYWxmaWVsZE5hbWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5GaWVsZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkYXRhU291cmNlID0gcmVzcG9uc2UucmVzdWx0W1BhcmFtZXRlcklkLkRhdGFTb3VyY2VdIGFzIEludGVybmFsQ29udHJhY3QuRGF0YVNvdXJjZTtcbiAgICAgIGNvbnN0IGZpZWxkID0gcmVzcG9uc2UucmVzdWx0W1BhcmFtZXRlcklkLkZpZWxkXSBhcyBGaWVsZDtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRGaWVsZChmaWVsZCwgdGhpcy5jb252ZXJ0RGF0YVNvdXJjZShkYXRhU291cmNlKSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TG9naWNhbFRhYmxlc0FzeW5jKGRhdGFTb3VyY2VJZDogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxMb2dpY2FsVGFibGVJbmZvPj4ge1xuICAgIGNvbnN0IHBhcmFtczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldExvZ2ljYWxUYWJsZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGF0YVNvdXJjZUlkXTogZGF0YVNvdXJjZUlkLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0TG9naWNhbFRhYmxlcywgcGFyYW1zKS50aGVuPEFycmF5PExvZ2ljYWxUYWJsZUluZm8+PigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8TG9naWNhbFRhYmxlSW5mbz47XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+IHtcbiAgICBjb25zdCBwYXJhbXM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRVbmRlcmx5aW5nVGFibGVzLCBwYXJhbXMpLnRoZW48QXJyYXk8TG9naWNhbFRhYmxlSW5mbz4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxMb2dpY2FsVGFibGVJbmZvPjtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydEZpZWxkKGZpZWxkOiBJbnRlcm5hbENvbnRyYWN0LkZpZWxkLCBkYXRhU291cmNlOiBDb250cmFjdC5EYXRhU291cmNlKTogQ29udHJhY3QuRmllbGQge1xuICAgIHJldHVybiBuZXcgRmllbGQobmV3IEZpZWxkSW1wbChmaWVsZCwgZGF0YVNvdXJjZSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0RGF0YVNvdXJjZShkYXRhU291cmNlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFTb3VyY2UpOiBDb250cmFjdC5EYXRhU291cmNlIHtcbiAgICByZXR1cm4gbmV3IERhdGFTb3VyY2UobmV3IERhdGFTb3VyY2VJbXBsKGRhdGFTb3VyY2UsIHRoaXMuX3JlZ2lzdHJ5SWQpKTtcbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgQ3Jvc3N0YWJGaWxlRm9ybWF0LFxuICBFeHBvcnREYXRhT3B0aW9ucyxcbiAgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIFNoZWV0VHlwZSBhcyBFeHRlcm5hbFNoZWV0VHlwZSxcbiAgU2hhcmVkRXJyb3JDb2Rlcyxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEV4ZWN1dGVQYXJhbWV0ZXJzLFxuICBFeHBvcnRDcm9zc3RhYlNoZWV0TWFwLFxuICBFeHBvcnRGaWxlLFxuICBFeHBvcnRQREZPcHRpb25zIGFzIEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgUGFyYW1ldGVySWQsXG4gIFZlcmJJZCxcbiAgVmlzdWFsSWQsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uLy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMgfSBmcm9tICcuLi8uLi9VdGlscy9FcnJvckhlbHBlcnMnO1xuaW1wb3J0IHsgRXhwb3J0SGVscGVycyB9IGZyb20gJy4uLy4uL1V0aWxzL0V4cG9ydEhlbHBlcnMnO1xuaW1wb3J0IHsgRXhwb3J0U2VydmljZSB9IGZyb20gJy4uL0V4cG9ydFNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIEV4cG9ydFNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRXhwb3J0U2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLkV4cG9ydDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRFeHBvcnRDcm9zc3RhYlNoZWV0TWFwQXN5bmMoY3VycmVudFNoZWV0VHlwZTogRXh0ZXJuYWxTaGVldFR5cGUpOiBQcm9taXNlPEV4cG9ydENyb3NzdGFiU2hlZXRNYXA+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldEV4cG9ydENyb3NzdGFiU2hlZXRNYXA7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEV4cG9ydENyb3NzdGFiU2hlZXRNYXBBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VycmVudFNoZWV0VHlwZV06IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncy5zaGVldFR5cGUuY29udmVydChjdXJyZW50U2hlZXRUeXBlKSxcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxFeHBvcnRDcm9zc3RhYlNoZWV0TWFwPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHBvcnRDcm9zc3RhYlNoZWV0TWFwO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBleHBvcnRDcm9zc3RhYkFzeW5jKFxuICAgIHNoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZvcm1hdDogQ3Jvc3N0YWJGaWxlRm9ybWF0LFxuICAgIGV4cG9ydGFibGVXb3Jrc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPixcbiAgICBjdXJyZW50U2hlZXRUeXBlOiBFeHRlcm5hbFNoZWV0VHlwZSxcbiAgKTogUHJvbWlzZTxFeHBvcnRGaWxlPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVNoZWV0TmFtZShleHBvcnRhYmxlV29ya3NoZWV0TmFtZXMsIHNoZWV0TmFtZSk7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxDcm9zc3RhYkZpbGVGb3JtYXQ+KGZvcm1hdCwgQ3Jvc3N0YWJGaWxlRm9ybWF0LCAnQ3Jvc3N0YWJGaWxlRm9ybWF0Jyk7XG5cbiAgICAvLyBUaGUgcHJlcyBsYXllciBjb21tYW5kIGZvciBleHBvcnRpbmcgQ3Jvc3N0YWIgdXNlcyBTaW1wbGVTaGVldElkZW50aWZpZXJzIGluc3RlYWQgb2Ygc2hlZXQgbmFtZXMuXG4gICAgLy8gVGhlIGV4dGVuc2lvbnMtYW5kLWVtYmVkZGluZy1hcGkgY3VycmVudCBkb2VzIG5vdCBzdG9yZSByZWZlcmVuY2VzIHRvIHRoZSBTaW1wbGVTaGVldElkZW50aWZpZXJzIG9mIGl0cyBzaGVldHNcbiAgICAvLyBzbyB3ZSBjYWxsIGEgcHJlcyBsYXllciBjb21tYW5kIHRoYXQgZ2l2ZXMgdXMgdGhlIFNpbXBsZVNoZWV0SWRlbnRpZmllciBmb3IgZWFjaCBzaGVldCBuYW1lIHRoYXQgYXBwZWFycyBpbiB0aGVcbiAgICAvLyBleHBvcnQgQ3Jvc3N0YWIgZGlhbG9nIHBvcHVwLlxuICAgIGNvbnN0IHNoZWV0TmFtZVRvSWRNYXAgPSBhd2FpdCB0aGlzLmdldEV4cG9ydENyb3NzdGFiU2hlZXRNYXBBc3luYyhjdXJyZW50U2hlZXRUeXBlKTtcbiAgICBpZiAoIXNoZWV0TmFtZVRvSWRNYXBbc2hlZXROYW1lXSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdtaXNzaW5nIHNoZWV0IGRvYyBpZCBmcm9tIHNoZWV0TWFwJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2V4cG9ydENyb3NzdGFiQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlNoZWV0SWRlbnRpZmllcl06IHNoZWV0TmFtZVRvSWRNYXBbc2hlZXROYW1lXSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TZW5kTm90aWZpY2F0aW9uc106IHRydWUsIC8vIHNlbmQgbm90aWZpY2F0aW9uIG9uIHByZXMgbGF5ZXIgdGhhdCB0cmlnZ2VycyBmaWxlIGRvd25sb2FkXG4gICAgfTtcblxuICAgIC8vIHByZXMgbGF5ZXIgY29tbWFuZCBpbnZva2VkIGRlcGVuZHMgb24gdGhlIGNyb3NzdGFiIGZpbGUgZm9ybWF0XG4gICAgbGV0IHZlcmI7XG4gICAgc3dpdGNoIChmb3JtYXQpIHtcbiAgICAgIGNhc2UgQ3Jvc3N0YWJGaWxlRm9ybWF0LkNTVjpcbiAgICAgICAgdmVyYiA9IFZlcmJJZC5FeHBvcnRDcm9zc3RhYkNzdkRvd25sb2FkO1xuICAgICAgICAvLyBDU1Ygb25seSBwYXJhbWV0ZXI6IHNlZSBicm93c2VyLWNsaWVudHMvZXhwb3J0LWNyb3NzdGFiLW9wdGlvbnMtZGlhbG9nIHJlcG9cbiAgICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Vc2VUYWJEZWxpbWl0ZXJzXSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBDcm9zc3RhYkZpbGVGb3JtYXQuRXhjZWw6XG4gICAgICAgIHZlcmIgPSBWZXJiSWQuRXhwb3J0Q3Jvc3N0YWJFeGNlbERvd25sb2FkO1xuICAgICAgICBicmVhaztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAndW5zdXBwb3J0ZWQgQ3Jvc3N0YWIgZmlsZSBmb3JtYXQuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKVxuICAgICAgLnRoZW48RXhwb3J0RmlsZT4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHBvcnRGaWxlO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5Dcm9zc3RhYkNyZWF0aW9uRXJyb3IsICdBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGRvY3VtZW50LicpO1xuICAgICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZXhwb3J0RGF0YUFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgb3B0aW9uczogRXhwb3J0RGF0YU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5RXhwb3J0RGF0YU9wdGlvbnMob3B0aW9ucyk7XG5cbiAgICAvLyBSZW1vdmUgYW55IGR1cGxpY2F0ZXMgZnJvbSB0aGUgaW5wdXQgYXJyYXlcbiAgICBjb25zdCBjb2x1bW5zQXNTZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldChvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkKTtcbiAgICBjb25zdCBjb2x1bW5zVG9JbmNsdWRlQnlJZCA9IEFycmF5LmZyb20oY29sdW1uc0FzU2V0KTtcblxuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuRXhwb3J0RGF0YURvd25sb2FkO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleHBvcnREYXRhQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgICBbUGFyYW1ldGVySWQuSWdub3JlQWxpYXNlc106IG9wdGlvbnMuaWdub3JlQWxpYXNlcyA/PyBmYWxzZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Db2x1bW5zVG9JbmNsdWRlQnlJZF06IGNvbHVtbnNUb0luY2x1ZGVCeUlkLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpXG4gICAgICAudGhlbjx2b2lkPigoKSA9PiB7fSlcbiAgICAgIC5jYXRjaCgoKSA9PiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5EYXRhQ3JlYXRpb25FcnJvciwgJ0FuIHVuZXhwZWN0ZWQgZXJyb3Igb2NjdXJyZWQgd2hpbGUgZ2VuZXJhdGluZyB0aGUgZG9jdW1lbnQuJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBleHBvcnRQb3dlclBvaW50QXN5bmMoc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPiwgZXhwb3J0U2NlbmFyaW9zOiBFeHBvcnRTY2VuYXJpb3NGb3JQREZBbmRQb3dlclBvaW50KTogUHJvbWlzZTxFeHBvcnRGaWxlPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVNoZWV0TmFtZXNGb3JQREZBbmRQUFQoc2hlZXROYW1lcywgZXhwb3J0U2NlbmFyaW9zKTtcblxuICAgIC8vIE5vdGU6IHRoZSBFeHBvcnRPcmlnaW5VcmwgcGFyYW0gaXMgbGlzdGVkIGFzIG9wdGlvbmFsIGZvciB0aGUgcHJlcyBsYXllciBjb21tYW5kIHdlIGFyZSBpbnZva2luZzsgaG93ZXZlcixcbiAgICAvLyByZWNlbnQgY2hhbmdlcyB3ZXJlIG1hZGUgdGhhdCBlbmZvcmNlZCB0aGUgdXNlIG9mIHRoZSBlbXB0eSBzdHJpbmcgd2hlbiBpbnZva2luZyB0aGlzIGNvbW1hbmQgd2l0aCBubyBFeHBvcnRPcmlnaW5VcmwuXG4gICAgLy8gc2VlIGJyb3dzZXItY2xpZW50cy9leHBvcnQtcG93ZXJwb2ludC1vcHRpb25zLWRpYWxvZyByZXBvLlxuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuRXhwb3J0UG93ZXJwb2ludERvd25sb2FkO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdleHBvcnRQb3dlclBvaW50QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkV4cG9ydE9yaWdpblVybF06ICcnLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGVkU2hlZXROYW1lc106IHNoZWV0TmFtZXMsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycylcbiAgICAgIC50aGVuPEV4cG9ydEZpbGU+KChyZXNwb25zZSkgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgRXhwb3J0RmlsZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2goKCkgPT4ge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICAgIFNoYXJlZEVycm9yQ29kZXMuUG93ZXJQb2ludENyZWF0aW9uRXJyb3IsXG4gICAgICAgICAgJ0FuIGVycm9yIG9jY3VyZWQgd2hpbGUgYXR0ZW1wdGluZyB0byBnZW5lcmF0ZSB0aGUgUG93ZXJQb2ludCBmaWxlLicsXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBleHBvcnRQREZBc3luYyhcbiAgICBzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIGV4dGVybmFsRXhwb3J0UGRmT3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICAgIGV4cG9ydFNjZW5hcmlvczogRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCxcbiAgKTogUHJvbWlzZTxFeHBvcnRGaWxlPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeUV4cG9ydFBERk9wdGlvbnMoZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zKTtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5U2hlZXROYW1lc0ZvclBERkFuZFBQVChzaGVldE5hbWVzLCBleHBvcnRTY2VuYXJpb3MpO1xuXG4gICAgY29uc3QgaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zOiBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMgPSBhd2FpdCB0aGlzLmdldEV4cG9ydFBERk9wdGlvbnNBc3luYygpO1xuICAgIEV4cG9ydEhlbHBlcnMudXBkYXRlSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zKGludGVybmFsRXhwb3J0UGRmT3B0aW9ucywgZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zLCBzaGVldE5hbWVzKTtcblxuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuRXhwb3J0UGRmRG93bmxvYWQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2V4cG9ydFBERkFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHBvcnRQZGZPcHRpb25zXTogaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpXG4gICAgICAudGhlbjxFeHBvcnRGaWxlPigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIEV4cG9ydEZpbGU7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKCgpID0+IHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLlBERkNyZWF0aW9uRXJyb3IsICdVbmFibGUgdG8gY3JlYXRlIFBERiBiZWNhdXNlIHNvbWV0aGluZyB3ZW50IHdyb25nLiBUcnkgYWdhaW4uJyk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRFeHBvcnRQREZPcHRpb25zQXN5bmMoKTogUHJvbWlzZTxJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnM+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkdldEV4cG9ydFBkZk9wdGlvbnM7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEV4cG9ydFBkZk9wdGlvbnNBc3luYycsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKHZlcmIsIHBhcmFtZXRlcnMpLnRoZW48SW50ZXJuYWxFeHBvcnRQREZPcHRpb25zPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnM7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlcG9ydEV4dGVuc2lvblJlbmRlckNvbXBsZXRlKG1lZGlhQmxvYj86IEFycmF5QnVmZmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiBWZXJiSWQuUmVwb3J0RXh0ZW5zaW9uUmVuZGVyQ29tcGxldGUsXG4gICAgICBbUGFyYW1ldGVySWQuSGFzRXh0ZW5zaW9uUmVuZGVyaW5nVGltZWRPdXRdOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgaWYgKG1lZGlhQmxvYikge1xuICAgICAgcGFyYW1zW1BhcmFtZXRlcklkLkV4dGVuc2lvbk1lZGlhQmxvYl0gPSBtZWRpYUJsb2I7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuUmVwb3J0RXh0ZW5zaW9uUmVuZGVyQ29tcGxldGUsIHBhcmFtcykudGhlbjx2b2lkPigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IEFwaU1lbnVUeXBlLCBDb250ZXh0TWVudU9wdGlvbnMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2UgfSBmcm9tICcuLi9FeHRlcm5hbENvbnRleHRNZW51U2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgRXh0ZXJuYWxDb250ZXh0TWVudVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5FeHRlcm5hbENvbnRleHRNZW51O1xuICB9XG5cbiAgcHVibGljIGFwcGVuZENvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBjb25maWc6IENvbnRleHRNZW51T3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5BcHBlbmRFeHRlcm5hbE1lbnVJdGVtO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhcHBlbmRDb250ZXh0TWVudUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogc2hlZXROYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVybmFsTWVudUl0ZW1EaXNwbGF5TmFtZV06IGNvbmZpZy5kaXNwbGF5TmFtZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBuZXdNZW51SXRlbUlkID0gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICAgIHJldHVybiBuZXdNZW51SXRlbUlkO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUNvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SXRlbUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLlJlbW92ZUV4dGVybmFsTWVudUl0ZW07XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbW92ZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SXRlbUlkXTogbWVudUl0ZW1JZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGV4ZWN1dGVDb250ZXh0TWVudUFzeW5jKHNoZWV0TmFtZTogc3RyaW5nLCB0YXJnZXRNZW51OiBBcGlNZW51VHlwZSwgbWVudUl0ZW1JZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5FeGVjdXRlRXh0ZXJuYWxNZW51SXRlbTtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZXhlY3V0ZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SXRlbUlkXTogbWVudUl0ZW1JZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHJlbmFtZUNvbnRleHRNZW51QXN5bmMoc2hlZXROYW1lOiBzdHJpbmcsIHRhcmdldE1lbnU6IEFwaU1lbnVUeXBlLCBtZW51SGVhZGVyOiBzdHJpbmcsIG1lbnVEZXNjcmlwdGlvbjogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5SZW5hbWVFeHRlcm5hbE1lbnU7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JlbmFtZUNvbnRleHRNZW51QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiBzaGVldE5hbWUsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZXJuYWxNZW51SGVhZGVyXTogbWVudUhlYWRlcixcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlcm5hbE1lbnVEZXNjcmlwdGlvbl06IG1lbnVEZXNjcmlwdGlvbixcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRGF0ZVJhbmdlVHlwZSxcbiAgRW1iZWRkaW5nRXJyb3JDb2RlcyxcbiAgRXJyb3JDb2RlcyxcbiAgRmlsdGVyVHlwZSBhcyBFeHRlcm5hbEZpbHRlclR5cGUsXG4gIEZpbHRlckRvbWFpblR5cGUsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgKiBhcyBJbnRlcm5hbENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRmlsdGVyVHlwZSwgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vLi4vQXBpU2hhcmVkJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyBhcyBFeHRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IEludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyBhcyBJbnRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7XG4gIENhdGVnb3JpY2FsRG9tYWluLFxuICBDYXRlZ29yaWNhbEZpbHRlcixcbiAgSGllcmFyY2hpY2FsRGF0YVZhbHVlLFxuICBIaWVyYXJjaGljYWxGaWx0ZXIsXG4gIEhpZXJhcmNoaWNhbExldmVsRGV0YWlsLFxuICBSYW5nZURvbWFpbixcbiAgUmFuZ2VGaWx0ZXIsXG4gIFJlbGF0aXZlRGF0ZUZpbHRlcixcbn0gZnJvbSAnLi4vLi4vTW9kZWxzL0ZpbHRlck1vZGVscyc7XG5pbXBvcnQgeyBEYXRhVmFsdWUgfSBmcm9tICcuLi8uLi9Nb2RlbHMvR2V0RGF0YU1vZGVscyc7XG5pbXBvcnQgeyBEYXRhVmFsdWVGYWN0b3J5IH0gZnJvbSAnLi4vLi4vVXRpbHMvRGF0YVZhbHVlRmFjdG9yeSc7XG5pbXBvcnQgeyBQYXJhbSB9IGZyb20gJy4uLy4uL1V0aWxzL1BhcmFtJztcbmltcG9ydCB7IEZpbHRlclNlcnZpY2UgfSBmcm9tICcuLi9GaWx0ZXJTZXJ2aWNlJztcbmltcG9ydCB7IFNlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VSZWdpc3RyeSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBGaWx0ZXJTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEZpbHRlclNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5GaWx0ZXI7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IENvbnRyYWN0LkZpbHRlclVwZGF0ZVR5cGUsXG4gICAgZmlsdGVyT3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFwcGx5Q2F0ZWdvcmljYWxGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5RmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAndmFsdWVzIHBhcmFtZXRlciBmb3IgYXBwbHlGaWx0ZXJBc3luYyBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgfVxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVmFsdWVzXSA9IHZhbHVlcztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclVwZGF0ZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlclVwZGF0ZVR5cGUuY29udmVydCh1cGRhdGVUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklzRXhjbHVkZU1vZGVdID1cbiAgICAgIGZpbHRlck9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fCBmaWx0ZXJPcHRpb25zLmlzRXhjbHVkZU1vZGUgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmFuZ2VGaWx0ZXJBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQsIGZpZWxkTmFtZTogc3RyaW5nLCBmaWx0ZXJPcHRpb25zOiBDb250cmFjdC5SYW5nZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlSYW5nZUZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlSYW5nZUZpbHRlckFzeW5jJyxcbiAgICB9O1xuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubWluICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyT3B0aW9ucy5taW4gIT09IG51bGwpIHtcbiAgICAgIGxldCBtaW46IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGlmIChmaWx0ZXJPcHRpb25zLm1pbiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgbWluID0gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGZpbHRlck9wdGlvbnMubWluKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbiA9IGZpbHRlck9wdGlvbnMubWluO1xuICAgICAgfVxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU1pbl0gPSBtaW47XG4gICAgfVxuXG4gICAgaWYgKGZpbHRlck9wdGlvbnMubWF4ICE9PSB1bmRlZmluZWQgJiYgZmlsdGVyT3B0aW9ucy5tYXggIT09IG51bGwpIHtcbiAgICAgIGxldCBtYXg6IHN0cmluZyB8IG51bWJlcjtcbiAgICAgIGlmIChmaWx0ZXJPcHRpb25zLm1heCBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgbWF4ID0gUGFyYW0uc2VyaWFsaXplRGF0ZUZvclBsYXRmb3JtKGZpbHRlck9wdGlvbnMubWF4KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1heCA9IGZpbHRlck9wdGlvbnMubWF4O1xuICAgICAgfVxuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJSYW5nZU1heF0gPSBtYXg7XG4gICAgfVxuXG4gICAgLy8gVGhlIG51bGwgb3B0aW9uIGlzIHVzZWQgd2l0aCBtaW4rbWF4IGZvciAnaW5jbHVkZS1yYW5nZScgb3IgJ2luY2x1ZGUtcmFuZ2Utb3ItbnVsbCdcbiAgICBpZiAoZmlsdGVyT3B0aW9ucy5udWxsT3B0aW9uKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclJhbmdlTnVsbE9wdGlvbl0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIubnVsbE9wdGlvbnMuY29udmVydChmaWx0ZXJPcHRpb25zLm51bGxPcHRpb24pO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGROYW1lXSA9IGZpZWxkTmFtZTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHZpc3VhbElkO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICB0aGlzLmFwaUZpbHRlckhhbmRsZXJDaGVja0ZvckNvbW1hbmRFcnJvcihyZXNwb25zZS5yZXN1bHQgYXMgeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSk7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPiB8IENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscyxcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5IaWVyYXJjaGljYWxGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG5cbiAgICBjb25zdCBoaWVyYXJjaGljYWxMZXZlbHMgPSAodmFsdWVzIGFzIENvbnRyYWN0LkhpZXJhcmNoaWNhbExldmVscykubGV2ZWxzO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaGllcmFyY2hpY2FsTGV2ZWxzKSAmJiBoaWVyYXJjaGljYWxMZXZlbHMubGVuZ3RoID4gMCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJMZXZlbHNdID0gaGllcmFyY2hpY2FsTGV2ZWxzO1xuICAgIH0gZWxzZSBpZiAoKHZhbHVlcyBhcyBBcnJheTxTdHJpbmc+KS5sZW5ndGggPiAwKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclZhbHVlc10gPSB2YWx1ZXM7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHRoZSBzZXJ2ZXIgY29tbWFuZCBleHBlY3RzIGVtcHR5IGxpc3QgZm9yIGNsZWFyaW5nIHRoZSBmaWx0ZXJcbiAgICAgIC8vIGl0IGFsc28gZXhwZWN0cyBlaXRoZXJzIEZpbHRlckxldmVscyBvciBGaWx0ZXJWYWx1ZXMgdG8gYmUgc2V0XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlckxldmVsc10gPSBbXTtcbiAgICB9XG5cbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpbHRlclVwZGF0ZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmZpbHRlclVwZGF0ZVR5cGUuY29udmVydCh1cGRhdGVUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLklzRXhjbHVkZU1vZGVdID0gZmlsdGVyT3B0aW9ucyAmJiAhIWZpbHRlck9wdGlvbnMuaXNFeGNsdWRlTW9kZTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIGZpZWxkTmFtZTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckZpbHRlckFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCwgZmllbGROYW1lOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQ2xlYXJGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2NsZWFyRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3Bvc25lKSA9PiB7XG4gICAgICByZXR1cm4gZmllbGROYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmModmlzdWFsSWQ6IFZpc3VhbElkLCBmaWVsZE5hbWU6IHN0cmluZywgb3B0aW9uczogQ29udHJhY3QuUmVsYXRpdmVEYXRlRmlsdGVyT3B0aW9ucykge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQXBwbHlSZWxhdGl2ZURhdGVGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB2aXN1YWxJZDtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5QZXJpb2RUeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5wZXJpb2RUeXBlLmNvbnZlcnQob3B0aW9ucy5wZXJpb2RUeXBlKTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkRhdGVSYW5nZVR5cGVdID0gRXh0ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVSYW5nZVR5cGUuY29udmVydChvcHRpb25zLnJhbmdlVHlwZSk7XG4gICAgaWYgKG9wdGlvbnMucmFuZ2VUeXBlID09PSBEYXRlUmFuZ2VUeXBlLkxhc3ROIHx8IG9wdGlvbnMucmFuZ2VUeXBlID09PSBEYXRlUmFuZ2VUeXBlLk5leHROKSB7XG4gICAgICBpZiAob3B0aW9ucy5yYW5nZU4gPT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLnJhbmdlTiA9PT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICAgIEVtYmVkZGluZ0Vycm9yQ29kZXMuTWlzc2luZ1JhbmdlTkZvclJlbGF0aXZlRGF0ZUZpbHRlcnMsXG4gICAgICAgICAgJ01pc3NpbmcgcmFuZ2VOIGZpZWxkIGZvciBhIHJlbGF0aXZlIGRhdGUgZmlsdGVyIG9mIExBU1ROIG9yIE5FWFROLicsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlJhbmdlTl0gPSBvcHRpb25zLnJhbmdlTjtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5hbmNob3JEYXRlICE9PSB1bmRlZmluZWQgJiYgb3B0aW9ucy5hbmNob3JEYXRlICE9PSBudWxsKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkFuY2hvckRhdGVdID0gdGhpcy5jb252ZXJ0QW5jaG9yRGF0ZShvcHRpb25zLmFuY2hvckRhdGUpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxzdHJpbmc+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RmlsdGVyc0FzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRmlsdGVyPj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0RmlsdGVycztcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0RmlsdGVyc0FzeW5jJyxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuVmlzdWFsSWRdID0gdmlzdWFsSWQ7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVycyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxJbnRlcm5hbENvbnRyYWN0LkZpbHRlcj47XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RG9tYWluRmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDYXRlZ29yaWNhbERvbWFpbkFzeW5jKFxuICAgIHdvcmtzaGVldE5hbWU6IHN0cmluZyxcbiAgICBmaWVsZElkOiBzdHJpbmcsXG4gICAgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSxcbiAgKTogUHJvbWlzZTxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuR2V0Q2F0ZWdvcmljYWxEb21haW47XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldENhdGVnb3JpY2FsRG9tYWluQXN5bmMnLFxuICAgIH07XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgfTtcblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRG9tYWluVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyRG9tYWluVHlwZS5jb252ZXJ0KGRvbWFpblR5cGUpO1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBkb21haW4gPSByZXNwb25zZS5yZXN1bHQgYXMgSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbjtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRDYXRlZ29yaWNhbERvbWFpbihkb21haW4sIGRvbWFpblR5cGUpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFJhbmdlRG9tYWluQXN5bmMod29ya3NoZWV0TmFtZTogc3RyaW5nLCBmaWVsZElkOiBzdHJpbmcsIGRvbWFpblR5cGU6IEZpbHRlckRvbWFpblR5cGUpOiBQcm9taXNlPENvbnRyYWN0LlJhbmdlRG9tYWluPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRSYW5nZURvbWFpbjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnZ2V0UmFuZ2VEb21haW5Bc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuXG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWVsZElkXSA9IGZpZWxkSWQ7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5Eb21haW5UeXBlXSA9IEV4dGVybmFsRW51bUNvbnZlcnRlci5maWx0ZXJEb21haW5UeXBlLmNvbnZlcnQoZG9tYWluVHlwZSk7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPENvbnRyYWN0LlJhbmdlRG9tYWluPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRvbWFpbiA9IHJlc3BvbnNlLnJlc3VsdCBhcyBJbnRlcm5hbENvbnRyYWN0LlJhbmdlRG9tYWluO1xuXG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0UmFuZ2VEb21haW4oZG9tYWluLCBkb21haW5UeXBlKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXNoYm9hcmRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXREYXNoYm9hcmRGaWx0ZXJzO1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXREYXNoYm9hcmRGaWx0ZXJzQXN5bmMnLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgZmlsdGVycyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxJbnRlcm5hbENvbnRyYWN0LkZpbHRlcj47XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0RG9tYWluRmlsdGVycyhmaWx0ZXJzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseURhc2hib2FyZEZpbHRlckFzeW5jKFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHZhbHVlczogQXJyYXk8c3RyaW5nPixcbiAgICB1cGRhdGVUeXBlOiBDb250cmFjdC5GaWx0ZXJVcGRhdGVUeXBlLFxuICAgIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LkZpbHRlck9wdGlvbnMsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5EYXNoYm9hcmRDYXRlZ29yaWNhbEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYXBwbHlEYXNoYm9hcmRGaWx0ZXJBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5GaWx0ZXJWYWx1ZXNdID0gdmFsdWVzO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmlsdGVyVXBkYXRlVHlwZV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuZmlsdGVyVXBkYXRlVHlwZS5jb252ZXJ0KHVwZGF0ZVR5cGUpO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSXNFeGNsdWRlTW9kZV0gPSBmaWx0ZXJPcHRpb25zICYmICEhZmlsdGVyT3B0aW9ucy5pc0V4Y2x1ZGVNb2RlO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm4gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZztcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jKHdvcmtzaGVldE5hbWU6IHN0cmluZywgZmllbGRJZDogc3RyaW5nKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2hhcmVkRmlsdGVyTW9kZWwgPSBhd2FpdCB0aGlzLmV4ZWN1dGVHZXRBcHBsaWVkV29ya3NoZWV0cyh3b3Jrc2hlZXROYW1lLCBmaWVsZElkLCAnZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luYycpO1xuICAgIGNvbnN0IHdvcmtzaGVldE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIHNoYXJlZEZpbHRlck1vZGVsLndvcmtzaGVldHM/Lm1hcCgod29ya3NoZWV0SW5mbzogSW50ZXJuYWxDb250cmFjdC5TaGFyZWRGaWx0ZXJXb3Jrc2hlZXRNb2RlbCkgPT4ge1xuICAgICAgaWYgKHdvcmtzaGVldEluZm8uaXNTZWxlY3RlZCkge1xuICAgICAgICB3b3Jrc2hlZXROYW1lcy5wdXNoKHdvcmtzaGVldEluZm8ud29ya3NoZWV0TmFtZSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHdvcmtzaGVldE5hbWVzO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIHNldEFwcGxpZWRXb3Jrc2hlZXRzQXN5bmMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICBhcHBseVRvV29ya3NoZWV0czogQXJyYXk8c3RyaW5nPixcbiAgKTogUHJvbWlzZTxBcnJheTxzdHJpbmc+PiB7XG4gICAgY29uc3Qgc2hhcmVkRmlsdGVyTW9kZWwgPSBhd2FpdCB0aGlzLmV4ZWN1dGVHZXRBcHBsaWVkV29ya3NoZWV0cyh3b3Jrc2hlZXROYW1lLCBmaWVsZElkLCAnZ2V0QXBwbGllZFdvcmtzaGVldHNBc3luY0ludGVybmFsJyk7XG4gICAgaWYgKCFzaGFyZWRGaWx0ZXJNb2RlbCB8fCAhc2hhcmVkRmlsdGVyTW9kZWwud29ya3NoZWV0cykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdUaGlzIGZpbHRlciBkb2VzIG5vdCBhcHBseSB0byBtdWx0aXBsZSB3b3Jrc2hlZXRzJyk7XG4gICAgfVxuXG4gICAgY29uc3QgYWxsb3dlZFdvcmtzaGVldHM6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGFjdGl2ZVdvcmtzaGVldCA9ICcnO1xuICAgIHNoYXJlZEZpbHRlck1vZGVsLndvcmtzaGVldHMuZm9yRWFjaCgod29ya3NoZWV0KSA9PiB7XG4gICAgICAvLyBHZXQgYWN0aXZlIHdvcmtzaGVldFxuICAgICAgaWYgKHdvcmtzaGVldC5pc0FjdGl2ZSkge1xuICAgICAgICBhY3RpdmVXb3Jrc2hlZXQgPSB3b3Jrc2hlZXQud29ya3NoZWV0TmFtZTtcbiAgICAgIH1cblxuICAgICAgLy8gUG9wdWxhdGUgYWxsb3dlZCB3b3Jrc2hlZXRzXG4gICAgICBpZiAod29ya3NoZWV0LmlzU2VsZWN0ZWQgfHwgd29ya3NoZWV0LmlzRW5hYmxlZCkge1xuICAgICAgICBhbGxvd2VkV29ya3NoZWV0cy5wdXNoKHdvcmtzaGVldC53b3Jrc2hlZXROYW1lKTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChhY3RpdmVXb3Jrc2hlZXQgPT09ICcnKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ05vIGFjdGl2ZSB3b3Jrc2hlZXQnKTtcbiAgICB9XG5cbiAgICBpZiAoIWFwcGx5VG9Xb3Jrc2hlZXRzLmluY2x1ZGVzKGFjdGl2ZVdvcmtzaGVldCkpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJHthY3RpdmVXb3Jrc2hlZXR9IG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGFwcGxpZWQgd29ya3NoZWV0c2ApO1xuICAgIH1cblxuICAgIGFwcGx5VG9Xb3Jrc2hlZXRzLmZvckVhY2goKHNoZWV0KSA9PiB7XG4gICAgICAvLyBjaGVjayBpZiBpdCdzIHByZXNlbnQgd2l0aGluIGNvbXBhdGlibGUgc2hlZXRzXG4gICAgICBpZiAoIWFsbG93ZWRXb3Jrc2hlZXRzLmluY2x1ZGVzKHNoZWV0KSkge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFRoZSBmaWVsZCAke2ZpZWxkTmFtZX0gaXNuJ3QgYXBwbGljYWJsZSB0byB0aGUgd29ya3NoZWV0ICR7c2hlZXR9YCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkNoYW5nZVNoYXJlZEZpbHRlcjtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHt9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXSA9ICdzZXRBcHBsaWVkV29ya3NoZWV0c0FzeW5jJztcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlZpc3VhbElkXSA9IHtcbiAgICAgIHdvcmtzaGVldDogd29ya3NoZWV0TmFtZSxcbiAgICB9O1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRmllbGRJZF0gPSBmaWVsZElkO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuU2hhcmVkRmlsdGVyU2hlZXRzXSA9IGFwcGx5VG9Xb3Jrc2hlZXRzO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHN0cmluZ1tdPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybiBhcHBseVRvV29ya3NoZWV0cztcbiAgICB9KTtcbiAgfVxuXG4gIC8vIEhlbHBlciBNZXRob2RzXG5cbiAgcHJpdmF0ZSBleGVjdXRlR2V0QXBwbGllZFdvcmtzaGVldHMoXG4gICAgd29ya3NoZWV0TmFtZTogc3RyaW5nLFxuICAgIGZpZWxkSWQ6IHN0cmluZyxcbiAgICB0ZWxlbWV0cnlGdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgKTogUHJvbWlzZTxJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlck1vZGVsPiB7XG4gICAgY29uc3QgdmVyYiA9IFZlcmJJZC5HZXRTaGFyZWRGaWx0ZXI7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7fTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV0gPSB0ZWxlbWV0cnlGdW5jdGlvbk5hbWU7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5WaXN1YWxJZF0gPSB7XG4gICAgICB3b3Jrc2hlZXQ6IHdvcmtzaGVldE5hbWUsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLkZpZWxkSWRdID0gZmllbGRJZDtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxJbnRlcm5hbENvbnRyYWN0LlNoYXJlZEZpbHRlck1vZGVsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IHNoYXJlZEZpbHRlck1vZGVsID0gcmVzcG9uc2UucmVzdWx0IGFzIEludGVybmFsQ29udHJhY3QuU2hhcmVkRmlsdGVyTW9kZWw7XG4gICAgICByZXR1cm4gc2hhcmVkRmlsdGVyTW9kZWw7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnREb21haW5GaWx0ZXJzKGRvbWFpbkZpbHRlcnM6IEFycmF5PEludGVybmFsQ29udHJhY3QuRmlsdGVyPik6IEFycmF5PENvbnRyYWN0LkZpbHRlcj4ge1xuICAgIGNvbnN0IGZpbHRlcnM6IEFycmF5PENvbnRyYWN0LkZpbHRlcj4gPSBbXTtcbiAgICBkb21haW5GaWx0ZXJzLmZvckVhY2goKGRvbWFpbkZpbHRlcikgPT4ge1xuICAgICAgc3dpdGNoIChkb21haW5GaWx0ZXIuZmlsdGVyVHlwZSkge1xuICAgICAgICBjYXNlIEZpbHRlclR5cGUuQ2F0ZWdvcmljYWw6IHtcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBkb21haW5GaWx0ZXIgYXMgSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbEZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0Q2F0ZWdvcmljYWxGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBDYXRlZ29yaWNhbCBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlIEZpbHRlclR5cGUuSGllcmFyY2hpY2FsOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuSGllcmFyY2hpY2FsRmlsdGVyO1xuICAgICAgICAgIGlmIChmaWx0ZXIpIHtcbiAgICAgICAgICAgIGZpbHRlcnMucHVzaCh0aGlzLmNvbnZlcnRIaWVyYXJjaGljYWxGaWx0ZXIoZmlsdGVyKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBIaWVyYXJjaGljYWwgRmlsdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLlJhbmdlOiB7XG4gICAgICAgICAgY29uc3QgZmlsdGVyID0gZG9tYWluRmlsdGVyIGFzIEludGVybmFsQ29udHJhY3QuUmFuZ2VGaWx0ZXI7XG4gICAgICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICAgICAgZmlsdGVycy5wdXNoKHRoaXMuY29udmVydFJhbmdlRmlsdGVyKGZpbHRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUmFuZ2UgRmlsdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSBGaWx0ZXJUeXBlLlJlbGF0aXZlRGF0ZToge1xuICAgICAgICAgIGNvbnN0IGZpbHRlciA9IGRvbWFpbkZpbHRlciBhcyBJbnRlcm5hbENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlcjtcbiAgICAgICAgICBpZiAoZmlsdGVyKSB7XG4gICAgICAgICAgICBmaWx0ZXJzLnB1c2godGhpcy5jb252ZXJ0UmVsYXRpdmVEYXRlRmlsdGVyKGZpbHRlcikpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgUmVsYXRpdmUgRGF0ZSBGaWx0ZXInKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgICByZXR1cm4gZmlsdGVycztcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydENhdGVnb3JpY2FsRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbEZpbHRlcik6IENvbnRyYWN0LkNhdGVnb3JpY2FsRmlsdGVyIHtcbiAgICBjb25zdCBhcHBsaWVkVmFsdWVzOiBBcnJheTxDb250cmFjdC5EYXRhVmFsdWU+ID0gZG9tYWluRmlsdGVyLnZhbHVlcy5tYXAoKGR2KSA9PiB7XG4gICAgICByZXR1cm4gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGR2KTtcbiAgICB9KTtcblxuICAgIHJldHVybiBuZXcgQ2F0ZWdvcmljYWxGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBFeHRlcm5hbEZpbHRlclR5cGUuQ2F0ZWdvcmljYWwsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgYXBwbGllZFZhbHVlcyxcbiAgICAgIGRvbWFpbkZpbHRlci5pc0V4Y2x1ZGUsXG4gICAgICBkb21haW5GaWx0ZXIuaXNBbGxTZWxlY3RlZCxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0SGllcmFyY2hpY2FsRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIpOiBDb250cmFjdC5IaWVyYXJjaGljYWxGaWx0ZXIge1xuICAgIGNvbnN0IGFwcGxpZWRWYWx1ZXM6IEFycmF5PENvbnRyYWN0LkhpZXJhcmNoaWNhbEZpbHRlckRhdGFWYWx1ZT4gPSBkb21haW5GaWx0ZXIudmFsdWVzLm1hcCgoaGllcmFyY2hpY2FsRGF0YVZhbHVlKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEhpZXJhcmNoaWNhbERhdGFWYWx1ZShcbiAgICAgICAgRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGhpZXJhcmNoaWNhbERhdGFWYWx1ZS52YWx1ZSksXG4gICAgICAgIGhpZXJhcmNoaWNhbERhdGFWYWx1ZS5oaWVyYXJjaGljYWxQYXRoLFxuICAgICAgICBoaWVyYXJjaGljYWxEYXRhVmFsdWUubGV2ZWwsXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgY29uc3QgbGV2ZWxEZXRhaWxzOiBBcnJheTxDb250cmFjdC5IaWVyYXJjaGljYWxMZXZlbERldGFpbD4gPSBkb21haW5GaWx0ZXIubGV2ZWxJbmZvLm1hcCgoYUxldmVsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IEhpZXJhcmNoaWNhbExldmVsRGV0YWlsKFxuICAgICAgICBhTGV2ZWwubmFtZSxcbiAgICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmhpZXJhcmNoaWNhbExldmVsU2VsZWN0aW9uU3RhdGUuY29udmVydChhTGV2ZWwubGV2ZWxTZWxlY3Rpb25TdGF0ZSksXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIG5ldyBIaWVyYXJjaGljYWxGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBFeHRlcm5hbEZpbHRlclR5cGUuSGllcmFyY2hpY2FsLFxuICAgICAgdGhpcy5fcmVnaXN0cnlJZCxcbiAgICAgIGRvbWFpbkZpbHRlci5kaW1lbnNpb25OYW1lLFxuICAgICAgZG9tYWluRmlsdGVyLmhpZXJhcmNoeUNhcHRpb24sXG4gICAgICBkb21haW5GaWx0ZXIubGV2ZWxzLFxuICAgICAgbGV2ZWxEZXRhaWxzLFxuICAgICAgYXBwbGllZFZhbHVlcyxcbiAgICAgIGRvbWFpbkZpbHRlci5pc0FsbFNlbGVjdGVkLFxuICAgICk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRSYW5nZUZpbHRlcihkb21haW5GaWx0ZXI6IEludGVybmFsQ29udHJhY3QuUmFuZ2VGaWx0ZXIpOiBDb250cmFjdC5SYW5nZUZpbHRlciB7XG4gICAgY29uc3QgbWluVmFsdWU6IERhdGFWYWx1ZSA9IERhdGFWYWx1ZUZhY3RvcnkuTWFrZUZpbHRlckRhdGFWYWx1ZShkb21haW5GaWx0ZXIubWluKTtcbiAgICBjb25zdCBtYXhWYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5tYXgpO1xuICAgIHJldHVybiBuZXcgUmFuZ2VGaWx0ZXIoXG4gICAgICBkb21haW5GaWx0ZXIudmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkQ2FwdGlvbixcbiAgICAgIGRvbWFpbkZpbHRlci5maWVsZE5hbWUsXG4gICAgICBFeHRlcm5hbEZpbHRlclR5cGUuUmFuZ2UsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgbWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZSxcbiAgICAgIGRvbWFpbkZpbHRlci5pbmNsdWRlTnVsbFZhbHVlcyxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBjb252ZXJ0UmVsYXRpdmVEYXRlRmlsdGVyKGRvbWFpbkZpbHRlcjogSW50ZXJuYWxDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIpOiBDb250cmFjdC5SZWxhdGl2ZURhdGVGaWx0ZXIge1xuICAgIGNvbnN0IGFuY2hvckRhdGVWYWx1ZTogRGF0YVZhbHVlID0gRGF0YVZhbHVlRmFjdG9yeS5NYWtlRmlsdGVyRGF0YVZhbHVlKGRvbWFpbkZpbHRlci5hbmNob3JEYXRlKTtcbiAgICByZXR1cm4gbmV3IFJlbGF0aXZlRGF0ZUZpbHRlcihcbiAgICAgIGRvbWFpbkZpbHRlci52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBkb21haW5GaWx0ZXIuZmllbGRDYXB0aW9uLFxuICAgICAgZG9tYWluRmlsdGVyLmZpZWxkTmFtZSxcbiAgICAgIEV4dGVybmFsRmlsdGVyVHlwZS5SZWxhdGl2ZURhdGUsXG4gICAgICB0aGlzLl9yZWdpc3RyeUlkLFxuICAgICAgYW5jaG9yRGF0ZVZhbHVlLFxuICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVTdGVwUGVyaW9kLmNvbnZlcnQoZG9tYWluRmlsdGVyLnBlcmlvZFR5cGUpLFxuICAgICAgSW50ZXJuYWxFbnVtQ29udmVydGVyLmRhdGVSYW5nZVR5cGUuY29udmVydChkb21haW5GaWx0ZXIucmFuZ2VUeXBlKSxcbiAgICAgIGRvbWFpbkZpbHRlci5yYW5nZU4sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgY29udmVydENhdGVnb3JpY2FsRG9tYWluKGRvbWFpbjogSW50ZXJuYWxDb250cmFjdC5DYXRlZ29yaWNhbERvbWFpbiwgZG9tYWluVHlwZTogRmlsdGVyRG9tYWluVHlwZSk6IENvbnRyYWN0LkNhdGVnb3JpY2FsRG9tYWluIHtcbiAgICBjb25zdCB2YWx1ZXM6IEFycmF5PERhdGFWYWx1ZT4gPSBkb21haW4udmFsdWVzLm1hcCgoZG9tYWluRHYpID0+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+IG5ldyBNYXJrSW5mbyhoLnR5cGUsIGguY29sb3IsIGgudHVwbGVJZCkpO1xuICAgIH1cblxuICAgIGNvbnN0IHRhYmxlID0gcmVzcG9uc2VEYXRhLmRhdGFUYWJsZS5tYXAoKHJvdykgPT4ge1xuICAgICAgcmV0dXJuIHJvdy5tYXAoKGNlbGwsIGluZGV4KSA9PiB7XG4gICAgICAgIHJldHVybiBEYXRhVmFsdWVGYWN0b3J5Lk1ha2VUYWJsZURhdGFWYWx1ZShjZWxsLCBoZWFkZXJzW2luZGV4XS5kYXRhVHlwZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmIChtYXJrcykge1xuICAgICAgcmV0dXJuIG5ldyBEYXRhVGFibGUodGFibGUsIGhlYWRlcnMsIHRhYmxlLmxlbmd0aCwgZmFsc2UsIGlzU3VtbWFyeSwgbWFya3MpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IERhdGFUYWJsZSh0YWJsZSwgaGVhZGVycywgdGFibGUubGVuZ3RoLCBmYWxzZSwgaXNTdW1tYXJ5KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgTm90aWZpY2F0aW9uU2VydmljZSB9IGZyb20gJy4uL05vdGlmaWNhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsIGV4dGVuZHMgTm90aWZpY2F0aW9uU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgTm90aWZpY2F0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbjtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLCBNb2RlbCwgTm90aWZpY2F0aW9uLCBOb3RpZmljYXRpb25JZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBVbnJlZ2lzdGVyRm4gfSBmcm9tICcuLi9Ob3RpZmljYXRpb25TZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIFJlZ2lzdHJhdGlvbiB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9maWx0ZXJGbjogKG5vdGlmaWNhdGlvbk1vZGVsOiBNb2RlbCkgPT4gYm9vbGVhbixcbiAgICBwcml2YXRlIF9jYWxsYmFja0ZuOiAobm90aWZpY2F0aW9uTW9kZWw6IE1vZGVsKSA9PiB2b2lkLFxuICApIHtcbiAgICAvLyBOb3RoaW5nIEhlcmVcbiAgfVxuXG4gIHB1YmxpYyBvbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb25Nb2RlbDogTW9kZWwpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5fZmlsdGVyRm4obm90aWZpY2F0aW9uTW9kZWwpKSB7XG4gICAgICB0aGlzLl9jYWxsYmFja0ZuKG5vdGlmaWNhdGlvbk1vZGVsKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vdGlmaWNhdGlvblNlcnZpY2VJbXBsQmFzZSB7XG4gIHByaXZhdGUgX2hhbmRsZXJzOiB7IFtub3RpZmljYXRpb25JZDogc3RyaW5nXTogQXJyYXk8UmVnaXN0cmF0aW9uPiB9O1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcikge1xuICAgIHRoaXMuX2hhbmRsZXJzID0ge307XG4gICAgdGhpcy5kaXNwYXRjaGVyLnJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcih0aGlzLm9uTm90aWZpY2F0aW9uLmJpbmQodGhpcykpO1xuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVySGFuZGxlcihpZDogTm90aWZpY2F0aW9uSWQsIGZpbHRlckZuOiAobW9kZWw6IE1vZGVsKSA9PiBib29sZWFuLCBoYW5kbGVyOiAobW9kZWw6IE1vZGVsKSA9PiB2b2lkKTogVW5yZWdpc3RlckZuIHtcbiAgICBjb25zdCBoYW5kbGVycyA9IHRoaXMuX2hhbmRsZXJzW2lkXSB8fCBuZXcgQXJyYXk8UmVnaXN0cmF0aW9uPigpO1xuICAgIGNvbnN0IHJlZ2lzdHJhdGlvbiA9IG5ldyBSZWdpc3RyYXRpb24oZmlsdGVyRm4sIGhhbmRsZXIpO1xuICAgIGhhbmRsZXJzLnB1c2gocmVnaXN0cmF0aW9uKTtcbiAgICB0aGlzLl9oYW5kbGVyc1tpZF0gPSBoYW5kbGVycztcbiAgICByZXR1cm4gKCkgPT4gdGhpcy5yZW1vdmVSZWdpc3RyYXRpb24oaWQsIHJlZ2lzdHJhdGlvbik7XG4gIH1cblxuICBwcml2YXRlIGhhc0hhbmRsZXJzRm9yTm90aWZpY2F0aW9uVHlwZShpZDogTm90aWZpY2F0aW9uSWQpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5faGFuZGxlcnMuaGFzT3duUHJvcGVydHkoaWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBvbk5vdGlmaWNhdGlvbihub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQge1xuICAgIGlmICghdGhpcy5oYXNIYW5kbGVyc0Zvck5vdGlmaWNhdGlvblR5cGUobm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbklkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEdvIHRocm91Z2ggYW5kIGNoZWNrIGZvciBhbGwgdGhlIGhhbmRsZXJzIG9mIHRoaXMgcGFydGljdWxhciBub3RpZmljYXRpb25cbiAgICB0aGlzLl9oYW5kbGVyc1tub3RpZmljYXRpb24ubm90aWZpY2F0aW9uSWRdLmZvckVhY2goKGgpID0+IGgub25Ob3RpZmljYXRpb24obm90aWZpY2F0aW9uLmRhdGEpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlUmVnaXN0cmF0aW9uKGlkOiBOb3RpZmljYXRpb25JZCwgcmVnaXN0cmF0aW9uOiBSZWdpc3RyYXRpb24pOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaGFzSGFuZGxlcnNGb3JOb3RpZmljYXRpb25UeXBlKGlkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX2hhbmRsZXJzW2lkXSA9IHRoaXMuX2hhbmRsZXJzW2lkXS5maWx0ZXIoKHJlZykgPT4gcmVnICE9PSByZWdpc3RyYXRpb24pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4ZWN1dGVQYXJhbWV0ZXJzLCBNb2RlbCwgUGFyYW1ldGVySWQsIFBhcmFtZXRlckluZm8sIFNoZWV0UGF0aCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFBhcmFtZXRlckltcGwgfSBmcm9tICcuLi8uLi9JbXBsL1BhcmFtZXRlckltcGwnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vLi4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFBhcmFtZXRlcnNTZXJ2aWNlIH0gZnJvbSAnLi4vUGFyYW1ldGVyc1NlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSB9IGZyb20gJy4vU2VydmljZUltcGxCYXNlJztcblxuZXhwb3J0IGNsYXNzIFBhcmFtZXRlcnNTZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIFBhcmFtZXRlcnNTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuUGFyYW1ldGVycztcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXJhbWV0ZXJzRm9yU2hlZXRBc3luYyhzaGVldFBhdGg6IFNoZWV0UGF0aCk6IFByb21pc2U8QXJyYXk8UGFyYW1ldGVySW1wbD4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRQYXJhbWV0ZXJzRm9yU2hlZXRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2hlZXRQYXRoXTogc2hlZXRQYXRoLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5nZXRQYXJhbWV0ZXJzQXN5bmMocGFyYW1ldGVycyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QWxsUGFyYW1ldGVyc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8UGFyYW1ldGVySW1wbD4+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRQYXJhbWV0ZXJzRm9yU2hlZXRBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmdldFBhcmFtZXRlcnNBc3luYyhwYXJhbWV0ZXJzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UGFyYW1ldGVyc0FzeW5jKGlucHV0UGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEFycmF5PFBhcmFtZXRlckltcGw+PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuR2V0UGFyYW1ldGVyc0ZvclNoZWV0LCBpbnB1dFBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8UGFyYW1ldGVySW5mbz47XG4gICAgICByZXR1cm4gcmVzdWx0Lm1hcCgocGFyYW1ldGVySW5mbykgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlckltcGwocGFyYW1ldGVySW5mbywgdGhpcy5fcmVnaXN0cnlJZCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBjaGFuZ2VQYXJhbWV0ZXJWYWx1ZUFzeW5jKGZpZWxkTmFtZTogc3RyaW5nLCBuZXdWYWx1ZTogc3RyaW5nKTogUHJvbWlzZTxQYXJhbWV0ZXJJbmZvPiB7XG4gICAgY29uc3QgcGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY2hhbmdlUGFyYW1ldGVyVmFsdWVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuUGFyYW1ldGVyRmllbGROYW1lXTogZmllbGROYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLlBhcmFtZXRlclZhbHVlXTogbmV3VmFsdWUsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkNoYW5nZVBhcmFtZXRlclZhbHVlLCBwYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0IGFzIFBhcmFtZXRlckluZm87XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGZpbmRQYXJhbWV0ZXJCeU5hbWVBc3luYyhuYW1lOiBzdHJpbmcpOiBQcm9taXNlPFBhcmFtZXRlckltcGwgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gdGhpcy5maW5kUGFyYW1ldGVyQXN5bmMobmFtZSwgdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5kUGFyYW1ldGVyQnlHbG9iYWxGaWVsZE5hbWVBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8UGFyYW1ldGVySW1wbCB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLmZpbmRQYXJhbWV0ZXJBc3luYyh1bmRlZmluZWQsIGZpZWxkTmFtZSk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRQYXJhbWV0ZXJBc3luYyhuYW1lOiBzdHJpbmcgfCB1bmRlZmluZWQsIGZpZWxkTmFtZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogUHJvbWlzZTxQYXJhbWV0ZXJJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2ZpbmRQYXJhbWV0ZXJBc3luYycsXG4gICAgfTtcbiAgICBpZiAobmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlBhcmFtZXRlckNhcHRpb25dID0gbmFtZTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkTmFtZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlBhcmFtZXRlckZpZWxkTmFtZV0gPSBmaWVsZE5hbWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnbmFtZSBvciBmaWVsZE5hbWUgbXVzdCBiZSBwcm92aWRlZCB0byBmaW5kIHBhcmFtZXRlcicpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkZpbmRQYXJhbWV0ZXIsIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCBpbnN0YW5jZU9mUGFyYW1ldGVySW5mbyA9IChvYmplY3Q6IE1vZGVsKTogb2JqZWN0IGlzIFBhcmFtZXRlckluZm8gPT4ge1xuICAgICAgICByZXR1cm4gJ2ZpZWxkTmFtZScgaW4gb2JqZWN0O1xuICAgICAgfTtcblxuICAgICAgLy8gV2UgbmVlZCB0byBjaGVjayB0byBzZWUgaWYgd2UgZ290IGEgdmFsaWQgcmVzcG9uc2UgYmFjayBhZ2FpblxuICAgICAgaWYgKGluc3RhbmNlT2ZQYXJhbWV0ZXJJbmZvKHJlc3BvbnNlLnJlc3VsdCkpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVzcG9uc2UucmVzdWx0O1xuICAgICAgICByZXR1cm4gbmV3IFBhcmFtZXRlckltcGwocmVzdWx0LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgUGFyYW1ldGVySWQsXG4gIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlIGFzIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbCxcbiAgVmVyYklkLFxuICBWaXN1YWxJZCxcbn0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIERpbWVuc2lvblNlbGVjdGlvbk1vZGVsLFxuICBIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbCxcbiAgSG92ZXJUdXBsZUludGVyYWN0aW9uTW9kZWwsXG4gIFJhbmdlU2VsZWN0aW9uTW9kZWwsXG4gIFNlbGVjdFR1cGxlc0ludGVyYWN0aW9uTW9kZWwsXG4gIFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lcixcbiAgVHVwbGVTZWxlY3Rpb25Nb2RlbCxcbiAgVmFsdWVTZWxlY3Rpb25Nb2RlbCxcbn0gZnJvbSAnLi4vLi4vTW9kZWxzL1NlbGVjdGlvbk1vZGVscyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuLi8uLi9VdGlscy9QYXJhbSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vU2VsZWN0aW9uU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTZWxlY3Rpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuU2VsZWN0aW9uO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBjbGVhciBhbGwgdGhlIHNlbGVjdGVkIG1hcmtzIGZvciB0aGUgZ2l2ZW4gd29ya3NoZWV0LlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICovXG4gIHB1YmxpYyBjbGVhclNlbGVjdGVkTWFya3NBc3luYyh2aXN1YWxJZDogVmlzdWFsSWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlZpc3VhbElkXTogdmlzdWFsSWQsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DbGVhclNlbGVjdGVkTWFya3MsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICByZXR1cm47IC8vIEV4cGVjdGluZyBhbiBlbXB0eSBtb2RlbCBhbmQgaGVuY2UgdGhlIHZvaWQgcmVzcG9uc2UuXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHNlbGVjdCBtYXJrcyBmb3IgdGhlIGdpdmVuIHdvcmtzaGVldC5cbiAgICpcbiAgICogQHBhcmFtIHZpc3VhbElkXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25Dcml0ZXJpYVxuICAgKiBAcGFyYW0gc2VsZWN0aW9uVXBkYXRlVHlwZVxuICAgKi9cbiAgcHVibGljIHNlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBzZWxlY3Rpb25Dcml0ZXJpYXM6IEFycmF5PENvbnRyYWN0LlNlbGVjdGlvbkNyaXRlcmlhPixcbiAgICBzZWxlY3Rpb25VcGRhdGVUeXBlOiBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoc2VsZWN0aW9uQ3JpdGVyaWFzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5FcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdTZWxlY3Rpb24gY3JpdGVyaWEgbWlzc2luZyBmb3Igc2VsZWN0aW5nIG1hcmtzIGJ5IHZhbHVlJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0aW9uVHlwZTogc3RyaW5nID0gdGhpcy52YWxpZGF0ZVNlbGVjdGlvblVwZGF0ZVR5cGUoc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VTZWxlY3Rpb25NYXJrcyhzZWxlY3Rpb25Dcml0ZXJpYXMpO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NlbGVjdE1hcmtzQnlWYWx1ZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvblVwZGF0ZVR5cGVdOiBzZWxlY3Rpb25UeXBlLFxuICAgIH07XG5cbiAgICBpZiAoc2VsZWN0aW9uTW9kZWxDb250YWluZXIuaGllck1vZGVsQXJyICYmIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmhpZXJNb2RlbEFyci5sZW5ndGgpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuSGllclZhbFNlbGVjdGlvbk1vZGVsc10gPSBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5oaWVyTW9kZWxBcnI7XG4gICAgfVxuICAgIGlmIChzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5xdWFudE1vZGVsQXJyICYmIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnF1YW50TW9kZWxBcnIubGVuZ3RoKSB7XG4gICAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlF1YW50UmFuZ2VTZWxlY3Rpb25Nb2RlbHNdID0gc2VsZWN0aW9uTW9kZWxDb250YWluZXIucXVhbnRNb2RlbEFycjtcbiAgICB9XG4gICAgaWYgKHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmRpbU1vZGVsQXJyICYmIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLmRpbU1vZGVsQXJyLmxlbmd0aCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5EaW1WYWxTZWxlY3Rpb25Nb2RlbHNdID0gc2VsZWN0aW9uTW9kZWxDb250YWluZXIuZGltTW9kZWxBcnI7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2VsZWN0QnlWYWx1ZSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHRoaXMuYXBpRmlsdGVySGFuZGxlckNoZWNrRm9yQ29tbWFuZEVycm9yKHJlc3BvbnNlLnJlc3VsdCBhcyB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gZXhlY3V0ZSBob3ZlciBhY3Rpb25zIGFuZCByZW5kZXIgdG9vbHRpcCBmb3IgYSBnaXZlbiB0dXBsZSByZXByZXNlbnRpbmcgYSBtYXJrIGluIHRoZSB2aXN1YWxpemF0aW9uLlxuICAgKiBJZiB0aGUgdG9vbHRpcCBwYXJhbWV0ZXIgaXMgaW5jbHVkZWQgaXQgd2lsbCBzaG93IHRoZSB0b29sdGlwIG9uIGhvdmVyLiBJZiBub3QsIG5vIHRvb2x0aXAgaXMgc2hvd24uXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gaG92ZXJlZFR1cGxlXG4gICAqIEBwYXJhbSB0b29sdGlwXG4gICAqIEByZXR1cm5zIGVtcHR5IHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBleHRlbnNpb24gaG9zdCBoYXMgc3VjY2Vzc2Z1bGx5IGJlZW4gaW5mb3JtZWQgb2YgdGhlIHJlcXVlc3QgYW5kIHJlamVjdHMgb24gZXJyb3JcbiAgICovXG4gIHB1YmxpYyBob3ZlclR1cGxlQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIGhvdmVyZWRUdXBsZT86IG51bWJlcixcbiAgICB0b29sdGlwPzogQ29udHJhY3QuVG9vbHRpcENvbnRleHQgfCBudWxsLFxuICAgIGFsbG93SG92ZXJBY3Rpb25zPzogYm9vbGVhbixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgbGV0IGludGVyYWN0aW9uTW9kZWwgPSBuZXcgSG92ZXJUdXBsZUludGVyYWN0aW9uTW9kZWwoXG4gICAgICB2aXN1YWxJZCxcbiAgICAgIHRoaXMuZW5zdXJlVHVwbGVJRElzTm9uTmVnYXRpdmUoaG92ZXJlZFR1cGxlKSxcbiAgICAgIHRvb2x0aXAsXG4gICAgICBhbGxvd0hvdmVyQWN0aW9ucyxcbiAgICApO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2hvdmVyVHVwbGVBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuSG92ZXJUdXBsZUludGVyYWN0aW9uXTogaW50ZXJhY3Rpb25Nb2RlbCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuUmFpc2VIb3ZlclR1cGxlTm90aWZpY2F0aW9uLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBtb2RpZnkgc2VsZWN0aW9uLCBleGVjdXRlIHNlbGVjdCBhY3Rpb25zIGFuZCByZW5kZXIgdG9vbHRpcCBmb3IgYSBnaXZlbiBsaXN0IG9mIHR1cGxlcyByZXByZXNlbnRpbmcgYSBtYXJrIG9yIG1hcmtzIGluIHRoZSB2aXN1YWxpemF0aW9uLlxuICAgKiBJZiB0aGUgdG9vbHRpcCBwYXJhbWV0ZXIgaXMgaW5jbHVkZWQgaXQgd2lsbCBzaG93IHRoZSB0b29sdGlwIG9uIHNlbGVjdC4gSWYgbm90LCBubyB0b29sdGlwIGlzIHNob3duLlxuICAgKlxuICAgKiBAcGFyYW0gdmlzdWFsSWRcbiAgICogQHBhcmFtIHNlbGVjdGVkVHVwbGVzXG4gICAqIEBwYXJhbSBzZWxlY3RPcHRpb25cbiAgICogQHBhcmFtIHRvb2x0aXBcbiAgICogQHJldHVybnMgZW1wdHkgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGV4dGVuc2lvbiBob3N0IGhhcyBzdWNjZXNzZnVsbHkgYmVlbiBpbmZvcm1lZCBvZiB0aGUgcmVxdWVzdCBhbmQgcmVqZWN0cyBvbiBlcnJvclxuICAgKi9cbiAgcHVibGljIHNlbGVjdFR1cGxlc0FzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBzZWxlY3RlZFR1cGxlczogQXJyYXk8bnVtYmVyPixcbiAgICBzZWxlY3RPcHRpb246IENvbnRyYWN0LlNlbGVjdE9wdGlvbnMsXG4gICAgdG9vbHRpcD86IENvbnRyYWN0LlRvb2x0aXBDb250ZXh0LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgaW50ZXJhY3Rpb25Nb2RlbCA9IG5ldyBTZWxlY3RUdXBsZXNJbnRlcmFjdGlvbk1vZGVsKHZpc3VhbElkLCBzZWxlY3RlZFR1cGxlcywgc2VsZWN0T3B0aW9uLCB0b29sdGlwKTtcblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzZWxlY3RUdXBsZXNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU2VsZWN0VHVwbGVzSW50ZXJhY3Rpb25dOiBpbnRlcmFjdGlvbk1vZGVsLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SYWlzZVNlbGVjdFR1cGxlc05vdGlmaWNhdGlvbiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXBpRmlsdGVySGFuZGxlckNoZWNrRm9yQ29tbWFuZEVycm9yKHNlcnZlclBtOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9KSB7XG4gICAgaWYgKCFzZXJ2ZXJQbVtQYXJhbWV0ZXJJZC5QYXJhbWV0ZXJFcnJvcl0pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW1BhcmFtZXRlcklkLkludmFsaWRGaWVsZHNdKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFNlbGVjdGlvbkZpZWxkTmFtZSwgc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZEZpZWxkc10pO1xuICAgIH1cbiAgICBpZiAoc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZFZhbHVlc10pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uVmFsdWUsIHNlcnZlclBtW1BhcmFtZXRlcklkLkludmFsaWRWYWx1ZXNdKTtcbiAgICB9XG4gICAgaWYgKHNlcnZlclBtW1BhcmFtZXRlcklkLkludmFsaWREYXRlc10pIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uRGF0ZSwgc2VydmVyUG1bUGFyYW1ldGVySWQuSW52YWxpZERhdGVzXSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBzZWxlY3QgbWFya3MgZm9yIHRoZSBnaXZlbiB3b3Jrc2hlZXQuXG4gICAqXG4gICAqIEBwYXJhbSB2aXN1YWxJZFxuICAgKiBAcGFyYW0gTWFya0luZm9cbiAgICogQHBhcmFtIHNlbGVjdGlvblVwZGF0ZVR5cGVcbiAgICovXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SWRBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbWFya3M6IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPixcbiAgICBzZWxlY3Rpb25VcGRhdGVUeXBlOiBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAobWFya3MubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ01hcmtzIGluZm8gbWlzc2luZyBmb3Igc2VsZWN0aW5nIG1hcmtzIGJ5IElkJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0aW9uVHlwZTogc3RyaW5nID0gdGhpcy52YWxpZGF0ZVNlbGVjdGlvblVwZGF0ZVR5cGUoc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gICAgY29uc3Qgc2VsZWN0aW9uTW9kZWxDb250YWluZXI6IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lciA9IHRoaXMucGFyc2VTZWxlY3Rpb25JZHMobWFya3MpO1xuXG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NlbGVjdE1hcmtzQnlJZEFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXN1YWxJZF06IHZpc3VhbElkLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvblVwZGF0ZVR5cGVdOiBzZWxlY3Rpb25UeXBlLFxuICAgICAgW1BhcmFtZXRlcklkLlNlbGVjdGlvbl06IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyLnNlbGVjdGlvbixcbiAgICB9O1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNlbGVjdEJ5VmFsdWUsIHBhcmFtZXRlcnMpLnRoZW48dm9pZD4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBFeHBlY3RpbmcgYW4gZW1wdHkgbW9kZWwgYW5kIGhlbmNlIHRoZSB2b2lkIHJlc3BvbnNlLlxuICAgICAgcmV0dXJuO1xuICAgICAgLy8gVE9ETyBJbnZlc3RpZ2F0ZSB0aGUgZXJyb3IgcmVzcG9uc2Ugd2l0aCBtdWx0aXBsZSBvdXRwdXQgcGFyYW1zIGFuZCB0aHJvdyBlcnJvciBhY2NvcmRpbmdseS5cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gcHJlcGFyZSB0aGUgcHJlcyBtb2RlbHMgZm9yIHNlbGVjdGlvbiBieSBNYXJrc0luZm9cbiAgICogQHBhcmFtIG1hcmtzXG4gICAqL1xuICBwcml2YXRlIHBhcnNlU2VsZWN0aW9uSWRzKG1hcmtzOiBBcnJheTxDb250cmFjdC5NYXJrSW5mbz4pOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIge1xuICAgIGNvbnN0IGlkczogQXJyYXk8c3RyaW5nPiA9IFtdO1xuICAgIGNvbnN0IHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyOiBTZWxlY3Rpb25Nb2RlbHNDb250YWluZXIgPSBuZXcgU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyKCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdHVwbGVJZDogbnVtYmVyIHwgdW5kZWZpbmVkID0gbWFya3NbaV0udHVwbGVJZDtcbiAgICAgIGlmICh0dXBsZUlkICE9PSB1bmRlZmluZWQgJiYgdHVwbGVJZCAhPT0gbnVsbCkge1xuICAgICAgICAvLyBJZiB0dXBsZSBpZCBpcyBwcm92aWRlZCB1c2UgdGhhdCBpbnN0ZWFkIG9mIHBhaXJcbiAgICAgICAgaWRzLnB1c2godHVwbGVJZC50b1N0cmluZygpKTsgLy8gY29sbGVjdCB0aGUgdHVwbGUgaWRzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3R1cGxlSWQgcGFyc2luZyBlcnJvcicpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaWRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgLy8gdHVwbGUgaWRzIGJhc2VkIHNlbGVjdGlvblxuICAgICAgY29uc3QgdHVwbGVTZWxlY3Rpb25Nb2RlbDogVHVwbGVTZWxlY3Rpb25Nb2RlbCA9IG5ldyBUdXBsZVNlbGVjdGlvbk1vZGVsKCk7XG4gICAgICB0dXBsZVNlbGVjdGlvbk1vZGVsLnNlbGVjdGlvblR5cGUgPSAndHVwbGVzJztcbiAgICAgIHR1cGxlU2VsZWN0aW9uTW9kZWwub2JqZWN0SWRzID0gaWRzO1xuICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuc2VsZWN0aW9uID0gdHVwbGVTZWxlY3Rpb25Nb2RlbDtcbiAgICB9XG4gICAgcmV0dXJuIHNlbGVjdGlvbk1vZGVsQ29udGFpbmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIE1ldGhvZCB0byBwcmVwYXJlIHRoZSBwcmVzIG1vZGVscyBmb3Igc2VsZWN0aW9uIGJ5IHZhbHVlcy5cbiAgICpcbiAgICogU3VwcG9ydHMgMyB0eXBlcyBmb3Igc2VsZWN0aW9uOlxuICAgKiAxKSBIaWVyYXJjaGljYWwgdmFsdWUgYmFzZWQgc2VsZWN0aW9uXG4gICAqIDIpIFJhbmdlIHZhbHVlIGJhc2VkIHNlbGVjdGlvblxuICAgKiAzKSBEaW1lbnNpb24gdmFsdWUgYmFzZWQgc2VsZWN0aW9uXG4gICAqXG4gICAqIEBwYXJhbSBtYXJrc1xuICAgKi9cbiAgcHJpdmF0ZSBwYXJzZVNlbGVjdGlvbk1hcmtzKHNlbGVjdGlvbkNyaXRlcmlhczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+KTogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyIHtcbiAgICBjb25zdCBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lcjogU2VsZWN0aW9uTW9kZWxzQ29udGFpbmVyID0gbmV3IFNlbGVjdGlvbk1vZGVsc0NvbnRhaW5lcigpO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3Rpb25Dcml0ZXJpYXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IHN0ID0gc2VsZWN0aW9uQ3JpdGVyaWFzW2ldO1xuICAgICAgaWYgKCEoc3QuZmllbGROYW1lICYmIHN0LnZhbHVlICE9PSB1bmRlZmluZWQgJiYgc3QudmFsdWUgIT09IG51bGwpKSB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnU2VsZWN0aW9uIENyaXRlcmlhIHBhcnNpbmcgZXJyb3InKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgY2F0UmVnZXggPSBuZXcgUmVnRXhwKCcoW1tBLVphLXowLTldK10pLionLCAnZycpO1xuICAgICAgY29uc3QgcmFuZ2VPcHRpb24gPSBzdC52YWx1ZSBhcyBDb250cmFjdC5SYW5nZVZhbHVlO1xuICAgICAgaWYgKGNhdFJlZ2V4LnRlc3Qoc3QuZmllbGROYW1lKSkge1xuICAgICAgICAvLyBIaWVyYXJjaGljYWwgdmFsdWUgc2VsZWN0aW9uXG4gICAgICAgIGNvbnN0IGhpZXJNb2RlbDogSGllcmFyY2hpY2FsU2VsZWN0aW9uTW9kZWwgPSB0aGlzLmFkZFRvUGFyYW1zTGlzdChzdC5maWVsZE5hbWUsIHN0LnZhbHVlKSBhcyBIaWVyYXJjaGljYWxTZWxlY3Rpb25Nb2RlbDtcbiAgICAgICAgc2VsZWN0aW9uTW9kZWxDb250YWluZXIuaGllck1vZGVsQXJyLnB1c2goaGllck1vZGVsKTtcbiAgICAgIH0gZWxzZSBpZiAocmFuZ2VPcHRpb24ubWluICE9PSB1bmRlZmluZWQgJiYgcmFuZ2VPcHRpb24ubWF4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy8gUmFuZ2UgdmFsdWUgc2VsZWN0aW9uXG4gICAgICAgIGNvbnN0IHF1YW50TW9kZWw6IFJhbmdlU2VsZWN0aW9uTW9kZWwgPSB0aGlzLmFkZFRvUmFuZ2VQYXJhbXNMaXN0KHN0LmZpZWxkTmFtZSwgcmFuZ2VPcHRpb24pO1xuICAgICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5xdWFudE1vZGVsQXJyLnB1c2gocXVhbnRNb2RlbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEaW1lbnNpb24gdmFsdWUgc2VsZWN0aW9uXG4gICAgICAgIGNvbnN0IGRpbU1vZGVsOiBEaW1lbnNpb25TZWxlY3Rpb25Nb2RlbCA9IHRoaXMuYWRkVG9QYXJhbXNMaXN0KHN0LmZpZWxkTmFtZSwgc3QudmFsdWUpIGFzIERpbWVuc2lvblNlbGVjdGlvbk1vZGVsO1xuICAgICAgICBzZWxlY3Rpb25Nb2RlbENvbnRhaW5lci5kaW1Nb2RlbEFyci5wdXNoKGRpbU1vZGVsKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2VsZWN0aW9uTW9kZWxDb250YWluZXI7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHRyYW5zZm9ybSB0aGUga2V5IHZhbHVlIHBhaXIgaW50byB2YWx1ZSBiYXNlZCBwcmVzIG1vZGVsIG9iamVjdC5cbiAgICpcbiAgICogQHBhcmFtIHZhbHVlU2VsZWN0aW9uTW9kZWxcbiAgICogQHBhcmFtIGZpZWxkTmFtZVxuICAgKiBAcGFyYW0gdmFsdWVcbiAgICovXG4gIHByaXZhdGUgYWRkVG9QYXJhbXNMaXN0KGZpZWxkTmFtZTogc3RyaW5nLCB2YWx1ZTogQ29udHJhY3QuQ2F0ZWdvcmljYWxWYWx1ZSB8IENvbnRyYWN0LlJhbmdlVmFsdWUpOiBWYWx1ZVNlbGVjdGlvbk1vZGVsIHtcbiAgICBjb25zdCB2YWx1ZVNlbGVjdGlvbk1vZGVsOiBWYWx1ZVNlbGVjdGlvbk1vZGVsID0gbmV3IFZhbHVlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICBjb25zdCBtYXJrVmFsdWVzOiBBcnJheTxzdHJpbmc+ID0gW107XG5cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgY29uc3QgdmFsdWVBcnI6IEFycmF5PHN0cmluZz4gPSB2YWx1ZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVBcnIubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbWFya1ZhbHVlcy5wdXNoKFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlQXJyW2ldKSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1hcmtWYWx1ZXMucHVzaChQYXJhbS5zZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZSkpO1xuICAgIH1cblxuICAgIHZhbHVlU2VsZWN0aW9uTW9kZWwucXVhbGlmaWVkRmllbGRDYXB0aW9uID0gZmllbGROYW1lO1xuICAgIHZhbHVlU2VsZWN0aW9uTW9kZWwuc2VsZWN0VmFsdWVzID0gbWFya1ZhbHVlcztcbiAgICByZXR1cm4gdmFsdWVTZWxlY3Rpb25Nb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdHJhbnNmb3JtIHRoZSBrZXkgdmFsdWUgcGFpciBpbnRvIHJhbmdlIGJhc2VkIHNlbGVjdGlvbiBwcmVzIG1vZGVsLlxuICAgKlxuICAgKiBUT0RPOiBOZWVkIHRvIGhhbmRsZSB0aGUgcGFyc2luZyBvZiBkYXRlIHR5cGUgdmFsdWVzLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWVTZWxlY3Rpb25Nb2RlbFxuICAgKiBAcGFyYW0gZmllbGROYW1lXG4gICAqIEBwYXJhbSB2YWx1ZVxuICAgKi9cbiAgcHJpdmF0ZSBhZGRUb1JhbmdlUGFyYW1zTGlzdChmaWVsZE5hbWU6IHN0cmluZywgdmFsdWU6IENvbnRyYWN0LlJhbmdlVmFsdWUpOiBSYW5nZVNlbGVjdGlvbk1vZGVsIHtcbiAgICBjb25zdCByYW5nZVNlbGVjdGlvbk1vZGVsOiBSYW5nZVNlbGVjdGlvbk1vZGVsID0gbmV3IFJhbmdlU2VsZWN0aW9uTW9kZWwoKTtcbiAgICByYW5nZVNlbGVjdGlvbk1vZGVsLnF1YWxpZmllZEZpZWxkQ2FwdGlvbiA9IGZpZWxkTmFtZTtcbiAgICBpZiAodmFsdWUubWF4ICE9PSB1bmRlZmluZWQgJiYgdmFsdWUubWF4ICE9PSBudWxsKSB7XG4gICAgICByYW5nZVNlbGVjdGlvbk1vZGVsLm1heFZhbHVlID0gUGFyYW0uc2VyaWFsaXplUGFyYW1ldGVyVmFsdWUodmFsdWUubWF4KTtcbiAgICB9XG4gICAgaWYgKHZhbHVlLm1pbiAhPT0gdW5kZWZpbmVkICYmIHZhbHVlLm1pbiAhPT0gbnVsbCkge1xuICAgICAgcmFuZ2VTZWxlY3Rpb25Nb2RlbC5taW5WYWx1ZSA9IFBhcmFtLnNlcmlhbGl6ZVBhcmFtZXRlclZhbHVlKHZhbHVlLm1pbik7XG4gICAgfVxuICAgIHJhbmdlU2VsZWN0aW9uTW9kZWwuaW5jbHVkZWQgPSB0aGlzLnZhbGlkYXRlTnVsbE9wdGlvblR5cGUodmFsdWUubnVsbE9wdGlvbik7XG4gICAgcmV0dXJuIHJhbmdlU2VsZWN0aW9uTW9kZWw7XG4gIH1cblxuICAvKipcbiAgICogTWV0aG9kIHRvIHZhbGlkYXRlIHRoZSBzZWxlY3Rpb24gdXBkYXRlIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBzZWxlY3Rpb25VcGRhdGVUeXBlXG4gICAqL1xuICBwcml2YXRlIHZhbGlkYXRlU2VsZWN0aW9uVXBkYXRlVHlwZShzZWxlY3Rpb25VcGRhdGVUeXBlOiBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlKTogc3RyaW5nIHtcbiAgICBpZiAoc2VsZWN0aW9uVXBkYXRlVHlwZSA9PT0gQ29udHJhY3QuU2VsZWN0aW9uVXBkYXRlVHlwZS5SZXBsYWNlKSB7XG4gICAgICByZXR1cm4gU2VsZWN0aW9uVXBkYXRlVHlwZUludGVybmFsLlJlcGxhY2U7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rpb25VcGRhdGVUeXBlID09PSBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlLkFkZCkge1xuICAgICAgcmV0dXJuIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbC5BZGQ7XG4gICAgfSBlbHNlIGlmIChzZWxlY3Rpb25VcGRhdGVUeXBlID09PSBDb250cmFjdC5TZWxlY3Rpb25VcGRhdGVUeXBlLlJlbW92ZSkge1xuICAgICAgcmV0dXJuIFNlbGVjdGlvblVwZGF0ZVR5cGVJbnRlcm5hbC5SZW1vdmU7XG4gICAgfVxuICAgIHJldHVybiBTZWxlY3Rpb25VcGRhdGVUeXBlSW50ZXJuYWwuUmVwbGFjZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBNZXRob2QgdG8gdmFsaWRhdGUgdGhlIGluY2x1ZGUgdHlwZSBmb3IgcmFuZ2Ugc2VsZWN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbnVsbE9wdGlvblxuICAgKi9cbiAgcHJpdmF0ZSB2YWxpZGF0ZU51bGxPcHRpb25UeXBlKG51bGxPcHRpb246IENvbnRyYWN0LkZpbHRlck51bGxPcHRpb24gfCB1bmRlZmluZWQpOiBzdHJpbmcge1xuICAgIGlmIChudWxsT3B0aW9uKSB7XG4gICAgICBpZiAobnVsbE9wdGlvbiA9PT0gQ29udHJhY3QuRmlsdGVyTnVsbE9wdGlvbi5OdWxsVmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcy5JbmNsdWRlTnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobnVsbE9wdGlvbiA9PT0gQ29udHJhY3QuRmlsdGVyTnVsbE9wdGlvbi5Ob25OdWxsVmFsdWVzKSB7XG4gICAgICAgIHJldHVybiBRdWFudGl0YXRpdmVJbmNsdWRlZFZhbHVlcy5JbmNsdWRlTm9uTnVsbDtcbiAgICAgIH0gZWxzZSBpZiAobnVsbE9wdGlvbiA9PT0gQ29udHJhY3QuRmlsdGVyTnVsbE9wdGlvbi5BbGxWYWx1ZXMpIHtcbiAgICAgICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVBbGw7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFF1YW50aXRhdGl2ZUluY2x1ZGVkVmFsdWVzLkluY2x1ZGVBbGw7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVR1cGxlSURJc05vbk5lZ2F0aXZlKHR1cGxlSWQ/OiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0dXBsZUlkICYmIHR1cGxlSWQgPiAwKSB7XG4gICAgICByZXR1cm4gdHVwbGVJZDtcbiAgICB9XG5cbiAgICAvLyAwIHdpbGwgbm90IHJlZmVyIHRvIGEgdmFsaWQgdHVwbGUgKHNpbmNlIHR1cGxlIGlkcyBhcmUgMS1iYXNlZCksXG4gICAgLy8gYnV0IGNhbiBiZSB1c2VkIGZvciBjbGVhcmluZyB0aGUgY3VycmVudCBob3ZlciBvciBzZWxlY3Rpb25cbiAgICByZXR1cm4gMDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXhlY3V0ZVJlc3BvbnNlLCBJbnRlcm5hbEFwaURpc3BhdGNoZXIsIEludGVybmFsVGFibGVhdUVycm9yLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIH0gZnJvbSAnLi4vLi4vRW51bU1hcHBpbmdzL0ludGVybmFsVG9FeHRlcm5hbEVudW1NYXBwaW5ncyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi8uLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgU2hvdWxkVGhyb3cgfSBmcm9tICcuLi8uLi9VdGlscy9FbnVtQ29udmVydGVyJztcblxuLyoqXG4gKiBFYWNoIFNlcnZjZUltcGwgc2hvdWxkIGV4dGVuZCB0aGlzIGJhc2UgY2xhc3MgZm9yIHRoZSBzYWtlIG9mXG4gKiBwcm9wZXIgZXJyb3IgaGFuZGxpbmcuICBUaGlzIGJhc2UgaGFuZGxlcyB0aGUgY29udmVyc2lvblxuICogZnJvbSBpbnRlcm5hbCBlcnJvcnMgdG8gZXh0ZXJuYWwgZXJyb3JzIHRoYXQgd2UgdGhyb3cgdG8gZGV2ZWxvcGVyc1xuICovXG5leHBvcnQgY2xhc3MgU2VydmljZUltcGxCYXNlIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2Rpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgICBwcm90ZWN0ZWQgX3JlZ2lzdHJ5SWQ6IG51bWJlcixcbiAgKSB7fVxuXG4gIHByb3RlY3RlZCBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyk6IFByb21pc2U8RXhlY3V0ZVJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoZXIuZXhlY3V0ZSh2ZXJiLCBwYXJhbXMpLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgLy8gQW55IGludGVybmFsIGVycm9yIHRoYXQgY29tZXMgZnJvbSB0aGUgZGlzcGF0Y2hlciBzaG91bGQgYmUgY29udmVydGVkXG4gICAgICAvLyB0byBhbiBleHRlcm5hbCBlcnJvciB1c2luZyB0aGUgZW51bSBtYXBwZXIgZm9yIGVycm9yIGNvZGVzLlxuICAgICAgY29uc3QgaW50ZXJuYWxFcnJvciA9IGVycm9yIGFzIEludGVybmFsVGFibGVhdUVycm9yO1xuICAgICAgY29uc3QgZXh0ZXJuYWxFcnJvckNvZGU6IEVycm9yQ29kZXMgPSBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MuZXJyb3JDb2RlLmNvbnZlcnQoaW50ZXJuYWxFcnJvci5lcnJvckNvZGUsIFNob3VsZFRocm93Lk5vKTtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoZXh0ZXJuYWxFcnJvckNvZGUsIGludGVybmFsRXJyb3IubWVzc2FnZSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCB7IFNoZWV0U2l6ZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU2l6ZVNlcnZpY2UgfSBmcm9tICcuLi9TaXplU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBTaXplU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTaXplU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gU2VydmljZU5hbWVzLlNpemU7XG4gIH1cblxuICBjaGFuZ2VTaXplQXN5bmMobmFtZTogc3RyaW5nLCBuZXdTaXplOiBTaGVldFNpemUpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnY2hhbmdlU2l6ZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5TaGVldE5hbWVdOiBuYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLk1pbkhlaWdodF06IG5ld1NpemUubWluU2l6ZT8uaGVpZ2h0IHx8IDAsXG4gICAgICBbUGFyYW1ldGVySWQuTWluV2lkdGhdOiBuZXdTaXplLm1pblNpemU/LndpZHRoIHx8IDAsXG4gICAgICBbUGFyYW1ldGVySWQuTWF4SGVpZ2h0XTogbmV3U2l6ZS5tYXhTaXplPy5oZWlnaHQgfHwgMCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5NYXhXaWR0aF06IG5ld1NpemUubWF4U2l6ZT8ud2lkdGggfHwgMCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0U2hlZXRTaXplLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChfcmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIFBhcmFtZXRlcklkLCBTdG9yeVBvaW50TW9kZWwsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgU3RvcnlBY3RpdmF0aW9uU2VydmljZSB9IGZyb20gJy4uL1N0b3J5QWN0aXZhdGlvblNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgU3RvcnlBY3RpdmF0aW9uU2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBTdG9yeUFjdGl2YXRpb25TZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuU3RvcnlBY3RpdmF0aW9uO1xuICB9XG5cbiAgYWN0aXZhdGVOZXh0U3RvcnlQb2ludEFzeW5jKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQWN0aXZhdGVOZXh0U3RvcnlQb2ludDtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWN0aXZhdGVOZXh0U3RvcnlQb2ludEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgYWN0aXZhdGVQcmV2aW91c1N0b3J5UG9pbnRBc3luYygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLkFjdGl2YXRlUHJldmlvdXNTdG9yeVBvaW50O1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhY3RpdmF0ZVByZXZpb3VzU3RvcnlQb2ludEFzeW5jJyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZSh2ZXJiLCBwYXJhbWV0ZXJzKS50aGVuPHZvaWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgYWN0aXZhdGVTdG9yeVBvaW50QXN5bmMoaW5kZXg6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHZlcmIgPSBWZXJiSWQuQWN0aXZhdGVTdG9yeVBvaW50O1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdhY3RpdmF0ZVN0b3J5UG9pbnRBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlN0b3J5UG9pbnRJbmRleF0gPSBpbmRleDtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHJldmVydFN0b3J5UG9pbnRBc3luYyhpbmRleDogbnVtYmVyKTogUHJvbWlzZTxTdG9yeVBvaW50TW9kZWw+IHtcbiAgICBjb25zdCB2ZXJiID0gVmVyYklkLlJldmVydFN0b3J5UG9pbnQ7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3JldmVydFN0b3J5UG9pbnRBc3luYycsXG4gICAgfTtcbiAgICBwYXJhbWV0ZXJzW1BhcmFtZXRlcklkLlN0b3J5UG9pbnRJbmRleF0gPSBpbmRleDtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUodmVyYiwgcGFyYW1ldGVycykudGhlbjxTdG9yeVBvaW50TW9kZWw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3BvbnNlLnJlc3VsdCBhcyBTdG9yeVBvaW50TW9kZWw7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgUGFyYW1ldGVySWQsIFZlcmJJZCwgVmlzdWFsSWQsIFZpc3VhbFNwZWNpZmljYXRpb24gfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFZpc3VhbE1vZGVsU2VydmljZSB9IGZyb20gJy4uL1Zpc3VhbE1vZGVsU2VydmljZSc7XG5pbXBvcnQgeyBTZXJ2aWNlSW1wbEJhc2UgfSBmcm9tICcuL1NlcnZpY2VJbXBsQmFzZSc7XG5cbmV4cG9ydCBjbGFzcyBWaXN1YWxNb2RlbFNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgVmlzdWFsTW9kZWxTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuVmlzdWFsTW9kZWw7XG4gIH1cblxuICBwdWJsaWMgZ2V0VmlzdWFsU3BlY2lmaWNhdGlvbkFzeW5jKHZpc3VhbElkOiBWaXN1YWxJZCk6IFByb21pc2U8Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLkdldFZpc3VhbFNwZWNpZmljYXRpb24sIHBhcmFtZXRlcnMpLnRoZW48Q29udHJhY3QuVmlzdWFsU3BlY2lmaWNhdGlvbj4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgVmlzdWFsU3BlY2lmaWNhdGlvbjtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgYWRkTWFya3NDYXJkRmllbGRzQXN5bmMoXG4gICAgdmlzdWFsSWQ6IFZpc3VhbElkLFxuICAgIG1hcmtzQ2FyZEluZGV4OiBudW1iZXIsXG4gICAgZW5jb2RpbmdUeXBlOiBDb250cmFjdC5FbmNvZGluZ1R5cGUsXG4gICAgY29sdW1uczogc3RyaW5nW10sXG4gICAgc3RhcnRJbmRleDogbnVtYmVyLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnYWRkTWFya3NDYXJkRmllbGRzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLldvcmtzaGVldE5hbWVdOiB2aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBbUGFyYW1ldGVySWQuTWFya3NDYXJkSW5kZXhdOiBtYXJrc0NhcmRJbmRleCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FbmNvZGluZ1R5cGVdOiBlbmNvZGluZ1R5cGUsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc106IGNvbHVtbnMsXG4gICAgICBbUGFyYW1ldGVySWQuU3RhcnRJbmRleF06IHN0YXJ0SW5kZXgsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5BZGRNYXJrc0NhcmRGaWVsZHMsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIG1vdmVNYXJrc0NhcmRGaWVsZEFzeW5jKFxuICAgIHZpc3VhbElkOiBWaXN1YWxJZCxcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGZyb21JbmRleDogbnVtYmVyLFxuICAgIHRvSW5kZXg6IG51bWJlcixcbiAgICBmaWVsZENvdW50ID0gMSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FkZE1hcmtzQ2FyZEZpZWxkc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogdmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgW1BhcmFtZXRlcklkLk1hcmtzQ2FyZEluZGV4XTogbWFya3NDYXJkSW5kZXgsXG4gICAgICBbUGFyYW1ldGVySWQuRnJvbUluZGV4XTogZnJvbUluZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLlRvSW5kZXhdOiB0b0luZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLkZpZWxkQ291bnRdOiBmaWVsZENvdW50LFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuTW92ZU1hcmtzQ2FyZEZpZWxkLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICB2aXN1YWxJZDogVmlzdWFsSWQsXG4gICAgbWFya3NDYXJkSW5kZXg6IG51bWJlcixcbiAgICBlbmNvZGluZ1R5cGU6IENvbnRyYWN0LkVuY29kaW5nVHlwZSxcbiAgICBzdGFydEluZGV4OiBudW1iZXIsXG4gICAgZGVsZXRlQ291bnQ6IG51bWJlcixcbiAgICBjb2x1bW5zOiBzdHJpbmdbXSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NwbGljZU1hcmtzQ2FyZEZpZWxkc0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Xb3Jrc2hlZXROYW1lXTogdmlzdWFsSWQud29ya3NoZWV0LFxuICAgICAgW1BhcmFtZXRlcklkLk1hcmtzQ2FyZEluZGV4XTogbWFya3NDYXJkSW5kZXgsXG4gICAgICBbUGFyYW1ldGVySWQuRW5jb2RpbmdUeXBlXTogZW5jb2RpbmdUeXBlLFxuICAgICAgW1BhcmFtZXRlcklkLlN0YXJ0SW5kZXhdOiBzdGFydEluZGV4LFxuICAgICAgW1BhcmFtZXRlcklkLkRlbGV0ZUNvdW50XTogZGVsZXRlQ291bnQsXG4gICAgICBbUGFyYW1ldGVySWQuQ29sdW1uc106IGNvbHVtbnMsXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TcGxpY2VNYXJrc0NhcmRGaWVsZHMsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgZWRpdEFsaWFzZXNEaWFsb2dBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdlZGl0QWxpYXNlc0RpYWxvZ0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5GaWVsZElkXTogZmllbGROYW1lLFxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuRWRpdEFsaWFzZXNEaWFsb2csIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG59XG4iLCJpbXBvcnQgeyBDdXN0b21WaWV3TW9kZWwsIEV4ZWN1dGVQYXJhbWV0ZXJzLCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEN1c3RvbVZpZXdJbXBsIH0gZnJvbSAnLi4vLi4vSW1wbC9DdXN0b21WaWV3SW1wbCc7XG5pbXBvcnQgeyBTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlUmVnaXN0cnknO1xuaW1wb3J0IHsgVml6U2VydmljZSB9IGZyb20gJy4uL1ZpelNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgVml6U2VydmljZUltcGwgZXh0ZW5kcyBTZXJ2aWNlSW1wbEJhc2UgaW1wbGVtZW50cyBWaXpTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBTZXJ2aWNlTmFtZXMuVml6O1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVZpekltYWdlQXN5bmMoaW5wdXRTcGVjOiBvYmplY3QpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdjcmVhdGVWaXpJbWFnZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5WaXpBUElJbnB1dEpzb25dOiBKU09OLnN0cmluZ2lmeShpbnB1dFNwZWMpLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5WaXpBUEksIHBhcmFtZXRlcnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICBjb25zdCByZXN1bHQgPSByZXNwb25zZS5yZXN1bHQgYXMgc3RyaW5nO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBhY3RpdmF0ZVNoZWV0QXN5bmMobmFtZTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2FjdGl2YXRlU2hlZXRBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuU3dpdGNoVG9TaGVldE5hbWVdOiBuYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5BY3RpdmF0ZVNoZWV0LCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRDdXN0b21WaWV3c0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q3VzdG9tVmlld0ltcGw+PiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2dldEN1c3RvbVZpZXdzQXN5bmMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRDdXN0b21WaWV3cywgcGFyYW1ldGVycykudGhlbjxBcnJheTxDdXN0b21WaWV3SW1wbD4+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlld3MgPSByZXNwb25zZS5yZXN1bHQgYXMgQXJyYXk8Q3VzdG9tVmlld01vZGVsPjtcbiAgICAgIHJldHVybiBjdXN0b21WaWV3cy5tYXAoKGN1c3RvbVZpZXc6IEN1c3RvbVZpZXdNb2RlbCkgPT4ge1xuICAgICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2hvd0N1c3RvbVZpZXdBc3luYyhjdXN0b21WaWV3TmFtZT86IHN0cmluZyB8IG51bGwpOiBQcm9taXNlPEN1c3RvbVZpZXdJbXBsIHwgdW5kZWZpbmVkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3Nob3dDdXN0b21WaWV3QXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdOYW1lXTogY3VzdG9tVmlld05hbWUgfHwgJycsIC8vIGEgZmFsc2V5IHZhbHVlIG1lYW5zIFwic2hvdyBvcmlnaW5hbCB2aWV3XCJcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2hvd0N1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGwgfCB1bmRlZmluZWQ+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gY3VzdG9tVmlldz8ubHVpZCA/IG5ldyBDdXN0b21WaWV3SW1wbChjdXN0b21WaWV3LCB0aGlzLl9yZWdpc3RyeUlkKSA6IHVuZGVmaW5lZDtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVDdXN0b21WaWV3QXN5bmMoY3VzdG9tVmlld05hbWU6IHN0cmluZyk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAncmVtb3ZlQ3VzdG9tVmlld0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3TmFtZV06IGN1c3RvbVZpZXdOYW1lLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5SZW1vdmVDdXN0b21WaWV3LCBwYXJhbWV0ZXJzKS50aGVuPEN1c3RvbVZpZXdJbXBsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbVZpZXcgPSByZXNwb25zZS5yZXN1bHQgYXMgQ3VzdG9tVmlld01vZGVsO1xuICAgICAgcmV0dXJuIG5ldyBDdXN0b21WaWV3SW1wbChjdXN0b21WaWV3LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQ3VzdG9tVmlld0FzeW5jKGN1c3RvbVZpZXdOYW1lOiBzdHJpbmcpOiBQcm9taXNlPEN1c3RvbVZpZXdJbXBsPiB7XG4gICAgLy8gQ3VzdG9tVmlld0lzRGVmYXVsdCBpcyBhIHJlcXVpcmVkIHBhcmFtZXRlciwgYnV0IG91ciBBUEkgaGFzIG5vdCBiZWVuIHVwZGF0ZWQgdG8gYWxsb3cgaXQgdG8gYmUgc3BlY2lmaWVkIHlldC5cbiAgICAvLyBXZSBzaG91bGQgYWRkIGEgJ2RlZmF1bHQnIHBhcmFtZXRlciB0byB0aGUgaW50ZXJmYWNlLlxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdzYXZlQ3VzdG9tVmlld0FzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3TmFtZV06IGN1c3RvbVZpZXdOYW1lLFxuICAgICAgW1BhcmFtZXRlcklkLkN1c3RvbVZpZXdJc0RlZmF1bHRdOiBmYWxzZSxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2F2ZVdvcmtib29rQXNDdXN0b21WaWV3LCBwYXJhbWV0ZXJzKS50aGVuPEN1c3RvbVZpZXdJbXBsPigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGN1c3RvbVZpZXcgPSByZXNwb25zZS5yZXN1bHQgYXMgQ3VzdG9tVmlld01vZGVsO1xuICAgICAgcmV0dXJuIG5ldyBDdXN0b21WaWV3SW1wbChjdXN0b21WaWV3LCB0aGlzLl9yZWdpc3RyeUlkKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRBY3RpdmVDdXN0b21WaWV3QXNEZWZhdWx0QXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NldEFjdGl2ZUN1c3RvbVZpZXdBc0RlZmF1bHRBc3luYycsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNldEFjdGl2ZUN1c3RvbVZpZXdBc0RlZmF1bHQsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNhdmVBc3luYyhjdXN0b21WaWV3OiBDdXN0b21WaWV3SW1wbCk6IFByb21pc2U8Q3VzdG9tVmlld0ltcGw+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2F2ZUFzeW5jJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3THVpZF06IGN1c3RvbVZpZXcubHVpZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3TmFtZV06IGN1c3RvbVZpZXcubmFtZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DdXN0b21WaWV3SXNEZWZhdWx0XTogY3VzdG9tVmlldy5pc0RlZmF1bHQsXG4gICAgICBbUGFyYW1ldGVySWQuQ3VzdG9tVmlld0lzUHVibGljXTogY3VzdG9tVmlldy5zaGFyZWQsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlVwZGF0ZUN1c3RvbVZpZXcsIHBhcmFtZXRlcnMpLnRoZW48Q3VzdG9tVmlld0ltcGw+KChyZXNwb25zZSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tVmlldyA9IHJlc3BvbnNlLnJlc3VsdCBhcyBDdXN0b21WaWV3TW9kZWw7XG4gICAgICByZXR1cm4gbmV3IEN1c3RvbVZpZXdJbXBsKGN1c3RvbVZpZXcsIHRoaXMuX3JlZ2lzdHJ5SWQpO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldEN1cnJlbnRTcmNBc3luYygpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkZ1bmN0aW9uTmFtZV06ICdnZXRDdXJyZW50U3JjQXN5bmMnLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5HZXRDdXJyZW50U3JjLCBwYXJhbWV0ZXJzKS50aGVuKChyZXNwb25zZSkgPT4gcmVzcG9uc2UucmVzdWx0IGFzIHN0cmluZyk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncyBhcyBFeHRlcm5hbEVudW1Db252ZXJ0ZXIgfSBmcm9tICcuLi8uLi9FbnVtTWFwcGluZ3MvRXh0ZXJuYWxUb0ludGVybmFsRW51bU1hcHBpbmdzJztcbmltcG9ydCB7IERhc2hib2FyZE9iamVjdEltcGwgfSBmcm9tICcuLi8uLi9JbXBsL0Rhc2hib2FyZE9iamVjdEltcGwnO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi4vLi4vVXRpbHMvRXJyb3JIZWxwZXJzJztcbmltcG9ydCB7IFBhcmFtIH0gZnJvbSAnLi4vLi4vVXRpbHMvUGFyYW0nO1xuaW1wb3J0IHsgU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZVJlZ2lzdHJ5JztcbmltcG9ydCB7IFpvbmVTZXJ2aWNlIH0gZnJvbSAnLi4vWm9uZVNlcnZpY2UnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnLi9TZXJ2aWNlSW1wbEJhc2UnO1xuXG5leHBvcnQgY2xhc3MgWm9uZVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgWm9uZVNlcnZpY2Uge1xuICBwdWJsaWMgZ2V0IHNlcnZpY2VOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIFNlcnZpY2VOYW1lcy5ab25lO1xuICB9XG5cbiAgcHVibGljIHNldFZpc2liaWxpdHlBc3luYyhcbiAgICBkYXNoYm9hcmQ6IHN0cmluZyxcbiAgICBkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPixcbiAgICB6b25lVmlzaWJpbGl0eU1hcDogQ29udHJhY3QuWm9uZVZpc2liaWxpdHlNYXAsXG4gICk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NldFZpc2liaWxpdHlBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRGFzaGJvYXJkXTogZGFzaGJvYXJkLFxuICAgICAgW1BhcmFtZXRlcklkLlpvbmVJZHNWaXNpYmlsaXR5TWFwXToge30sXG4gICAgfTtcblxuICAgIC8vIHpvbmVWaXNpYmlsaXR5TWFwIGNhbiBiZSBlaXRoZXIgYW4gb2JqZWN0IG9yIGEgTWFwIC0gY29udmVydCBpdCB0byBhIE1hcFxuICAgIGNvbnN0IHBhcmFtZXRlckFzTWFwID0gUGFyYW0uY29udmVydFBhcmFtZXRlclRvTWFwKHpvbmVWaXNpYmlsaXR5TWFwLCAnem9uZVZpc2liaWxpdHlNYXAnKTtcblxuICAgIHBhcmFtZXRlckFzTWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgIEVycm9ySGVscGVycy52ZXJpZnlab25lSXNWYWxpZChkYXNoYm9hcmRab25lTWFwLCBOdW1iZXIucGFyc2VJbnQoa2V5LCAxMCkpO1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeUVudW1WYWx1ZTxEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZT4odmFsdWUsIERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlUeXBlLCAnRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eVR5cGUnKTtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuWm9uZUlkc1Zpc2liaWxpdHlNYXBdW2tleV0gPSBFeHRlcm5hbEVudW1Db252ZXJ0ZXIuc2V0VmlzaWJpbGl0eVR5cGUuY29udmVydCh2YWx1ZSk7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5TZXRab25lVmlzaWJpbGl0eSwgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlQW5kUmVzaXplQXN5bmMoXG4gICAgZGFzaGJvYXJkOiBzdHJpbmcsXG4gICAgZGFzaGJvYXJkWm9uZU1hcDogTWFwPG51bWJlciwgRGFzaGJvYXJkT2JqZWN0SW1wbD4sXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXk6IENvbnRyYWN0LkRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkRhc2hib2FyZF06IGRhc2hib2FyZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVMaXN0XTogZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlQXJyYXksXG4gICAgfTtcblxuICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5LmZvckVhY2goKGRhc2hib2FyZE9iamVjdDogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlKSA9PiB7XG4gICAgICBFcnJvckhlbHBlcnMudmVyaWZ5Wm9uZUlzVmFsaWRBbmRGbG9hdGluZyhkYXNoYm9hcmRab25lTWFwLCBkYXNoYm9hcmRPYmplY3QuZGFzaGJvYXJkT2JqZWN0SUQpO1xuICAgICAgRXJyb3JIZWxwZXJzLnZlcmlmeVdpZHRoQW5kSGVpZ2h0T2ZEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUoZGFzaGJvYXJkT2JqZWN0KTtcbiAgICB9KTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLk1vdmVBbmRSZXNpemVab25lcywgcGFyYW1ldGVycykudGhlbjx2b2lkPigocmVzcG9uc2UpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgYSB0YWJsZSBzdW1tYXJ5LlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBpdCBpcyBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgVGFibGVTdW1tYXJ5IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVTdW1tYXJ5IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3RhYmxlSW5mbzogVGFibGVJbmZvKSB7fVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZUluZm8ubmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLmlkO1xuICB9XG5cbiAgcHVibGljIGdldCBjb25uZWN0aW9uSWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fdGFibGVJbmZvLmNvbm5lY3Rpb25JZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY3VzdG9tU1FMKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3RhYmxlSW5mby5jdXN0b21TUUw7XG4gIH1cbn1cbiIsImltcG9ydCB7IEVtYmVkZGluZ0Vycm9yQ29kZXMsIEVycm9yQ29kZXMsIFNoYXJlZEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEN1c3RvbSBlcnJvciBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIGRlZmF1bHQgSmF2YVNjcmlwdCBFcnJvciBvYmplY3QuXG4gKiBUaGlzIGFsbG93cyB1cyB0byBwcm92aWRlIGEgZmllbGQgd2l0aCBhIHNwZWNpZmljIGVycm9yIGNvZGVcbiAqIHNvIHRoYXQgZGV2ZWxvcGVycyBjYW4gbW9yZSBlYXNpbHkgcHJvZ3JhbW1hdGljYWxseSByZXNwb25kXG4gKiB0byBlcnJvciBzY2VuYXJpb3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZWF1RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9lcnJvckNvZGU6IEVycm9yQ29kZXMgfCBFbWJlZGRpbmdFcnJvckNvZGVzIHwgU2hhcmVkRXJyb3JDb2RlcyxcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKGAke19lcnJvckNvZGV9OiAke21lc3NhZ2V9YCk7XG5cbiAgICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC13aWtpL2Jsb2IvbWFzdGVyL0JyZWFraW5nLUNoYW5nZXMubWQjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrXG4gICAgLy8gRXJyb3IgaW5oZXJpdGFuY2UgZG9lcyBub3Qgd29yayBwcm9wZXJ0bHkgd2hlbiBjb21waWxpbmcgdG8gRVM1LCB0aGlzIGlzIGEgd29ya2Fyb3VuZCB0byBmb3JjZVxuICAgIC8vIHRoZSBwcm90byBjaGFpbiB0byBiZSBidWlsdCBjb3JyZWN0bHkuICBTZWUgdGhlIGdpdGh1YiBsaW5rIGFib3ZlIGZvciBkZXRhaWxzLlxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBUYWJsZWF1RXJyb3IucHJvdG90eXBlKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZXJyb3JDb2RlKCk6IEVycm9yQ29kZXMgfCBFbWJlZGRpbmdFcnJvckNvZGVzIHwgU2hhcmVkRXJyb3JDb2RlcyB7XG4gICAgcmV0dXJuIHRoaXMuX2Vycm9yQ29kZTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgSW50ZXJuYWxDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVZhbHVlIH0gZnJvbSAnLi4vTW9kZWxzL0dldERhdGFNb2RlbHMnO1xuXG4vKipcbiAqIEluIHZlcnNpb24gMiBvZiB0aGUgaW50ZXJmYWNlLCB3ZSBzaG91bGQgY29sbGFwc2UgdmFsdWUgaW50byBuYXRpdmVWYWx1ZSwgYW5kIGRvIGFsbCB0aGlzIHdvcmsgb3ZlclxuICogaW4gdGhlIHBsYXRmb3JtLlxuICovXG5leHBvcnQgY2xhc3MgRGF0YVZhbHVlRmFjdG9yeSB7XG4gIHB1YmxpYyBzdGF0aWMgTWFrZVBhcmFtZXRlckRhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVmFsdWUsIGRhdGFUeXBlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlKTogRGF0YVZhbHVlIHtcbiAgICAvLyBQYXJhbWV0ZXIgdmFsdWVzIGFyZSBhbGwgc3RyaW5ncywgY29udmVydCBmcm9tIHN0cmluZyB0byB2YWx1ZVxuICAgIHJldHVybiBuZXcgRGF0YVZhbHVlKFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsXG4gICAgICBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlQ29udmVydGVyLmNvbnZlcnRTdHJpbmdWYWx1ZVRvTmF0aXZlVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGRhdGFUeXBlKSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmZvcm1hdHRlZFZhbHVlLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUuYWxpYXNlZFZhbHVlLFxuICAgICAgaW50ZXJuYWxEYXRhVmFsdWUuaGFzQWxpYXMsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgTWFrZUZpbHRlckRhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVmFsdWUpOiBEYXRhVmFsdWUge1xuICAgIC8vIEZpbHRlcnMgYWxyZWFkeSBoYXZlIG5hdGl2ZSB0eXBlIGluIHZhbHVlLCBqdXN0IHVzZSB0aGF0IGZvciBuYXRpdmVWYWx1ZSBhbHNvXG4gICAgcmV0dXJuIG5ldyBEYXRhVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGludGVybmFsRGF0YVZhbHVlLnZhbHVlLCBpbnRlcm5hbERhdGFWYWx1ZS5mb3JtYXR0ZWRWYWx1ZSk7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIE1ha2VUYWJsZURhdGFWYWx1ZShpbnRlcm5hbERhdGFWYWx1ZTogSW50ZXJuYWxDb250cmFjdC5EYXRhVmFsdWUsIGRhdGFUeXBlOiBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlKTogRGF0YVZhbHVlIHtcbiAgICAvLyBEYXRhVGFibGVzIGNvbnRhaW4gYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IGRhdGUgYXMgc3RyaW5nIHwgJyVudWxsJVxuICAgIC8vIGNvbnZlcnRWYWx1ZVRvTmF0aXZlVmFsdWUgY29udmVydHMgZGF0ZXMgYXMgc3RyaW5nIHRvIGRhdGVzLCBhbmQgYW55IHNwZWNpYWwgdG8gbnVsbFxuICAgIC8vIChib29sZWFuLCBudW1iZXJzLCBzdHJpbmdzIGFyZSBwYXNzZWQgdGhyb3VnaClcbiAgICAvLyBCZWNhdXNlIG9mIEluY2x1ZGVEYXRhVmFsdWVzT3B0aW9uIC0gd2UgY2FuIGhhdmUgdW5kZWZpbmVkIHZhbHVlcywgd2hpY2ggYXJlIGRpZmZlcmVudCB0aGFuIGFueSBzcGVjaWFsXG4gICAgcmV0dXJuIG5ldyBEYXRhVmFsdWUoXG4gICAgICBpbnRlcm5hbERhdGFWYWx1ZS52YWx1ZSxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLnZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgPyBJbnRlcm5hbENvbnRyYWN0LkRhdGFUeXBlQ29udmVydGVyLmNvbnZlcnRWYWx1ZVRvTmF0aXZlVmFsdWUoaW50ZXJuYWxEYXRhVmFsdWUudmFsdWUsIGRhdGFUeXBlKVxuICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgIGludGVybmFsRGF0YVZhbHVlLmZvcm1hdHRlZFZhbHVlLFxuICAgICk7XG4gIH1cbn1cbiIsIi8qKlxuICogQSBQcm9taXNlIHdyYXBwZXIgY2xhc3MgYWxsb3dpbmcgZm9yIHJlc29sdmluZy9yZWplY3RpbmcgdGhlIFByb21pc2Ugb3V0c2lkZSB0aGUgY29udGV4dCBvZiBpdHMgY29uc3RydWN0b3IuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIERlZmVycmVkXG4gKiBAdGVtcGxhdGUgVFJlc29sdmUgVGhlIHR5cGUgdXNlZCB0byByZXNvbHZlIHRoZSBwcm9taXNlLlxuICogQHRlbXBsYXRlIFRSZWplY3QgVGhlIHR5cGUgdXNlZCB0byByZWplY3QgdGhlIHByb21pc2UuIERlZmF1bHRzIHRvIGFueS5cbiAqIEBsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8zNDYzNzQzNlxuICovXG5leHBvcnQgY2xhc3MgRGVmZXJyZWQ8VFJlc29sdmUsIFRSZWplY3QgPSBhbnk+IHtcbiAgcHJpdmF0ZSBfcHJvbWlzZTogUHJvbWlzZTxUUmVzb2x2ZT47XG4gIHByaXZhdGUgX3Jlc29sdmU6IChyZXNwb25zZTogVFJlc29sdmUgfCBQcm9taXNlTGlrZTxUUmVzb2x2ZT4pID0+IHZvaWQ7XG4gIHByaXZhdGUgX3JlamVjdDogKHJlYXNvbj86IFRSZWplY3QpID0+IHZvaWQ7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRGVmZXJyZWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLl9wcm9taXNlID0gbmV3IFByb21pc2U8VFJlc29sdmU+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMuX3Jlc29sdmUgPSByZXNvbHZlO1xuICAgICAgdGhpcy5fcmVqZWN0ID0gcmVqZWN0O1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIFByb21pc2UuXG4gICAqXG4gICAqIEByZWFkb25seVxuICAgKiBAdHlwZSB7UHJvbWlzZTxUUmVzb2x2ZT59XG4gICAqL1xuICBnZXQgcHJvbWlzZSgpOiBQcm9taXNlPFRSZXNvbHZlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3Byb21pc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVzb2x2ZXMgdGhlIHdyYXBwZWQgUHJvbWlzZS5cbiAgICpcbiAgICogQHBhcmFtIHsoVFJlc29sdmUgfCBQcm9taXNlTGlrZTxUUmVzb2x2ZT4pfSByZXNwb25zZSBUaGUgYXJndW1lbnQgdG8gYmUgcmVzb2x2ZWQgYnkgdGhlIFByb21pc2UuXG4gICAqIEByZXR1cm5zIHsqfSAge3ZvaWR9XG4gICAqL1xuICByZXNvbHZlKHJlc3BvbnNlOiBUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPik6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcmVzb2x2ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuX3Jlc29sdmUocmVzcG9uc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqXG4gICAqIEBwYXJhbSB7VFJlamVjdH0gW3JlYXNvbl0gVGhlIHJlYXNvbiB3aHkgdGhlIFByb21pc2UgcmVqZWN0ZWQuXG4gICAqIEByZXR1cm5zIHsqfSAge3ZvaWR9XG4gICAqL1xuICByZWplY3QocmVhc29uPzogVFJlamVjdCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fcmVqZWN0KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5fcmVqZWN0KHJlYXNvbik7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IFVucmVnaXN0ZXJUaW1lb3V0SW5NaWxsaXNlY29uZHMgPSAzMDAwMDtcbiIsImltcG9ydCB7IEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUVycm9yIH0gZnJvbSAnLi4vVGFibGVhdUVycm9yJztcblxuLyoqXG4gKiBUaGlzIGNsYXNzIGNvbnZlcnRzIGZyb20gYSBzb3VyY2UgZW51bSB2YWx1ZSB0byBkZXN0aW5hdGlvbiBlbnVtXG4gKiB2YWx1ZSBnaXZlbiBhIG1hcHBpbmcgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24gd2hlbiBjb25zdHJ1Y3RlZC5cbiAqXG4gKiBOb3RlOiBUaGlzIGV4YWN0IHNhbWUgY2xhc3MgaXMgZGVmaW5lZCBpbiBhcGktY29yZS4gIEdpdmVuIGl0cyBzbWFsbFxuICogbmF0dXJlLCBpdCBpcyBub3Qgd29ydGggaGF2aW5nIGluIGEgc2VwYXJhdGUgcHJvamVjdCB0byBzaGFyZSB0aGlzIGJldHdlZW5cbiAqIGFwaS1jb3JlIGFuZCBhcGktc2hhcmVkLiAgSWYgbW9yZSB1dGlsaXR5IGZ1bmN0aW9uYWxpdHkgaXMgYWRkZWQgdGhhdCBpcyB1c2VkIGJ5IGFwaS1jb3JlXG4gKiBhbmQgYXBpLXNoYXJlZCBidXQgaGFzIG5vIG90aGVyIGRlcGVuZGVjaWVzLCBhIHV0aWx0aXR5IHByb2plY3QgbWlnaHQgYmUgbWVyaXRlZCxcbiAqIGFuZCB0aGlzIGNsYXNzIGNvdWxkIGJlIG1vdmVkLlxuICovXG5leHBvcnQgY2xhc3MgRW51bUNvbnZlcnRlcjxUU291cmNlVHlwZSBleHRlbmRzIHN0cmluZywgVERlc3RpbmF0aW9uVHlwZT4ge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfbWFwcGluZ3M6IHsgW2VudW1WYWw6IHN0cmluZ106IFREZXN0aW5hdGlvblR5cGUgfSxcbiAgICBwcml2YXRlIF9kZWZhdWx0VmFsPzogVERlc3RpbmF0aW9uVHlwZSxcbiAgKSB7fVxuXG4gIHB1YmxpYyBjb252ZXJ0KGVudW1WYWw6IFRTb3VyY2VUeXBlLCB0aHJvd0lmTWlzc2luZzogU2hvdWxkVGhyb3cgPSBTaG91bGRUaHJvdy5ZZXMpOiBURGVzdGluYXRpb25UeXBlIHtcbiAgICBpZiAodGhpcy5fbWFwcGluZ3MuaGFzT3duUHJvcGVydHkoZW51bVZhbCkpIHtcbiAgICAgIHJldHVybiB0aGlzLl9tYXBwaW5nc1tlbnVtVmFsIGFzIHN0cmluZ107XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX2RlZmF1bHRWYWwgIT09IHVuZGVmaW5lZCAmJiB0aHJvd0lmTWlzc2luZyAhPT0gU2hvdWxkVGhyb3cuWWVzKSB7XG4gICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFZhbDtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYEVudW0gTWFwcGluZyBub3QgZm91bmQgZm9yOiAke2VudW1WYWx9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGVudW0gU2hvdWxkVGhyb3cge1xuICBZZXMgPSAneWVzJyxcbiAgTm8gPSAnbm8nLFxufVxuIiwiaW1wb3J0IHtcbiAgRGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlLFxuICBFeHBvcnREYXRhT3B0aW9ucyxcbiAgRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBFeHRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIFByaW50T3JpZW50YXRpb24sXG4gIFByaW50UGFnZVNpemUsXG4gIFByaW50U2NhbGluZyxcbiAgUmFuZ2VGaWx0ZXJPcHRpb25zLFxuICBTaGFyZWRFcnJvckNvZGVzLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJy4uL0ltcGwvRGFzaGJvYXJkT2JqZWN0SW1wbCc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgUGFyYW0gfSBmcm9tICcuL1BhcmFtJztcblxuaW50ZXJmYWNlIEVudW1MaWtlIHtcbiAgdG9TdHJpbmcoKTogc3RyaW5nO1xufVxuXG4vKipcbiAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjb25zdHJ1Y3QgY29tbW9uIGVycm9ycyB0aHJvdWdob3V0IHRoZSBleHRlcm5hbFxuICogcHJvamVjdHMgKGFwaS1zaGFyZWQsIGV4dGVuc2lvbnMtYXBpLCBldGMuKS4gIEl0IGhhcyBzb21lIGR1cGxpY2F0aW9uIHdpdGhcbiAqIHRoZSBFcnJvckhlbHBlcnMgY2xhc3MgaW4gYXBpLWNvcmUsIGJ1dCBpcyBzZXBhcmF0ZSBkdWUgdG8gdGhlIG5lZWQgdG8gdGhyb3dcbiAqIGFuIGV4dGVybmFsIFRhYmxlYXVFcnJvciB2cy4gYW4gSW50ZXJuYWxUYWJsZWF1RXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBFcnJvckhlbHBlcnMge1xuICAvKipcbiAgICogVGhyb3dzIHdpdGggY29kZSBJbnRlcm5hbEVycm9yLlxuICAgKlxuICAgKiBAcGFyYW0gYXBpTmFtZSBuYW1lIG9mIGFwaSB0aGF0IHdhcyBjYWxsZWQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFwaU5vdEltcGxlbWVudGVkKGFwaU5hbWU6IHN0cmluZyk6IFRhYmxlYXVFcnJvciB7XG4gICAgcmV0dXJuIG5ldyBUYWJsZWF1RXJyb3IoU2hhcmVkRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJHthcGlOYW1lfSBBUEkgbm90IHlldCBpbXBsZW1lbnRlZC5gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gaW50ZXJuYWwgZXJyb3IgaWYgYXJndW1lbnQgaXMgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUludGVybmFsVmFsdWUoYXJndW1lbnRWYWx1ZTogYW55LCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgbnVsbCBvciB1bmRlZmluZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcmd1bWVudFZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVBhcmFtZXRlcihhcmd1bWVudFZhbHVlOiBhbnksIGFyZ3VtZW50TmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKGFyZ3VtZW50VmFsdWUgPT09IG51bGwgfHwgYXJndW1lbnRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYCR7YXJndW1lbnRWYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgcGFyYW1ldGVyOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVGhyb3dzIGFuIEludmFsaWRQYXJhbWV0ZXIgZXJyb3IgaWYgYXJndW1lbnQgaXMgbm90IHRoZSBzcGVjaWZpZWQgdHlwZS5cbiAgICogRm9yIG9iamVjdHMsIGl0IGp1c3QgdGVzdHMgdGhhdCBpdCBpcyBhbiBvYmplY3RcbiAgICpcbiAgICogQHBhcmFtIGFyZ3VtZW50VmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBleHBlY3RlZFR5cGUgZXhwZWN0ZWQgcmVzdWx0IG9mIHR5cGVvZlxuICAgKiBAcGFyYW0gYXJndW1lbnROYW1lIG5hbWUgb2YgYXJndW1lbnQgdG8gdmVyaWZ5XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVBhcmFtZXRlclR5cGUoYXJndW1lbnRWYWx1ZTogYW55LCBleHBlY3RlZFR5cGU6IHN0cmluZywgYXJndW1lbnROYW1lOiBzdHJpbmcpIHtcbiAgICBpZiAodHlwZW9mIGFyZ3VtZW50VmFsdWUgIT09IGV4cGVjdGVkVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2FyZ3VtZW50VmFsdWV9IGhhcyBpbnZhbGlkIHR5cGUgZm9yIHBhcmFtZXRlcjogJHthcmd1bWVudE5hbWV9LmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiBhcmd1bWVudCBpcyBlbXB0eSBzdHJpbmcsIG51bGwgb3IgdW5kZWZpbmVkLlxuICAgKlxuICAgKiBAcGFyYW0gYXJndW1lbnRWYWx1ZSB2YWx1ZSB0byB2ZXJpZnlcbiAgICogQHBhcmFtIGFyZ3VtZW50TmFtZSBuYW1lIG9mIGFyZ3VtZW50IHRvIHZlcmlmeVxuICAgKi9cbiAgLyp0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlTdHJpbmdQYXJhbWV0ZXIoYXJndW1lbnRWYWx1ZTogc3RyaW5nLCBhcmd1bWVudE5hbWU6IHN0cmluZykge1xuICAgIGlmIChhcmd1bWVudFZhbHVlID09PSBudWxsIHx8IGFyZ3VtZW50VmFsdWUgPT09IHVuZGVmaW5lZCB8fCBhcmd1bWVudFZhbHVlID09PSAnJykge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2FyZ3VtZW50VmFsdWV9IGlzIGludmFsaWQgdmFsdWUgZm9yIHBhcmFtdGVyOiAke2FyZ3VtZW50TmFtZX1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgcGFzc2VkIHZhbHVlIGlzIGEgdmFsaWQgdmFsdWUgZm9yIHRoYXQgZW51bS5cbiAgICpcbiAgICogU3RyaW5nIGVudW1zIGFyZSB7c3RyaW5nIDogc3RyaW5nfSBkaWN0aW9uYXJpZXMgd2hpY2ggYXJlIG5vdCByZXZlcnNlIG1hcHBhYmxlXG4gICAqIFRoaXMgaXMgYW4gdWdseSB3b3JrYXJvdW5kXG4gICAqXG4gICAqIEBwYXJhbSBlbnVtVmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBlbnVtVHlwZSBlbnVtIHRvIHZlcmlmeSBhZ2FpbnN0XG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVmFsaWRFbnVtVmFsdWU8RW51bVR5cGUgZXh0ZW5kcyBFbnVtTGlrZT4oZW51bVZhbHVlOiBFbnVtVHlwZSwgZW51bVR5cGU6IGFueSk6IGJvb2xlYW4ge1xuICAgIGxldCBpc1ZhbGlkID0gZmFsc2U7XG4gICAgT2JqZWN0LmtleXMoZW51bVR5cGUpLmZvckVhY2goKGVudW1LZXkpID0+IHtcbiAgICAgIGlmIChlbnVtVHlwZVtlbnVtS2V5XSA9PT0gZW51bVZhbHVlLnRvU3RyaW5nKCkpIHtcbiAgICAgICAgaXNWYWxpZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gaXNWYWxpZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBwYXNzZWQgdmFsdWUgaXMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhhdCBlbnVtLlxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgZW51bSB2YWx1ZSBpcyBub3QgdmFsaWQuXG4gICAqXG4gICAqIFN0cmluZyBlbnVtcyBhcmUge3N0cmluZyA6IHN0cmluZ30gZGljdGlvbmFyaWVzIHdoaWNoIGFyZSBub3QgcmV2ZXJzZSBtYXBwYWJsZVxuICAgKiBUaGlzIGlzIGFuIHVnbHkgd29ya2Fyb3VuZFxuICAgKlxuICAgKiBAcGFyYW0gZW51bVZhbHVlIHZhbHVlIHRvIHZlcmlmeVxuICAgKiBAcGFyYW0gZW51bVR5cGUgZW51bSB0byB2ZXJpZnkgYWdhaW5zdFxuICAgKiBAcGFyYW0gZW51bU5hbWUgZW51bSBuYW1lIGZvciBjbGVhciBlcnJvciBtZXNzYWdlXG4gICAqL1xuICAvKnRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUVudW1WYWx1ZTxFbnVtVHlwZSBleHRlbmRzIEVudW1MaWtlPihlbnVtVmFsdWU6IEVudW1UeXBlLCBlbnVtVHlwZTogYW55LCBlbnVtTmFtZTogc3RyaW5nKSB7XG4gICAgaWYgKCFFcnJvckhlbHBlcnMuaXNWYWxpZEVudW1WYWx1ZShlbnVtVmFsdWUsIGVudW1UeXBlKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke2VudW1WYWx1ZX0gaXMgaW52YWxpZCB2YWx1ZSBmb3IgZW51bTogJHtlbnVtTmFtZX0uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHBhc3NlZCB2YWx1ZSBpcyBiZXR3ZWVuIFttaW4sIG1heCkgLi4uIG1pbiA8PSB2YWx1ZSA8IG1heFxuICAgKiBUaHJvd3MgYW4gSW52YWxpZFBhcmFtZXRlciBlcnJvciBpZiB0aGUgdmFsdWUgaXMgbm90IHZhbGlkLlxuICAgKlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgdmFsdWUgdG8gdmVyaWZ5XG4gICAqIEBwYXJhbSBtaW4gICB2YWx1ZSBtdXN0IGJlID49IG1pblxuICAgKiBAcGFyYW0gbWF4ICAgdmFsdWUgbXVzdCBiZSA8IG1heFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZSh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgICBsZXQgaXNWYWxpZCA9IG1pbiA8PSB2YWx1ZSAmJiB2YWx1ZSA8IG1heDtcblxuICAgIGlmICghaXNWYWxpZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsIGAke3ZhbHVlfSBpcyBpbnZhbGlkIHZhbHVlIGZvciByYW5nZTogWyR7bWlufS4uJHttYXh9KWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgcGFyYW1zIG1pbiBhbmQgbWF4IGZvciBhcHBseWluZyByYW5nZSBmaWx0ZXIuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFBhcmFtZXRlciBpZiByYW5nZSBpcyBpbnZhbGlkLlxuICAgKlxuICAgKiBAcGFyYW0gbWluIHJhbmdlIG1pblxuICAgKiBAcGFyYW0gbWF4IHJhbmdlIG1heFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlSYW5nZVBhcmFtVHlwZShtaW46IFJhbmdlRmlsdGVyT3B0aW9uc1snbWluJ10sIG1heDogUmFuZ2VGaWx0ZXJPcHRpb25zWydtYXgnXSk6IHZvaWQge1xuICAgIGNvbnN0IGlzTWluRGVmaW5lZCA9IG1pbiAhPT0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IGlzTWF4RGVmaW5lZCA9IG1heCAhPT0gdW5kZWZpbmVkO1xuXG4gICAgaWYgKCFpc01pbkRlZmluZWQgJiYgIWlzTWF4RGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIGF0IGxlYXN0IG9uZSBvZiBtaW4gb3IgbWF4IGlzIHJlcXVpcmVkLicpO1xuICAgIH1cblxuICAgIGlmIChpc01pbkRlZmluZWQgJiYgIVBhcmFtLmlzVHlwZU51bWJlcihtaW4pICYmICFQYXJhbS5pc1R5cGVEYXRlKG1pbikpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICAgIFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlcixcbiAgICAgICAgJ1VuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgb25seSBEYXRlIGFuZCBudW1iZXIgYXJlIGFsbG93ZWQgZm9yIHBhcmFtZXRlciBtaW4uJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGlzTWF4RGVmaW5lZCAmJiAhUGFyYW0uaXNUeXBlTnVtYmVyKG1heCkgJiYgIVBhcmFtLmlzVHlwZURhdGUobWF4KSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgICAnVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBvbmx5IERhdGUgYW5kIG51bWJlciBhcmUgYWxsb3dlZCBmb3IgcGFyYW1ldGVyIG1heC4nLFxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoaXNNaW5EZWZpbmVkICYmIGlzTWF4RGVmaW5lZCAmJiB0eXBlb2YgbWluICE9PSB0eXBlb2YgbWF4KSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgICdVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUsIHBhcmFtZXRlcnMgbWluIGFuZCBtYXggc2hvdWxkIGJlIG9mIHRoZSBzYW1lIHR5cGUuJyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHpvbmVJZCBpcyBwcmVzZW50IGluIHRoZSBjdXJyZW50IGRhc2hib2FyZC5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIGVpdGhlciBjb25kaXRpb24gaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBkYXNoYm9hcmRab25lTWFwIEEgbWFwIG9mIHpvbmVJZCdzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBwYXJhbSB6b25lSUQgWm9uZUlkIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlab25lSXNWYWxpZChkYXNoYm9hcmRab25lTWFwOiBNYXA8bnVtYmVyLCBEYXNoYm9hcmRPYmplY3RJbXBsPiwgem9uZUlEOiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZGFzaGJvYXJkWm9uZU1hcC5oYXMoem9uZUlEKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoXG4gICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICBgVW5leHBlY3RlZCBpbnZhbGlkIHBhcmFtIHZhbHVlLCBEYXNoYm9hcmQgT2JqZWN0IElkOiAke3pvbmVJRH0gaXMgbm90IHByZXNlbnQgaW4gZGFzaGJvYXJkLmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHRoZSB6b25lIGlzIHByZXNlbnQgYW5kIGZsb2F0aW5nIGluIHRoZSBjdXJyZW50IGRhc2hib2FyZC5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIGVpdGhlciBjb25kaXRpb24gaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBkYXNoYm9hcmRab25lTWFwIEEgbWFwIG9mIHpvbmVJZCdzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGRhc2hib2FyZCBvYmplY3QuXG4gICAqIEBwYXJhbSB6b25lSUQgWm9uZUlkIHRvIGJlIHZhbGlkYXRlZFxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlab25lSXNWYWxpZEFuZEZsb2F0aW5nKGRhc2hib2FyZFpvbmVNYXA6IE1hcDxudW1iZXIsIERhc2hib2FyZE9iamVjdEltcGw+LCB6b25lSUQ6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChkYXNoYm9hcmRab25lTWFwLmhhcyh6b25lSUQpICYmIGRhc2hib2FyZFpvbmVNYXAuZ2V0KHpvbmVJRCkhLmlzRmxvYXRpbmcpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLFxuICAgICAgYFVuZXhwZWN0ZWQgaW52YWxpZCBwYXJhbSB2YWx1ZSwgRGFzaGJvYXJkIE9iamVjdCBJZDogJHt6b25lSUR9IGlzIG5vdCBwcmVzZW50IG9yIGlzIGEgZml4ZWQgem9uZSBpbiB0aGUgZGFzaGJvYXJkLmAsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGF0IHdpZHRoIGFuZCBoZWlnaHQgYXJlID4gMCBmb3IgZWFjaCBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgb2JqZWN0LlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgZWl0aGVyIGNvbmRpdGlvbiBpcyBmYWxzZS5cbiAgICpcbiAgICogQHBhcmFtIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZSBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUgb2JqZWN0IGZvciB3aGljaCB3aWR0aCBhbmQgaGVpZ2h0IHdpbGwgYmUgdmFsaWRhdGVkXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeVdpZHRoQW5kSGVpZ2h0T2ZEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUoXG4gICAgZGFzaGJvYXJkT2JqZWN0UG9zaXRpb25BbmRTaXplVXBkYXRlOiBEYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUsXG4gICk6IHZvaWQge1xuICAgIGlmIChkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUud2lkdGggPCAwIHx8IGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZS5oZWlnaHQgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsXG4gICAgICAgIGBVbmV4cGVjdGVkIGludmFsaWQgcGFyYW0gdmFsdWUgZm9yIGRhc2hib2FyZCBvYmplY3QgSUQgJHtkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGUuZGFzaGJvYXJkT2JqZWN0SUR9OmAgK1xuICAgICAgICAgIGAgbmVnYXRpdmUgd2lkdGhzIGFuZCBoZWlnaHRzIGFyZSBub3QgYWxsb3dlZC5gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVmVyaWZpZXMgaXMgdGhlIGdpdmVuIHNoZWV0IG5hbWUgaXMgaW4gdGhlIGxpc3Qgb2Ygc2hlZXRzIG5hbWVzIGFsbG93ZWQgZm9yIGV4cG9ydGluZy5cbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHRoZSBjb25kaXRpb24gYWJvdmUgaXMgZmFsc2UuXG4gICAqXG4gICAqIEBwYXJhbSBleHBvcnRhYmxlU2hlZXROYW1lcyBBIGxpc3Qgb2Ygc2hlZXQgbmFtZXMgYWxsb3dlZCBmb3IgZXhwb3J0aW5nXG4gICAqIEBwYXJhbSBzaGVldE5hbWUgdGhlIG5hbWUgb2YgdGhlIHNoZWV0IHNlbGVjdGVkIGZvciBleHBvcnRcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdmVyaWZ5U2hlZXROYW1lKGV4cG9ydGFibGVTaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LCBzaGVldE5hbWU6IHN0cmluZykge1xuICAgIGlmICghZXhwb3J0YWJsZVNoZWV0TmFtZXMuaW5jbHVkZXMoc2hlZXROYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uU2hlZXQsXG4gICAgICAgICdzaGVldE5hbWUgcGFyYW1ldGVyIG11c3QgYmVsb25nIHRvIGEgd29ya3NoZWV0IHdpdGhpbiB0aGUgY3VycmVudCB2aWV3JyxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBFeHBvcnREYXRhT3B0aW9ucyBvYmplY3RcbiAgICogVGhyb3dzIHdpdGggZXJyb3IgY29kZSBJbnZhbGlkUGFyYW1ldGVyIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IG9mIEV4cG9ydERhdGFPcHRpb25zIHR5cGUuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIFRoZSBFeHBvcnREYXRhT3B0aW9ucyBvYmplY3QgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBDU1YgZmlsZSBmb3IgZXhwb3J0RGF0YUFzeW5jLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlFeHBvcnREYXRhT3B0aW9ucyhvcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyk6IHZvaWQge1xuICAgIGlmIChcbiAgICAgICghUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQob3B0aW9ucy5pZ25vcmVBbGlhc2VzKSAmJiAhUGFyYW0uaXNUeXBlQm9vbChvcHRpb25zLmlnbm9yZUFsaWFzZXMpKSB8fFxuICAgICAgKCFQYXJhbS5pc051bGxPclVuZGVmaW5lZChvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkKSAmJiAhQXJyYXkuaXNBcnJheShvcHRpb25zLmNvbHVtbnNUb0luY2x1ZGVCeUlkKSlcbiAgICApXG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgJ29wdGlvbnMgcGFyYW1hdGVyIG11c3QgYmUgb2YgdHlwZSBFeHBvcnREYXRhT3B0aW9ucycpO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIGlmIHRoZSBzaGVldCBuYW1lcyBhcmUgaW5jbHVkZWQgaW4gYW55IG9mIHRoZSBleHBvcnQgc2NlbmFyaW9zLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgYW4gYXJyYXkuXG4gICAqIFRocm93cyB3aXRoIGVycm9yIGNvZGUgSW52YWxpZFNlbGVjdGlvblNoZWV0IGlmIHRoZXJlIGFyZSBhcnJheSBlbnRyaWVzIHRoYXQgZG9udCBleGlzdCBvciBpZiB0aGVyZSBpcyBtaXhpbmcgYmV0d2VlbiBzaGVldHMgZnJvbSB0aGUgZGFzaGJvYXJkIGFuZCBzaGVldCBmcm9tIHRoZSB3b3JrYm9vay5cbiAgICpcbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgTGlzdCBvZiBzaGVldCBuYW1lcyBzZWxlY3RlZCBmb3IgZXhwb3J0aW5nLlxuICAgKiBAcGFyYW0gZXhwb3J0U2NlbmFyaW9zIGFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjdXJyZW50IHNoZWV0IG5hbWUsIGV4cG9ydGFibGUgc2hlZXRzIGZyb20gdGhlIGRhc2hib2FyZCwgYW5kIGV4cG9ydGFibGUgc2hlZXRzIGZyb20gdGhlIHdvcmtib29rLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyB2ZXJpZnlTaGVldE5hbWVzRm9yUERGQW5kUFBUKHNoZWV0TmFtZXM6IEFycmF5PHN0cmluZz4sIGV4cG9ydFNjZW5hcmlvczogRXhwb3J0U2NlbmFyaW9zRm9yUERGQW5kUG93ZXJQb2ludCk6IHZvaWQge1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzaGVldE5hbWVzKSkgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdzaGVldE5hbWVzIHBhcmFtZXRlciBtdXN0IGJlIGFuIGFycmF5Jyk7XG4gICAgaWYgKHNoZWV0TmFtZXMubGVuZ3RoID09PSAwKSB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ3NoZWV0TmFtZXMgc2hvdWxkIG5vdCBiZSBlbXB0eScpO1xuXG4gICAgY29uc3QgaXNJbmNsdWRlZEluRGFzaGJvYXJkID0gc2hlZXROYW1lcy5ldmVyeSgoc2hlZXROYW1lOiBzdHJpbmcpID0+XG4gICAgICBleHBvcnRTY2VuYXJpb3MuZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tRGFzaGJvYXJkLmluY2x1ZGVzKHNoZWV0TmFtZSksXG4gICAgKTtcbiAgICBpZiAoaXNJbmNsdWRlZEluRGFzaGJvYXJkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlzSW5jbHVkZWRJbldvcmtib29rID0gc2hlZXROYW1lcy5ldmVyeSgoc2hlZXROYW1lOiBzdHJpbmcpID0+XG4gICAgICBleHBvcnRTY2VuYXJpb3MuZXhwb3J0YWJsZVNoZWV0TmFtZXNGcm9tV29ya2Jvb2suaW5jbHVkZXMoc2hlZXROYW1lKSxcbiAgICApO1xuICAgIGlmIChpc0luY2x1ZGVkSW5Xb3JrYm9vaykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBpc0N1cnJlbnRTaGVldCA9IHNoZWV0TmFtZXMubGVuZ3RoID09PSAxICYmIHNoZWV0TmFtZXNbMF0gPT09IGV4cG9ydFNjZW5hcmlvcy5jdXJyZW50U2hlZXROYW1lO1xuICAgIGlmIChpc0N1cnJlbnRTaGVldCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIEV4cG9ydCByZXF1aXJlbWVudDogYWxsIHNoZWV0IG5hbWVzIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3Qgb2YgZXhwb3J0YWJsZSBzaGVldHMgaW4gdGhlIGRhc2hib2FyZCBvclxuICAgIC8vIGFsbCBzaGVldCBuYW1lcyBtdXN0IGJlIGluY2x1ZGVkIGluIHRoZSBsaXN0IG9mIGV4cG9ydGFibGUgc2hlZXRzIGluIHRoZSB3b3JrYm9vaywgb3IgdGhlIHNoZWV0IG5hbWUgaXMgdGhlIGN1cnJlbnQgc2hlZXRcbiAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgU2hhcmVkRXJyb3JDb2Rlcy5JbnZhbGlkU2VsZWN0aW9uU2hlZXQsXG4gICAgICAnc2hlZXROYW1lcyBwYXJhbWV0ZXIgbXVzdCBoYXZlIGFsbCBpdHMgZW50cmllcyBiZSBleHBvcnRhYmxlIHNoZWV0IG5hbWVzIGZyb20gdGhlIGRhc2hib2FyZCBvciBhbGwgaXRzIGVudHJpZXMgYmUgZXhwb3J0YWJsZSBzaGVldCBuYW1lcyBmcm9tIHRoZSB3b3JrYm9vaycsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBvYmplY3QncyBwcm9wZXJ0aWVzLlxuICAgKiBUaHJvd3Mgd2l0aCBlcnJvciBjb2RlIEludmFsaWRQYXJhbWV0ZXIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgb2YgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyB0eXBlLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBUaGUgZXh0ZXJuYWwgdXNlci1mYWNpbmcgRXhwb3J0UERGT3B0aW9ucyBvYmplY3QgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBQREYgZmlsZSBmb3IgZXhwb3J0UERGQXN5bmMuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHZlcmlmeUV4cG9ydFBERk9wdGlvbnMob3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMudmVyaWZ5RW51bVZhbHVlPFByaW50T3JpZW50YXRpb24+KG9wdGlvbnMub3JpZW50YXRpb24sIFByaW50T3JpZW50YXRpb24sICdQcmludE9yaWVudGF0aW9uJyk7XG4gICAgICB0aGlzLnZlcmlmeUVudW1WYWx1ZTxQcmludFBhZ2VTaXplPihvcHRpb25zLnBhZ2VTaXplLCBQcmludFBhZ2VTaXplLCAnUHJpbnRQYWdlU2l6ZScpO1xuICAgICAgdGhpcy52ZXJpZnlFbnVtVmFsdWU8UHJpbnRTY2FsaW5nPihvcHRpb25zLnNjYWxpbmcsIFByaW50U2NhbGluZywgJ1ByaW50U2NhbGluZycpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludmFsaWRQYXJhbWV0ZXIsICdvcHRpb25zIHBhcmFtZXRlciBtdXN0IGJlIG9mIHR5cGUgRXhwb3J0UERGT3B0aW9ucycpO1xuICAgIH1cbiAgfVxufVxuIiwiaW1wb3J0IHtcbiAgRXhwb3J0TGF5b3V0T3B0aW9ucyxcbiAgRXhwb3J0UERGT3B0aW9ucyBhcyBJbnRlcm5hbEV4cG9ydFBERk9wdGlvbnMsXG4gIEZpdFBhZ2VzLFxuICBQYWdlT3JpZW50YXRpb24sXG4gIFBhZ2VTY2FsaW5nT3B0aW9uLFxuICBQYWdlU2l6ZU9wdGlvbixcbiAgU2NhbGVNb2RlLFxuICBTY2FsaW5nU2VsZWN0aW9uLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgRXhwb3J0RGF0YU9wdGlvbnMsXG4gIEV4cG9ydFBERk9wdGlvbnMgYXMgRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zLFxuICBQcmludE9yaWVudGF0aW9uLFxuICBQcmludFBhZ2VTaXplLFxuICBQcmludFNjYWxpbmcsXG4gIFNoYXJlZEVycm9yQ29kZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuXG4vKipcbiAqIEhlbHBlciBtZXRob2RzIGZvciBFeHBvcnQgQVBJcy5cbiAqXG4gKiBAY2xhc3MgRXhwb3J0SGVscGVyc1xuICovXG5leHBvcnQgY2xhc3MgRXhwb3J0SGVscGVycyB7XG4gIHB1YmxpYyBzdGF0aWMgRGVmYXVsdERhdGFPcHRpb25zOiBFeHBvcnREYXRhT3B0aW9ucyA9IHtcbiAgICBpZ25vcmVBbGlhc2VzOiBmYWxzZSxcbiAgICBjb2x1bW5zVG9JbmNsdWRlQnlJZDogW10sXG4gIH07XG5cbiAgcHVibGljIHN0YXRpYyBEZWZhdWx0UERGT3B0aW9uczogRXh0ZXJuYWxFeHBvcnRQREZPcHRpb25zID0ge1xuICAgIHNjYWxpbmc6IFByaW50U2NhbGluZy5BdXRvbWF0aWMsXG4gICAgcGFnZVNpemU6IFByaW50UGFnZVNpemUuTGV0dGVyLFxuICAgIG9yaWVudGF0aW9uOiBQcmludE9yaWVudGF0aW9uLlBvcnRyYWl0LFxuICB9O1xuXG4gIHByaXZhdGUgc3RhdGljIERlZmF1bHRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zID0ge1xuICAgIGltYWdlSGVpZ2h0OiAwLFxuICAgIGltYWdlV2lkdGg6IDAsXG4gICAgcGFnZUZpdEhvcml6b250YWw6IDEsXG4gICAgcGFnZUZpdFZlcnRpY2FsOiAxLFxuICAgIHBhZ2VPcmllbnRhdGlvbk9wdGlvbjogUGFnZU9yaWVudGF0aW9uLlBvcnRyYWl0LFxuICAgIHBhZ2VTY2FsZU1vZGU6IFNjYWxlTW9kZS5TY2FsZUF1dG8sXG4gICAgcGFnZVNjYWxlUGVyY2VudDogMTAwLFxuICAgIHBhZ2VTaXplT3B0aW9uOiBQYWdlU2l6ZU9wdGlvbi5MZXR0ZXIsXG4gIH07XG5cbiAgLyoqXG4gICAqIE1vZGlmaWVzIHRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zJyBwcm9wZXJ0aWVzIGJhc2VkIG9uIHRoZSBnaXZlbiBQREYgZXhwb3J0IGNvbmZpZ3VyYXRpb24uXG4gICAqIFRoaXMgbWV0aG9kIHdpbGwgY29uc3RydWN0IHRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIGlkZW50aWNhbGx5IHRvIGhvdyB0aGUgJ0V4cG9ydCBQREYnIGRpYWxvZyBjb25zdHJ1Y3RzIHRoZSBFeHBvcnRQZGZPcHRpb25zUHJlc01vZGVsLlxuICAgKiBTZWUgdGhlIGhhbmRsZUV4cG9ydENsaWNrIG1ldGhvZCBpbiBAYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wZGYtb3B0aW9ucy1kaWFsb2cgZm9yIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyBUaGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsIHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRwdXQgUERGIGZpbGUuXG4gICAqIEBwYXJhbSBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMgVGhlIGV4dGVybmFsIEV4cG9ydFBERk9wdGlvbnMgdXNlci1mYWNpbmcgb2JqZWN0IHBhc3NlZCB0byBleHBvcnRQREZBc3luYy5cbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgVGhlIGxpc3Qgb2Ygc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucyhcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBzaGVldE5hbWVzOiBBcnJheTxzdHJpbmc+LFxuICApOiB2b2lkIHtcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnMuY3VycmVudFNoZWV0ID0gc2hlZXROYW1lc1swXTtcbiAgICB0aGlzLnVwZGF0ZUV4cG9ydExheW91dE9wdGlvbnMoaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zLCBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMpO1xuICAgIHRoaXMudXBkYXRlU2hlZXRPcHRpb25zKGludGVybmFsRXhwb3J0UGRmT3B0aW9ucywgc2hlZXROYW1lcyk7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCBmb3IgdXBkYXRlSW50ZXJuYWxFeHBvcnRQREZPcHRpb25zLlxuICAgKiBNb2RpZmllcyB0aGUgZXhwb3J0TGF5b3V0T3B0aW9ucyBwcm9wZXJ0eSBvZiB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBiYXNlZCBvbiB0aGUgZXh0ZXJuYWwgRXhwb3J0UERGT3B0aW9ucy5cbiAgICogU2VlIHRoZSBnZXRFeHBvcnRMYXlvdXRPcHRpb25zIG1ldGhvZCBpbiBAYnJvd3Nlci1jbGllbnRzL2V4cG9ydC1wZGYtb3B0aW9ucy1kaWFsb2cgZm9yIHJlZmVyZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIGludGVybmFsRXhwb3J0UGRmT3B0aW9ucyBUaGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsIHVzZWQgdG8gY29uZmlndXJlIHRoZSBvdXRwdXQgUERGIGZpbGUuXG4gICAqIEBwYXJhbSBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnMgVGhlIGV4dGVybmFsIEV4cG9ydFBERk9wdGlvbnMgdXNlci1mYWNpbmcgb2JqZWN0IHBhc3NlZCB0byBleHBvcnRQREZBc3luYy5cbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgdXBkYXRlRXhwb3J0TGF5b3V0T3B0aW9ucyhcbiAgICBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgICBleHRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucyxcbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZXhwb3J0TGF5b3V0T3B0aW9ucyA9IGludGVybmFsRXhwb3J0UGRmT3B0aW9ucy5leHBvcnRMYXlvdXRPcHRpb25zO1xuXG4gICAgLy8gc2V0dGluZyB0aGUgaW1hZ2UgaGVpZ2h0IGFuZCB3aWR0aCBwcm9wZXJ0aWVzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzXG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5pbWFnZUhlaWdodCA9IHRoaXMuRGVmYXVsdExheW91dE9wdGlvbnMuaW1hZ2VIZWlnaHQ7XG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5pbWFnZVdpZHRoID0gdGhpcy5EZWZhdWx0TGF5b3V0T3B0aW9ucy5pbWFnZVdpZHRoO1xuXG4gICAgLy8gIHNldHRpbmcgdGhlIG9yaWVudGF0aW9uIHZhbHVlIGZvciB0aGUgZXhwb3J0TGF5b3V0T3B0aW9uc1xuICAgIHN3aXRjaCAoZXh0ZXJuYWxFeHBvcnRQZGZPcHRpb25zLm9yaWVudGF0aW9uKSB7XG4gICAgICBjYXNlIFByaW50T3JpZW50YXRpb24uTGFuZHNjYXBlOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VPcmllbnRhdGlvbk9wdGlvbiA9IFBhZ2VPcmllbnRhdGlvbi5MYW5kc2NhcGU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludE9yaWVudGF0aW9uLlBvcnRyYWl0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VPcmllbnRhdGlvbk9wdGlvbiA9IFBhZ2VPcmllbnRhdGlvbi5Qb3J0cmFpdDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgb3JpZW50YXRpb24gZm9yIEV4cG9ydFBERk9wdGlvbicpO1xuICAgIH1cblxuICAgIC8vIHNldHRpbmcgdGhlIHBhZ2Ugc2l6ZSB2YWx1ZSBmb3IgdGhlIGV4cG9ydExheW91dE9wdGlvbnNcbiAgICBzd2l0Y2ggKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucy5wYWdlU2l6ZSkge1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkEzOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTM7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkE0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkE1OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQTU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkI0OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQjQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkI1OlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uQjU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLkV4ZWN1dGl2ZTpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkV4ZWN1dGl2ZTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuRm9saW86XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5Gb2xpbztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuTGVkZ2VyOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uTGVkZ2VyO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5MZWdhbDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLkxlZ2FsO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5MZXR0ZXI6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5MZXR0ZXI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLk5vdGU6XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5Ob3RlO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRQYWdlU2l6ZS5RdWFydG86XG4gICAgICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNpemVPcHRpb24gPSBQYWdlU2l6ZU9wdGlvbi5RdWFydG87XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLlN0YXRlbWVudDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLlN0YXRlbWVudDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50UGFnZVNpemUuVGFibG9pZDpcbiAgICAgICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2l6ZU9wdGlvbiA9IFBhZ2VTaXplT3B0aW9uLlRhYmxvaWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFBhZ2VTaXplLlVuc3BlY2lmaWVkOlxuICAgICAgICBleHBvcnRMYXlvdXRPcHRpb25zLnBhZ2VTaXplT3B0aW9uID0gUGFnZVNpemVPcHRpb24uVW5zcGVjaWZpZWQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihTaGFyZWRFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdpbnZhbGlkIHBhZ2VTaXplIGZvciBFeHBvcnRQREZPcHRpb24nKTtcbiAgICB9XG5cbiAgICAvLyBzZXR0aW5nIHRoZSBzY2FsaW5nIHZhbHVlcyBmb3IgdGhlIGV4cG9ydExheW91dE9wdGlvbnNcbiAgICBzd2l0Y2ggKGV4dGVybmFsRXhwb3J0UGRmT3B0aW9ucy5zY2FsaW5nKSB7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5BdE1vc3QxUGFnZUhpZ2g6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgRml0UGFnZXMuRml0T25lSGlnaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuQXRNb3N0MVBhZ2VXaWRlOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIEZpdFBhZ2VzLkZpdE9uZVdpZGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLkF0TW9zdDJQYWdlc0hpZ2g6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgRml0UGFnZXMuRml0VHdvSGlnaCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuQXRNb3N0MlBhZ2VzV2lkZTpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBGaXRQYWdlcy5GaXRUd29XaWRlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5BdXRvbWF0aWM6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3RBdXRvKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMTAwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0MTAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMjAwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0MjAwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjMjU6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3QyNSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzQwMDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDQwMCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzUwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0NTApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM2MDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDYwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIFByaW50U2NhbGluZy5QZXJjNzU6XG4gICAgICAgIHRoaXMuc2V0Rml0QW5kU2NhbGVWYWx1ZXMoZXhwb3J0TGF5b3V0T3B0aW9ucywgUGFnZVNjYWxpbmdPcHRpb24uU2NhbGVQY3Q3NSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBQcmludFNjYWxpbmcuUGVyYzgwOlxuICAgICAgICB0aGlzLnNldEZpdEFuZFNjYWxlVmFsdWVzKGV4cG9ydExheW91dE9wdGlvbnMsIFBhZ2VTY2FsaW5nT3B0aW9uLlNjYWxlUGN0ODApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgUHJpbnRTY2FsaW5nLlBlcmM5MDpcbiAgICAgICAgdGhpcy5zZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zLCBQYWdlU2NhbGluZ09wdGlvbi5TY2FsZVBjdDkwKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKFNoYXJlZEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ2ludmFsaWQgc2NhbGluZyBmb3IgRXhwb3J0UERGT3B0aW9uJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgZm9yIHVwZGF0ZUludGVybmFsRXhwb3J0UERGT3B0aW9ucy5cbiAgICogTW9kaWZpZXMgdGhlIHNoZWV0T3B0aW9ucyBwcm9wZXJ0eSBvZiB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBiYXNlZCBvbiB0aGUgc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqIFNlZSB0aGUgaGFuZGxlRXhwb3J0Q2xpY2sgbWV0aG9kIGluIEBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBkZi1vcHRpb25zLWRpYWxvZyBmb3IgcmVmZXJlbmNlLlxuICAgKlxuICAgKiBAcGFyYW0gaW50ZXJuYWxFeHBvcnRQZGZPcHRpb25zIFRoZSBpbnRlcm5hbCBFeHBvcnRQREZPcHRpb25zIHByZXMgbW9kZWwgdXNlZCB0byBjb25maWd1cmUgdGhlIG91dHB1dCBQREYgZmlsZS5cbiAgICogQHBhcmFtIHNoZWV0TmFtZXMgVGhlIGxpc3Qgb2Ygc2hlZXRzIHNlbGVjdGVkIGZvciBleHBvcnQuXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVwZGF0ZVNoZWV0T3B0aW9ucyhpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM6IEludGVybmFsRXhwb3J0UERGT3B0aW9ucywgc2hlZXROYW1lczogQXJyYXk8c3RyaW5nPik6IHZvaWQge1xuICAgIGNvbnN0IHsgZXhwb3J0TGF5b3V0T3B0aW9ucywgc2hlZXRPcHRpb25zIH0gPSBpbnRlcm5hbEV4cG9ydFBkZk9wdGlvbnM7XG4gICAgLy8gdXBkYXRpbmcgdGhlIGV4cG9ydCBsYXlvdXRzIG9wdGlvbnMgZm9yIGVhY2ggc2hlZXQgYW5kIHNlbGVjdGluZyBzaGVldCBmb3IgZXhwb3J0IGlmIGluY2x1ZGVkIGluIGxpc3RcbiAgICBmb3IgKGNvbnN0IHNoZWV0T3B0aW9uIG9mIHNoZWV0T3B0aW9ucykge1xuICAgICAgc2hlZXRPcHRpb24uZXhwb3J0TGF5b3V0T3B0aW9ucyA9IGV4cG9ydExheW91dE9wdGlvbnM7XG4gICAgICBzaGVldE9wdGlvbi5pc1NlbGVjdGVkID0gc2hlZXROYW1lcy5pbmNsdWRlcyhzaGVldE9wdGlvbi5zaGVldCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgZm9yIHVwZGF0ZUV4cG9ydExheW91dE9wdG9ucy5cbiAgICogVGhpcyBtZXRob2QgaXMgYSBzcG9vZiBvZiB0aGUgZ2V0Rml0QW5kU2NhbGVWYWx1ZXMgbWV0aG9kIHVzZWQgaW4gQGJyb3dzZXItY2xpZW50cy9leHBvcnQtcGRmLW9wdGlvbnMgdG8gc2V0IHRoZSBleHBvcnRMYXlvdXRPcHRpb25zJyBzY2FsaW5nIHByb3BlcnRpZXMuXG4gICAqIEluIHRoZSBmdXR1cmUsIHRoaXMgZmlsZSBzaG91bGQgYmUgcmVmYWN0b3JlZCB0byBpbXBvcnQgdGhlIG1ldGhvZCBkaXJlY3RseSBmcm9tIEBicm93c2VyLWNsaWVudHMvZXhwb3J0LXBkZi1vcHRpb25zLlxuICAgKlxuICAgKiBAcGFyYW0gc2NhbGluZ1NlbGVjdGlvbiBzdHJpbmcgdXNlZCBmb3Igc2V0dGluZyB0aGUgZXhwb3J0TGF5b3V0T3B0aW9ucyBiYXNlZCBvbiB0aGUgUHJpbnRTY2FsaW5nIHByb3BlcnR5IGZyb20gdGhlIEV4dGVybmFsRXhwb3J0UERGT3B0aW9ucy5cbiAgICogQHBhcmFtIGV4cG9ydExheW91dE9wdGlvbnMgdGhlIEV4cG9ydExheW91dE9wdGlvbnMgdXNlZCBieSB0aGUgaW50ZXJuYWwgRXhwb3J0UERGT3B0aW9ucyBwcmVzIG1vZGVsLlxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXRGaXRBbmRTY2FsZVZhbHVlcyhleHBvcnRMYXlvdXRPcHRpb25zOiBFeHBvcnRMYXlvdXRPcHRpb25zLCBzY2FsaW5nU2VsZWN0aW9uOiBTY2FsaW5nU2VsZWN0aW9uKTogdm9pZCB7XG4gICAgbGV0IHsgcGFnZUZpdEhvcml6b250YWwsIHBhZ2VGaXRWZXJ0aWNhbCwgcGFnZVNjYWxlTW9kZSwgcGFnZVNjYWxlUGVyY2VudCB9ID0gdGhpcy5EZWZhdWx0TGF5b3V0T3B0aW9ucztcblxuICAgIGNvbnN0IGZpdE1hdGNoID0gdGhpcy5maXRSZWdleC5leGVjKHNjYWxpbmdTZWxlY3Rpb24pO1xuICAgIGNvbnN0IHBlcmNlbnRNYXRjaCA9IHRoaXMucGN0UmVnZXguZXhlYyhzY2FsaW5nU2VsZWN0aW9uKTtcblxuICAgIGlmIChmaXRNYXRjaCkge1xuICAgICAgW3BhZ2VGaXRIb3Jpem9udGFsLCBwYWdlRml0VmVydGljYWxdID0gZml0TWF0Y2guc2xpY2UoMSkubWFwKCh2YWx1ZSkgPT4gTnVtYmVyKHZhbHVlKSk7XG4gICAgICBwYWdlU2NhbGVNb2RlID0gU2NhbGVNb2RlLlNjYWxlRml0UGFnZXM7XG4gICAgfSBlbHNlIGlmIChwZXJjZW50TWF0Y2gpIHtcbiAgICAgIFtwYWdlU2NhbGVQZXJjZW50XSA9IHBlcmNlbnRNYXRjaC5zbGljZSgxKS5tYXAoKHZhbHVlKSA9PiBOdW1iZXIodmFsdWUpKTtcbiAgICAgIHBhZ2VTY2FsZU1vZGUgPSBTY2FsZU1vZGUuU2NhbGVQZXJjZW50YWdlO1xuICAgIH1cblxuICAgIC8vIGdldEZpdEFuZFNjYWxlVmFsdWVzIHJldHVybnMgdGhlIHByb3BlcnRpZXMgYmVsb3csIGJ1dCBpbnN0ZWFkIHRoaXMgbWV0aG9kIHdpbGwgc2V0IHRoZW0uXG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlRml0SG9yaXpvbnRhbCA9IHBhZ2VGaXRIb3Jpem9udGFsO1xuICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZUZpdFZlcnRpY2FsID0gcGFnZUZpdFZlcnRpY2FsO1xuICAgIGV4cG9ydExheW91dE9wdGlvbnMucGFnZVNjYWxlTW9kZSA9IHBhZ2VTY2FsZU1vZGU7XG4gICAgZXhwb3J0TGF5b3V0T3B0aW9ucy5wYWdlU2NhbGVQZXJjZW50ID0gcGFnZVNjYWxlUGVyY2VudDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGZpdFJlZ2V4ID0gbmV3IFJlZ0V4cCgnZml0KFswLTldKyl4KFswLTldKyknKTtcbiAgcHJpdmF0ZSBzdGF0aWMgcGN0UmVnZXggPSBuZXcgUmVnRXhwKCdwY3QoWzAtOV0rKScpO1xufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXJyb3IgfSBmcm9tICcuLi9UYWJsZWF1RXJyb3InO1xuaW1wb3J0IHsgRXJyb3JIZWxwZXJzIH0gZnJvbSAnLi9FcnJvckhlbHBlcnMnO1xuXG5leHBvcnQgY2xhc3MgUGFyYW0ge1xuICAvKipcbiAgICogc2VyaWFsaXplcyB0aGUgZGF0ZSBpbnRvIHRoZSBmb3JtYXQgdGhhdCB0aGUgc2VydmVyIGV4cGVjdHMuXG4gICAqIEBwYXJhbSBkYXRlIHRoZSBkYXRlIHRvIHNlcmlhbGl6ZVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVEYXRlRm9yUGxhdGZvcm0oZGF0ZTogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgeWVhcjogbnVtYmVyID0gZGF0ZS5nZXRVVENGdWxsWWVhcigpO1xuICAgIGNvbnN0IG1vbnRoOiBudW1iZXIgPSBkYXRlLmdldFVUQ01vbnRoKCkgKyAxO1xuICAgIGNvbnN0IGRheTogbnVtYmVyID0gZGF0ZS5nZXRVVENEYXRlKCk7XG4gICAgY29uc3QgaGg6IG51bWJlciA9IGRhdGUuZ2V0VVRDSG91cnMoKTtcbiAgICBjb25zdCBtbTogbnVtYmVyID0gZGF0ZS5nZXRVVENNaW51dGVzKCk7XG4gICAgY29uc3Qgc2VjOiBudW1iZXIgPSBkYXRlLmdldFVUQ1NlY29uZHMoKTtcbiAgICByZXR1cm4gYCR7eWVhcn0tJHttb250aH0tJHtkYXl9ICR7aGh9OiR7bW19OiR7c2VjfWA7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZUJvb2xlYW5Gb3JQbGF0Zm9ybShib29sOiBib29sZWFuKTogc3RyaW5nIHtcbiAgICByZXR1cm4gYm9vbCA/ICd0cnVlJyA6ICdmYWxzZSc7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIHNlcmlhbGl6ZU51bWJlckZvclBsYXRmb3JtKG51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbnVtLnRvU3RyaW5nKDEwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyB0aGUgaW5wdXQgaXMgYSBudW1iZXJcbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVOdW1iZXIoaW5wdXQ6IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0eXBlb2YgaW5wdXQgPT09ICdudW1iZXInIHx8IGlucHV0IGluc3RhbmNlb2YgTnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBpbnB1dCBpcyBhIERhdGVcbiAgICovXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBpc1R5cGVEYXRlKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5wdXQgaW5zdGFuY2VvZiBEYXRlO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzVHlwZVN0cmluZyhpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ3N0cmluZycgfHwgaW5wdXQgaW5zdGFuY2VvZiBTdHJpbmc7XG4gIH1cblxuICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55ICovXG4gIHB1YmxpYyBzdGF0aWMgaXNUeXBlQm9vbChpbnB1dDogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHR5cGVvZiBpbnB1dCA9PT0gJ2Jvb2xlYW4nIHx8IGlucHV0IGluc3RhbmNlb2YgQm9vbGVhbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBpbnB1dCBpcyBudWxsIG9yIHVuZGVmaW5lZFxuICAgKi9cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIGlzTnVsbE9yVW5kZWZpbmVkKGlucHV0OiBhbnkpOiBib29sZWFuIHtcbiAgICByZXR1cm4gaW5wdXQgPT09IG51bGwgfHwgaW5wdXQgPT09IHVuZGVmaW5lZDtcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgKi9cbiAgcHVibGljIHN0YXRpYyBzZXJpYWxpemVQYXJhbWV0ZXJWYWx1ZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcbiAgICBpZiAoUGFyYW0uaXNUeXBlTnVtYmVyKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFBhcmFtLnNlcmlhbGl6ZU51bWJlckZvclBsYXRmb3JtKHZhbHVlIGFzIG51bWJlcik7XG4gICAgfSBlbHNlIGlmIChQYXJhbS5pc1R5cGVEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIFBhcmFtLnNlcmlhbGl6ZURhdGVGb3JQbGF0Zm9ybSh2YWx1ZSBhcyBEYXRlKTtcbiAgICB9IGVsc2UgaWYgKFBhcmFtLmlzVHlwZUJvb2wodmFsdWUpKSB7XG4gICAgICByZXR1cm4gUGFyYW0uc2VyaWFsaXplQm9vbGVhbkZvclBsYXRmb3JtKHZhbHVlIGFzIGJvb2xlYW4pO1xuICAgIH0gZWxzZSBpZiAoUGFyYW0uaXNUeXBlU3RyaW5nKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFVuZXhwZWN0ZWQgaW52YWxpZCB2YWx1ZSBmb3I6ICR7dmFsdWV9YCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoYXQgdGhlIHBhcmFtZXRlciBpcyBhbHJlYWR5IGEgTWFwLCBvciBjb252ZXJ0cyBhbiBvYmplY3QgdG8gYSBNYXAuXG4gICAqIElmIHRoZSBwYXJhbWV0ZXIgaXMgYW4gb2JqZWN0LCB3ZSBjb252ZXJ0IGl0IHRvIGEgTWFwIHVzaW5nIE9iamVjdC5lbnRyaWVzLlxuICAgKiBAdGhyb3dzIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IGFuIG9iamVjdCBvciBNYXBcbiAgICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0UGFyYW1ldGVyVG9NYXAocGFyYW06IG9iamVjdCwgcGFyYW1OYW1lOiBzdHJpbmcpOiBNYXA8YW55LCBhbnk+IHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyVHlwZShwYXJhbSwgJ29iamVjdCcsIHBhcmFtTmFtZSk7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGFyYW0pKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW52YWxpZFBhcmFtZXRlciwgYEV4cGVjdGluZyBvYmplY3Qgb3IgTWFwIGZvcjogJHtwYXJhbU5hbWV9LmApO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbSBpbnN0YW5jZW9mIE1hcCA/IHBhcmFtIDogbmV3IE1hcChPYmplY3QuZW50cmllcyhwYXJhbSkpO1xuICB9XG5cbiAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSAqL1xuICBwdWJsaWMgc3RhdGljIHRyeVBhcnNlTnVtYmVyKHZhbHVlOiBhbnkpOiB7IHBhcnNlZD86IG51bWJlcjsgc3VjY2VzczogYm9vbGVhbiB9IHtcbiAgICBpZiAoUGFyYW0uaXNOdWxsT3JVbmRlZmluZWQodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIGlmIChQYXJhbS5pc1R5cGVOdW1iZXIodmFsdWUpKSB7XG4gICAgICByZXR1cm4geyBwYXJzZWQ6IHZhbHVlIGFzIG51bWJlciwgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHZhbHVlU3RyaW5nID0gdmFsdWUudG9TdHJpbmcoKTtcbiAgICBpZiAodmFsdWVTdHJpbmcgPT09ICdOYU4nKSB7XG4gICAgICAvLyAnTmFOJyBwYXJzZXMgYXMgTmFOIHdoaWNoIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gYSBmYWlsZWQgcGFyc2UuXG4gICAgICByZXR1cm4geyBwYXJzZWQ6IE5hTiwgc3VjY2VzczogdHJ1ZSB9O1xuICAgIH1cblxuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlRmxvYXQodmFsdWVTdHJpbmcpO1xuICAgIGlmIChpc05hTihwYXJzZWQpKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH1cblxuICAgIHJldHVybiB7IHBhcnNlZCwgc3VjY2VzczogdHJ1ZSB9O1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2hlZXRJbmZvLCBTaGVldFR5cGUsIFNpemVDb25zdHJhaW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5cbmV4cG9ydCBjbGFzcyBTaGVldFV0aWxzIHtcbiAgLy8gVGhpcyBpcyBhIGRpcmVjdCBwb3J0IGZyb20gU2hlZXRTaXplLmNzIC0gU2hlZXRTaXplRmFjdG9yeVxuICBwdWJsaWMgc3RhdGljIGdldFNoZWV0U2l6ZUZyb21TaXplQ29uc3RyYWludHMoc2l6ZUNvbnN0cmFpbnQ6IFNpemVDb25zdHJhaW50KTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBjb25zdCB7IG1pbldpZHRoLCBtaW5IZWlnaHQsIG1heFdpZHRoLCBtYXhIZWlnaHQgfSA9IHNpemVDb25zdHJhaW50O1xuXG4gICAgaWYgKG1pbkhlaWdodCA9PT0gMCAmJiBtaW5XaWR0aCA9PT0gMCkge1xuICAgICAgaWYgKG1heEhlaWdodCA9PT0gMCAmJiBtYXhXaWR0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWMsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGJlaGF2aW9yOiBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdE1vc3QsXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG1heFdpZHRoLCBoZWlnaHQ6IG1heEhlaWdodCB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBpZiAobWF4SGVpZ2h0ID09PSAwICYmIG1heFdpZHRoID09PSAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuQXRMZWFzdCxcbiAgICAgICAgbWluU2l6ZTogeyB3aWR0aDogbWluV2lkdGgsIGhlaWdodDogbWluSGVpZ2h0IH0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIGlmIChtYXhIZWlnaHQgPT09IG1pbkhlaWdodCAmJiBtYXhXaWR0aCA9PT0gbWluV2lkdGggJiYgbWluV2lkdGggPiAwKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuRXhhY3RseSxcbiAgICAgICAgbWluU2l6ZTogeyB3aWR0aDogbWluV2lkdGgsIGhlaWdodDogbWluSGVpZ2h0IH0sXG4gICAgICAgIG1heFNpemU6IHsgd2lkdGg6IG1pbldpZHRoLCBoZWlnaHQ6IG1pbkhlaWdodCB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyAnRml0IFdpZHRoJyBmb3IgYSBEU0QgbGF5b3V0XG4gICAgY29uc3QgaXNEc2RMYXlvdXQgPSBtaW5XaWR0aCA9PT0gMCAmJiBtYXhXaWR0aCA9PT0gMDtcblxuICAgIHJldHVybiB7XG4gICAgICBiZWhhdmlvcjogQ29udHJhY3QuU2hlZXRTaXplQmVoYXZpb3IuUmFuZ2UsXG4gICAgICBtaW5TaXplOiB7IHdpZHRoOiBtaW5XaWR0aCwgaGVpZ2h0OiBtaW5IZWlnaHQgfSxcbiAgICAgIG1heFNpemU6IHsgd2lkdGg6IGlzRHNkTGF5b3V0ID8gMjE0NzQ4MzY0NyA6IG1heFdpZHRoLCBoZWlnaHQ6IG1heEhlaWdodCB9LFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGNyZWF0ZUF1dG9tYXRpY1NpemUoKTogQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICBsZXQgYmVoYXZpb3IgPSBDb250cmFjdC5TaGVldFNpemVCZWhhdmlvci5BdXRvbWF0aWM7XG4gICAgbGV0IG1pblNpemUgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTtcbiAgICBsZXQgbWF4U2l6ZSA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9O1xuICAgIHJldHVybiB7IGJlaGF2aW9yLCBtaW5TaXplLCBtYXhTaXplIH07XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFB1Ymxpc2hlZFNoZWV0SW5mb0J5TmFtZShuYW1lOiBzdHJpbmcsIHNoZWV0SW5mb3M6IEFycmF5PFNoZWV0SW5mbz4pOiBTaGVldEluZm8gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHNoZWV0SW5mbyA9IHNoZWV0SW5mb3MuZmluZCgoc2hlZXQpID0+IHNoZWV0Lm5hbWUgPT09IG5hbWUpO1xuICAgIHJldHVybiBzaGVldEluZm87XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGdldFNoZWV0VHlwZUVudW0oaW50ZXJuYWxTaGVldFR5cGU6IFNoZWV0VHlwZSk6IENvbnRyYWN0LlNoZWV0VHlwZSB7XG4gICAgbGV0IHNoZWV0VHlwZTogQ29udHJhY3QuU2hlZXRUeXBlO1xuICAgIHN3aXRjaCAoaW50ZXJuYWxTaGVldFR5cGUpIHtcbiAgICAgIGNhc2UgU2hlZXRUeXBlLldvcmtzaGVldDoge1xuICAgICAgICBzaGVldFR5cGUgPSBDb250cmFjdC5TaGVldFR5cGUuV29ya3NoZWV0O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgU2hlZXRUeXBlLkRhc2hib2FyZDoge1xuICAgICAgICBzaGVldFR5cGUgPSBDb250cmFjdC5TaGVldFR5cGUuRGFzaGJvYXJkO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgU2hlZXRUeXBlLlN0b3J5OiB7XG4gICAgICAgIHNoZWV0VHlwZSA9IENvbnRyYWN0LlNoZWV0VHlwZS5TdG9yeTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuU2hhcmVkRXJyb3JDb2Rlcy5TZXJ2ZXJFcnJvciwgJ0ludmFsaWQgU2hlZXRUeXBlJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzaGVldFR5cGU7XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIGlzVmFsaWRTaGVldFNpemUoc2l6ZU9iamVjdDogQ29udHJhY3QuU2l6ZSB8IENvbnRyYWN0LlNoZWV0U2l6ZSk6IHNpemVPYmplY3QgaXMgQ29udHJhY3QuU2hlZXRTaXplIHtcbiAgICByZXR1cm4gKDxDb250cmFjdC5TaGVldFNpemU+c2l6ZU9iamVjdCkuYmVoYXZpb3IgIT09IHVuZGVmaW5lZDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4uL1RhYmxlYXVFcnJvcic7XG5pbXBvcnQgeyBEZWZlcnJlZCwgVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcyB9IGZyb20gJy4vRGVmZXJyZWQnO1xuXG4vKipcbiAqIEEgRGVmZXJyZWQgd3JhcHBlciBjbGFzcyBhZGRpbmcgZnVuY3Rpb25hbGl0eSB0byByZWplY3QgdW5yZXNwb25zaXZlIHByb21pc2VzIGFmdGVyIHRpbWVvdXRcbiAqXG4gKiB0aGlzIGNsYXNzIGhhbmRsZXMgdHdvIHRoaW5nczpcblxuICogICAgMS4gQWRkcyB0aW1lb3V0IGxvZ2ljIGZvciBkZWZlcnJlZFxuICogICAgMi4gSXQgYmxvY2tzIG11bHRpcGxlIGNhbGxzIGZyb20gZXhlY3V0aW5nIGF0IHRoZSBzYW1lIHRpbWUuXG4gKlxuICogQGV4cG9ydFxuICogQGNsYXNzIFNob3J0TGl2ZWREZWZlcnJlZFxuICogQHRlbXBsYXRlIFRSZXNvbHZlIFRoZSB0eXBlIHVzZWQgdG8gcmVzb2x2ZSB0aGUgcHJvbWlzZS5cbiAqIEB0ZW1wbGF0ZSBUUmVqZWN0IFRoZSB0eXBlIHVzZWQgdG8gcmVqZWN0IHRoZSBwcm9taXNlLiBEZWZhdWx0cyB0byBhbnkuXG4gKlxuICovXG5leHBvcnQgY2xhc3MgU2hvcnRMaXZlZERlZmVycmVkPFRSZXNvbHZlLCBUUmVqZWN0ID0gYW55PiB7XG4gIHByaXZhdGUgX2RlZmVycmVkOiBEZWZlcnJlZDxUUmVzb2x2ZSwgVFJlamVjdD4gfCB1bmRlZmluZWQ7XG4gIHByaXZhdGUgX3RpbWVvdXRJZDtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfdGltZW91dEluTWlsbGlzZWNvbmRzID0gVW5yZWdpc3RlclRpbWVvdXRJbk1pbGxpc2Vjb25kcykge31cblxuICBwdWJsaWMgZ2V0TmV3UHJvbWlzZU9yVGhyb3dJZkJ1c3koKTogUHJvbWlzZTxUUmVzb2x2ZT4ge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkFwaUV4ZWN1dGlvbkVycm9yLCAnVGhpcyBhcGkgY2Fubm90IGJlIGV4ZWN1dGVkIHRpbGwgcHJldmlvdXMgY2FsbCBpcyByZXNvbHZlZC4nKTtcbiAgICB9XG4gICAgdGhpcy5fZGVmZXJyZWQgPSBuZXcgRGVmZXJyZWQoKTtcblxuICAgIHRoaXMuX3RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgY29uc3QgZXJyb3IgPSBuZXcgVGFibGVhdUVycm9yKFxuICAgICAgICBDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLlRpbWVvdXQsXG4gICAgICAgIGBBcGkgZmFpbGVkIHRvIGNvbXBsZXRlIGluICR7dGhpcy5fdGltZW91dEluTWlsbGlzZWNvbmRzIC8gMTAwMH0gc2Vjb25kc2AsXG4gICAgICApO1xuICAgICAgdGhpcy5yZWplY3QoZXJyb3IpO1xuICAgIH0sIHRoaXMuX3RpbWVvdXRJbk1pbGxpc2Vjb25kcyk7XG5cbiAgICByZXR1cm4gdGhpcy5fZGVmZXJyZWQucHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyByZXNvbHZlKHJlc3BvbnNlOiBUUmVzb2x2ZSB8IFByb21pc2VMaWtlPFRSZXNvbHZlPik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZXNvbHZlKHJlc3BvbnNlKTtcbiAgICAgIHRoaXMuX2RlZmVycmVkID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyByZWplY3QoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgIGlmICh0aGlzLl9kZWZlcnJlZCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXRJZCk7XG4gICAgICB0aGlzLl9kZWZlcnJlZC5yZWplY3QoZXJyb3IpO1xuICAgICAgdGhpcy5fZGVmZXJyZWQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJy4vVGFibGVhdUVycm9yJztcbmltcG9ydCB7IFZlcnNpb25OdW1iZXJDb250cmFjdCB9IGZyb20gJy4vVmVyc2lvbk51bWJlckNvbnRyYWN0JztcblxuLyoqXG4gKiBSZXByZXNlbnRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIGV4dGVuc2lvbnMsIGVtYmVkZGluZ1xuICogYW5kIGV4dGVuc2lvbnMtYXBpLXR5cGVzIGxpYnJhcnlcbiAqL1xuZXhwb3J0IGNsYXNzIFZlcnNpb25OdW1iZXIgaW1wbGVtZW50cyBWZXJzaW9uTnVtYmVyQ29udHJhY3Qge1xuICBwdWJsaWMgbWFqb3I6IG51bWJlcjtcbiAgcHVibGljIG1pbm9yOiBudW1iZXI7XG4gIHB1YmxpYyBmaXg6IG51bWJlcjtcbiAgcHVibGljIGJ1aWxkOiBudW1iZXI7XG4gIHB1YmxpYyBpc0FscGhhOiBib29sZWFuO1xuXG4gIC8vIHByaXZhdGUgY29uc3RydWN0b3Igc28gZXZlcnlvbmUgdXNlcyB0aGUgc2luZ2xldG9uIGluc3RhbmNlXG4gIC8vIGJ1aWxkIG51bWJlcnMgaGF2ZSB0aGlzIGZvcm06IE0ubS5mLXByZS5OXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih2ZXJzaW9uU3RyaW5nOiBzdHJpbmcsIGlzQWxwaGE6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBwYXJ0U3RyID0gdmVyc2lvblN0cmluZy5zcGxpdCgnLScpO1xuICAgIHRoaXMuYnVpbGQgPSB0aGlzLmdldEJ1aWxkTnVtYmVyKHBhcnRTdHJbMV0pO1xuICAgIHZlcnNpb25TdHJpbmcgPSBwYXJ0U3RyWzBdO1xuXG4gICAgY29uc3QgcGFydHMgPSB2ZXJzaW9uU3RyaW5nLnNwbGl0KCcuJykubWFwKChwKSA9PiBwYXJzZUludChwLCAxMCkpO1xuICAgIGlmIChwYXJ0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgSW52YWxpZCB2ZXJzaW9uIG51bWJlcjogJHt2ZXJzaW9uU3RyaW5nfWApO1xuICAgIH1cblxuICAgIHRoaXMubWFqb3IgPSBwYXJ0c1swXTtcbiAgICB0aGlzLm1pbm9yID0gcGFydHNbMV07XG4gICAgdGhpcy5maXggPSBwYXJ0c1syXTtcbiAgICB0aGlzLmlzQWxwaGEgPSBpc0FscGhhO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRCdWlsZE51bWJlcihwcmVSZWxlYXNlU3RyaW5nOiBzdHJpbmcpOiBudW1iZXIge1xuICAgIGNvbnN0IG5vQnVpbGROdW1iZXIgPSAtMTtcbiAgICBpZiAoIXByZVJlbGVhc2VTdHJpbmcpIHtcbiAgICAgIHJldHVybiBub0J1aWxkTnVtYmVyO1xuICAgIH1cblxuICAgIC8vIFRoZSBwcmVSZWxlYXNlIHN0cmluZyBoYXMgdGhpcyBmb3JtOiBwcmUuTiwgYnV0IHdlIGRvbid0IGRlcGVuZCBvbiB0aGUgYWN0dWFsIHN0cmluZyBiZWluZyAncHJlJ1xuICAgIGNvbnN0IHBhcnRTdHIgPSBwcmVSZWxlYXNlU3RyaW5nLnNwbGl0KCcuJyk7XG4gICAgcmV0dXJuIHBhcnRTdHJbMV0gPyBwYXJzZUludChwYXJ0U3RyWzFdLCAxMCkgOiBub0J1aWxkTnVtYmVyO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0ZWRWYWx1ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBgJHt0aGlzLm1ham9yfS4ke3RoaXMubWlub3J9LiR7dGhpcy5maXh9YDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZnVsbEZvcm1hdHRlZFZhbHVlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGAke3RoaXMubWFqb3J9LiR7dGhpcy5taW5vcn0uJHt0aGlzLmZpeH0tcHJlLiR7dGhpcy5idWlsZH1gO1xuICB9XG59XG4iLCJpbXBvcnQge1xuICBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyLFxuICBFeGVjdXRlUGFyYW1ldGVycyxcbiAgRXhlY3V0ZVJlc3BvbnNlLFxuICBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcixcbiAgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTixcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBOb3RpZmljYXRpb24sXG4gIE5vdGlmaWNhdGlvbkhhbmRsZXIsXG4gIFZlcmJJZCxcbiAgVmVyc2lvbkxlc3NUaGFuLFxuICBWZXJzaW9uTnVtYmVyLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgd2hpY2ggc3VwcG9ydHMgdXBncmFkaW5nIGFuZCBkb3duZ3JhZGluZyB0aGUgaW5wdXRcbiAqIGludGVybmFsIGNvbnRyYWN0IHRvIHRoZSB2ZXJzaW9uIHRoYXQgdGhpcyBtb2R1bGUgaXMgYnVpbHQgYWdhaW5zdFxuICpcbiAqIEBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAqIEBpbXBsZW1lbnRzIHtJbnRlcm5hbEFwaURpc3BhdGNoZXJ9XG4gKi9cbmV4cG9ydCBjbGFzcyBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgaW1wbGVtZW50cyBJbnRlcm5hbEFwaURpc3BhdGNoZXIge1xuICBwcml2YXRlIF92ZXJzaW9uQ29udmVydGVyOiBFeHRlcm5hbENvbnRyYWN0VmVyc2lvbkNvbnZlcnRlcjtcbiAgcHJpdmF0ZSBfbm90aWZpY2F0aW9uSGFuZGxlcnM6IEFycmF5PE5vdGlmaWNhdGlvbkhhbmRsZXI+O1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXJcbiAgICogV2UgaGF2ZSBtdWx0aXBsZSB2ZXJzaW9uIGNvbnZlcnRpbmcgZGlzcGF0Y2hlcnMgdGhhdCB3b3JrIHRvZ2V0aGVyLlxuICAgKiBJZiBuZWVkZWQsIHRoZSBWZXJzaW9uZWRFeHRlcm5hbEFwaURpc3BhdGNoZXIgd3JhcHMgZWl0aGVyIHRoZSBJbnRlcm5hbEFwaURpc3BhdGNoZXIgKGRlc2t0b3ApXG4gICAqIG9yIHRoZSBDcm9zc0ZyYW1lRGlzcGF0Y2hlciAoc2VydmVyKS5cbiAgICogVGhlIEludGVybmFsL0Nyb3NzRnJhbWUgZGlzcGF0Y2hlcnMgaGFuZGxlIGFuIHVwZGF0ZWQgcGxhdGZvcm0gd2l0aCBhbiBvbGRlciBleHRlcm5hbCBsaWJyYXJ5LlxuICAgKiAoVGhlIENyb3NzRnJhbWVEaXNwYXRjaGVyIHNlbmRzIG1lc3NhZ2VzIGFjcm9zcyB0aGUgZnJhbWUsIGFuZCBpdCBpcyBoYW5kbGVkIGJ5IHRoZSBQcmVzTGF5ZXJIYW5kbGVyLilcbiAgICogTWVhbndoaWxlLCB0aGUgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyIGhhbmRsZXMgYW4gdXBkYXRlZCBleHRlcm5hbCBsaWJyYXJ5IHdpdGggYW4gb2xkZXIgcGxhdGZvcm0uXG5cbiAgICogQHBhcmFtIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIgVGhlIGRlbGVnYXRlIHRoYXQgZG9lcyB0aGUgYWN0dWFsIHdvcmsuXG4gICAqIEBwYXJhbSBwbGF0Zm9ybVZlcnNpb25OdW1iZXIgVGhlIHZlcnNpb24gb2YgdGhlIGludGVybmFsIGNvbnRyYWN0IHdoaWNoIHRoZSBwbGF0Zm9ybSBtb2R1bGUgaXMgdXNpbmcuXG4gICAqIFRoaXMgbnVtYmVyIHdpbGwgYmUgdXNlZCB0byBmaWd1cmUgb3V0IGhvdyB0byBkb3duZ3JhZGUgaW5jb21pbmcgY29tbWFuZHMgYW5kIHVwZ3JhZGUgdGhlIHJlc3VsdHNcbiAgICovXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlcixcbiAgICBwbGF0Zm9ybVZlcnNpb25OdW1iZXI6IFZlcnNpb25OdW1iZXIsXG4gICkge1xuICAgIHRoaXMuX3ZlcnNpb25Db252ZXJ0ZXIgPSBDcmVhdGVFeHRlcm5hbENvbXBhdGlibGVWZXJzaW9uQ29udmVydGVyKElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sIHBsYXRmb3JtVmVyc2lvbk51bWJlcik7XG5cbiAgICB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycyA9IFtdO1xuICAgIF9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIucmVnaXN0ZXJOb3RpZmljYXRpb25IYW5kbGVyKChub3RpZmljYXRpb246IE5vdGlmaWNhdGlvbik6IHZvaWQgPT4ge1xuICAgICAgaWYgKHRoaXMuX25vdGlmaWNhdGlvbkhhbmRsZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB1cGdyYWRlZE5vdGlmaWNhdGlvbiA9IHRoaXMuX3ZlcnNpb25Db252ZXJ0ZXIudXBncmFkZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pO1xuICAgICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMuZm9yRWFjaCgoaGFuZGxlcikgPT4ge1xuICAgICAgICBoYW5kbGVyKHVwZ3JhZGVkTm90aWZpY2F0aW9uKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHN0YXRpYyBuZWVkc1ZlcnNpb25Db252ZXJ0ZXIocGxhdGZvcm1WZXJzaW9uOiBWZXJzaW9uTnVtYmVyKTogYm9vbGVhbiB7XG4gICAgLy8gSWYgb3VyIHBsYXRmb3JtIGlzIGxlc3MgdGhhbiBleHRlcm5hbCBsaWJyYXJ5IHZlcnNpb24sIHRoZW4gd2UgbmVlZCBhIGNvbnZlcnRlclxuICAgIHJldHVybiBWZXJzaW9uTGVzc1RoYW4ocGxhdGZvcm1WZXJzaW9uLCBJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcbiAgfVxuXG4gIHB1YmxpYyBleGVjdXRlKHZlcmI6IFZlcmJJZCwgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMpOiBQcm9taXNlPEV4ZWN1dGVSZXNwb25zZT4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkb3duZ3JhZGVQYXJhbWV0ZXJzID0gdGhpcy5fdmVyc2lvbkNvbnZlcnRlci5kb3duZ3JhZGVFeGVjdXRlQ2FsbCh2ZXJiLCBwYXJhbWV0ZXJzKTtcbiAgICAgIHJldHVybiB0aGlzLl9hcGlEZWxlZ2F0ZURpc3BhdGNoZXIuZXhlY3V0ZShkb3duZ3JhZGVQYXJhbWV0ZXJzLnZlcmIsIGRvd25ncmFkZVBhcmFtZXRlcnMucGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgdXBncmFkZVJlc3BvbnNlID0gdGhpcy5fdmVyc2lvbkNvbnZlcnRlci51cGdyYWRlRXhlY3V0ZVJldHVybihyZXNwb25zZSwgdmVyYiwgcGFyYW1ldGVycyk7XG4gICAgICAgIHJldHVybiB1cGdyYWRlUmVzcG9uc2U7XG4gICAgICB9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcihoYW5kbGVyOiBOb3RpZmljYXRpb25IYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMucHVzaChoYW5kbGVyKTtcbiAgfVxuXG4gIHB1YmxpYyB1bnJlZ2lzdGVyTm90aWZpY2F0aW9uSGFuZGxlcihoYW5kbGVyOiBOb3RpZmljYXRpb25IYW5kbGVyKTogdm9pZCB7XG4gICAgdGhpcy5fbm90aWZpY2F0aW9uSGFuZGxlcnMgPSB0aGlzLl9ub3RpZmljYXRpb25IYW5kbGVycy5maWx0ZXIoKGgpID0+IGggIT09IGhhbmRsZXIpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHB1YmxpYyBfZGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlsczogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscykge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZExheW91dENoYW5nZURldGFpbHMoKTogQ29udHJhY3QuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZExheW91dENoYW5nZURldGFpbHM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckNvZGVzLCBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFcnJvciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgRmlsdGVyQ2hhbmdlZEV2ZW50IGV4dGVuZHMgVGFibGVhdVdvcmtzaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuRmlsdGVyQ2hhbmdlZEV2ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHdvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0LFxuICAgIHByaXZhdGUgX2ZpZWxkTmFtZTogc3RyaW5nLFxuICAgIHByaXZhdGUgX2ZpZWxkSWQ/OiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuRmlsdGVyQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGROYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2ZpZWxkTmFtZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9maWVsZElkO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlckFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuRmlsdGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldC5nZXRGaWx0ZXJzQXN5bmMoKS50aGVuPENvbnRyYWN0LkZpbHRlcj4oKGZpbHRlcnMpID0+IHtcbiAgICAgIC8vIFRPRE86IEZpbHRlcmluZyBvZiB0aGUgZmlsdGVycyBzaG91bGQgZXZlbnR1YWxseSBiZSBkb25lIHBsYXRmb3JtIHNpZGUuXG4gICAgICBjb25zdCBldmVudGVkRmlsdGVyID0gdGhpcy5maWVsZElkXG4gICAgICAgID8gZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5maWVsZElkID09PSB0aGlzLmZpZWxkSWQsIHRoaXMpXG4gICAgICAgIDogZmlsdGVycy5maW5kKChmaWx0ZXIpID0+IGZpbHRlci5maWVsZE5hbWUgPT09IHRoaXMuZmllbGROYW1lLCB0aGlzKTtcblxuICAgICAgaWYgKCFldmVudGVkRmlsdGVyKSB7XG4gICAgICAgIC8vIFdlIHNob3VsZG4ndCBoaXQgdGhpcyB1bmxlc3MgdGhlIGZpbHRlciB3YXMgcmVtb3ZlZCBmcm9tIHRoZSB3b3Jrc2hlZXRcbiAgICAgICAgLy8gYWZ0ZXIgdGhlIGV2ZW50IHdhcyByYWlzZWQuXG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5NaXNzaW5nRmlsdGVyLCBgY2Fubm90IGZpbmQgZmlsdGVyOiAke3RoaXMuX2ZpZWxkTmFtZX1gKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGV2ZW50ZWRGaWx0ZXI7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVXb3Jrc2hlZXRFdmVudCB9IGZyb20gJy4vVGFibGVhdVdvcmtzaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIE1hcmtzU2VsZWN0ZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0Lk1hcmtzU2VsZWN0ZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuTWFya1NlbGVjdGlvbkNoYW5nZWQsIHdvcmtzaGVldCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWFya3NBc3luYygpOiBQcm9taXNlPENvbnRyYWN0Lk1hcmtzQ29sbGVjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLndvcmtzaGVldC5nZXRTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEVycm9yQ29kZXMsIFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpU2VydmljZVJlZ2lzdHJ5LCBQYXJhbWV0ZXJzU2VydmljZSwgU2VydmljZU5hbWVzLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFBhcmFtZXRlciB9IGZyb20gJy4uL01vZGVscy9QYXJhbWV0ZXInO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IFRhYmxlYXVTaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1U2hlZXRFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1U2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LlBhcmFtZXRlckNoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIF9nbG9iYWxGaWVsZE5hbWU6IHN0cmluZyxcbiAgICBzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQsXG4gICkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuUGFyYW1ldGVyQ2hhbmdlZCwgc2hlZXQpO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmFtZXRlckFzeW5jKCk6IFByb21pc2U8Q29udHJhY3QuUGFyYW1ldGVyPiB7XG4gICAgLy8gQ2FsbCBkb3duIHRvIG91ciBzZXJ2aWNlIHRvIGdldCB0aGUgcGFyYW1ldGVyIGJhY2sgdmlhIGl0cyBmaWVsZCBuYW1lXG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8UGFyYW1ldGVyc1NlcnZpY2U+KFNlcnZpY2VOYW1lcy5QYXJhbWV0ZXJzKTtcbiAgICByZXR1cm4gc2VydmljZS5maW5kUGFyYW1ldGVyQnlHbG9iYWxGaWVsZE5hbWVBc3luYyh0aGlzLl9nbG9iYWxGaWVsZE5hbWUpLnRoZW4oKHBhcmFtZXRlckltcGwpID0+IHtcbiAgICAgIGlmIChwYXJhbWV0ZXJJbXBsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLk1pc3NpbmdQYXJhbWV0ZXIsIGBDYW5ub3QgZmluZCBwYXJhbWV0ZXI6ICR7dGhpcy5fZ2xvYmFsRmllbGROYW1lfWApO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gbmV3IFBhcmFtZXRlcihwYXJhbWV0ZXJJbXBsLCB0aGlzLnNoZWV0KTtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgU3VtbWFyeURhdGFDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1V29ya3NoZWV0RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5TdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih3b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCkge1xuICAgIHN1cGVyKFRhYmxlYXVFdmVudFR5cGUuU3VtbWFyeURhdGFDaGFuZ2VkLCB3b3Jrc2hlZXQpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50VHlwZSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5UYWJsZWF1RXZlbnQge1xuICBwcml2YXRlIF90eXBlOiBUYWJsZWF1RXZlbnRUeXBlO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcih0eXBlOiBUYWJsZWF1RXZlbnRUeXBlKSB7XG4gICAgdGhpcy5fdHlwZSA9IHR5cGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHR5cGUoKTogVGFibGVhdUV2ZW50VHlwZSB7XG4gICAgcmV0dXJuIHRoaXMuX3R5cGU7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnRUeXBlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudCB9IGZyb20gJy4vVGFibGVhdUV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFRhYmxlYXVTaGVldEV2ZW50IGV4dGVuZHMgVGFibGVhdUV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVhdVNoZWV0RXZlbnQge1xuICBwcml2YXRlIF9zaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uU2hlZXQ7XG5cbiAgcHVibGljIGdldCBzaGVldCgpOiBDb250cmFjdC5FeHRlbnNpb25TaGVldCB7XG4gICAgcmV0dXJuIHRoaXMuX3NoZWV0O1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHR5cGU6IFRhYmxlYXVFdmVudFR5cGUsIHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCkge1xuICAgIHN1cGVyKHR5cGUpO1xuXG4gICAgdGhpcy5fc2hlZXQgPSBzaGVldDtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdVNoZWV0RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVTaGVldEV2ZW50JztcblxuZXhwb3J0IGNsYXNzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBleHRlbmRzIFRhYmxlYXVTaGVldEV2ZW50IGltcGxlbWVudHMgQ29udHJhY3QuVGFibGVhdVdvcmtzaGVldEV2ZW50IHtcbiAgcHVibGljIGdldCB3b3Jrc2hlZXQoKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0O1xuICB9XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHR5cGU6IFRhYmxlYXVFdmVudFR5cGUsXG4gICAgcHJvdGVjdGVkIF93b3Jrc2hlZXQ6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCxcbiAgKSB7XG4gICAgc3VwZXIodHlwZSwgX3dvcmtzaGVldCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBUYWJsZWF1RXZlbnQgfSBmcm9tICcuL1RhYmxlYXVFdmVudCc7XG5cbmV4cG9ydCBjbGFzcyBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZm9ybWF0dGluZzogQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nKSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcge1xuICAgIHJldHVybiB0aGlzLl9mb3JtYXR0aW5nO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgVGFibGVhdVdvcmtzaGVldEV2ZW50IH0gZnJvbSAnLi9UYWJsZWF1V29ya3NoZWV0RXZlbnQnO1xuXG5leHBvcnQgY2xhc3MgV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCBleHRlbmRzIFRhYmxlYXVXb3Jrc2hlZXRFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LldvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgd29ya3NoZWV0OiBDb250cmFjdC5FeHRlbnNpb25Xb3Jrc2hlZXQsXG4gICAgcHJpdmF0ZSBfZm9ybWF0dGluZzogQ29udHJhY3QuV29ya3NoZWV0Rm9ybWF0dGluZyxcbiAgKSB7XG4gICAgc3VwZXIoQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5Xb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZCwgd29ya3NoZWV0KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZm9ybWF0dGluZygpOiBDb250cmFjdC5Xb3Jrc2hlZXRGb3JtYXR0aW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGluZztcbiAgfVxufVxuIiwiaW1wb3J0IHsgTW9kZWwgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lID0gJ0JlbnRvbiBTYW5zJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUgPSAnQmVudG9uIFNhbnMgTG93LURQSSc7XG5cbmV4cG9ydCBjb25zdCBCZW50b25TYW5zQm9va0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBCb29rJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSA9ICdCZW50b24gU2FucyBCb29rIEl0YWxpYyc7XG5leHBvcnQgY29uc3QgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lID0gJ0JlbnRvbiBTYW5zIFNlbWlEZW1pJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgU2VtaURlbWkgSXRhbGljJztcbmV4cG9ydCBjb25zdCBCZW50b25TYW5zTGlnaHRGb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgTGlnaHQnO1xuZXhwb3J0IGNvbnN0IEJlbnRvblNhbnNNZWRpdW1Gb250RmFjZU5hbWUgPSAnQmVudG9uIFNhbnMgTWVkaXVtJztcblxuZXhwb3J0IGNvbnN0IFN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXM6IE1vZGVsW10gPSBbXG4gIEJlbnRvblNhbnNCb29rRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zQm9va0l0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc1NlbWlEZW1pRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlJdGFsaWNGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc01lZGl1bUZvbnRGYWNlTmFtZSxcbl07XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuXG5leHBvcnQgY2xhc3MgQ29ubmVjdGVkU2VydmVyIGltcGxlbWVudHMgQ29udHJhY3QuQ29ubmVjdGVkU2VydmVyIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBfdXNlcklkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfc2l0ZUlkPzogc3RyaW5nLFxuICAgIHByb3RlY3RlZCBfc2l0ZU5hbWVzcGFjZT86IHN0cmluZyxcbiAgICBwcm90ZWN0ZWQgX3dvcmtib29rSWQ/OiBzdHJpbmcsXG4gICkge31cblxuICBwdWJsaWMgZ2V0IHVzZXJJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl91c2VySWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpdGVJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9zaXRlSWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpdGVOYW1lc3BhY2UoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5fc2l0ZU5hbWVzcGFjZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya2Jvb2tJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl93b3JrYm9va0lkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGF0YVNjaGVtYSwgRGF0YVNvdXJjZSBhcyBEYXRhU291cmNlSW5mbyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBBcGlTZXJ2aWNlUmVnaXN0cnksIERhdGFTb3VyY2UsIERhdGFTb3VyY2VJbXBsLCBEYXRhU291cmNlU2VydmljZSwgU2VydmljZU5hbWVzLCBXb3JrYm9va0ltcGwgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBFeHRlbnNpb25Xb3JrYm9va0ltcGwgZXh0ZW5kcyBXb3JrYm9va0ltcGwge1xuICBwdWJsaWMgZ2V0QWxsRGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgY29uc3Qgc2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8RGF0YVNvdXJjZVNlcnZpY2U+KFNlcnZpY2VOYW1lcy5EYXRhU291cmNlU2VydmljZSk7XG5cbiAgICByZXR1cm4gc2VydmljZS5nZXRBbGxEYXRhU291cmNlc0FzeW5jKCkudGhlbjxBcnJheTxDb250cmFjdC5EYXRhU291cmNlPj4oKHJlc3VsdCkgPT4ge1xuICAgICAgY29uc3QgZGF0YVNjaGVtYTogRGF0YVNjaGVtYSA9IHJlc3VsdDtcbiAgICAgIGNvbnN0IGRhdGFTb3VyY2VzOiBBcnJheTxDb250cmFjdC5EYXRhU291cmNlPiA9IFtdO1xuXG4gICAgICAvLyBMb29wIHRocm91Z2ggYWxsIGRhdGEgc291cmNlcyBhbmQgYWRkIHRoZW0uXG4gICAgICBPYmplY3QudmFsdWVzKGRhdGFTY2hlbWEuZGF0YVNvdXJjZXMpLmZvckVhY2goKGRzKSA9PiB7XG4gICAgICAgIGRhdGFTb3VyY2VzLnB1c2godGhpcy5jcmVhdGVEYXRhU291cmNlRnJvbUluZm8oZHMpKTtcbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gZGF0YVNvdXJjZXM7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZURhdGFTb3VyY2VGcm9tSW5mbyhkYXRhU291cmNlSW5mbzogRGF0YVNvdXJjZUluZm8pOiBEYXRhU291cmNlIHtcbiAgICBjb25zdCBkYXRhU291cmNlSW1wbCA9IG5ldyBEYXRhU291cmNlSW1wbChkYXRhU291cmNlSW5mbywgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpO1xuICAgIGNvbnN0IGRhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZShkYXRhU291cmNlSW1wbCk7XG4gICAgZGF0YVNvdXJjZUltcGwuaW5pdGlhbGl6ZVdpdGhQdWJsaWNJbnRlcmZhY2VzKGRhdGFTb3VyY2UpO1xuICAgIHJldHVybiBkYXRhU291cmNlO1xuICB9XG59XG4iLCJpbXBvcnQgeyBFcnJvckNvZGVzLCBTaGVldFR5cGUgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQ29udGV4dE1lbnVFdmVudCxcbiAgRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcixcbiAgRXhlY3V0ZVBhcmFtZXRlcnMsXG4gIEV4dGVuc2lvbkRhc2hib2FyZEluZm8sXG4gIEV4dGVuc2lvbkxvY2F0b3IsXG4gIEV4dGVuc2lvblNldHRpbmdzSW5mbyxcbiAgRXh0ZW5zaW9uV29ya3NoZWV0SW5mbyxcbiAgRm9udE5hbWVBbmRJbmZvLFxuICBGb3JtYXR0aW5nU2hlZXQsXG4gIElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04sXG4gIEluaXRpYWxpemF0aW9uT3B0aW9ucyxcbiAgSW50ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5LFxuICBNb2RlbCxcbiAgTm90aWZpY2F0aW9uSWQsXG4gIFBhcmFtZXRlcklkLFxuICBTaGVldFBhdGgsXG4gIFZlcmJJZCxcbiAgV29ya2Jvb2tGb3JtYXR0aW5nLFxufSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBBcGlWZXJzaW9uLFxuICBEYXNoYm9hcmRJbXBsLFxuICBFeHBvcnRTZXJ2aWNlLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNoZWV0SW5mb0ltcGwsXG4gIFRhYmxlYXVFcnJvcixcbiAgVmVyc2lvbmVkRXh0ZXJuYWxBcGlEaXNwYXRjaGVyLFxuICBWaXpTZXJ2aWNlLFxuICBXb3Jrc2hlZXRJbXBsLFxuICBkb0Nyb3NzRnJhbWVCb290c3RyYXAsXG4gIHJlZ2lzdGVyQWxsU2hhcmVkU2VydmljZXMsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi4vTW9kZWxzL0Rhc2hib2FyZCc7XG5pbXBvcnQgeyBXb3JrYm9vayB9IGZyb20gJy4uL01vZGVscy9Xb3JrYm9vayc7XG5pbXBvcnQgeyBXb3Jrc2hlZXQgfSBmcm9tICcuLi9Nb2RlbHMvV29ya3NoZWV0JztcbmltcG9ydCB7IERhc2hib2FyZENvbnRlbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Rhc2hib2FyZENvbnRlbnQnO1xuaW1wb3J0IHsgRW52aXJvbm1lbnQgfSBmcm9tICcuLi9OYW1lc3BhY2VzL0Vudmlyb25tZW50JztcbmltcG9ydCB7IFNldHRpbmdzIH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9TZXR0aW5ncyc7XG5pbXBvcnQgeyBVSSB9IGZyb20gJy4uL05hbWVzcGFjZXMvVUknO1xuaW1wb3J0IHsgV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCB9IGZyb20gJy4uL05hbWVzcGFjZXMvV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRDb250ZW50IH0gZnJvbSAnLi4vTmFtZXNwYWNlcy9Xb3Jrc2hlZXRDb250ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9TZXJ2aWNlcy9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IEluaXRpYWxpemF0aW9uU2VydmljZSB9IGZyb20gJy4uL1NlcnZpY2VzL0luaXRpYWxpemF0aW9uU2VydmljZSc7XG5pbXBvcnQgeyByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcywgcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyB9IGZyb20gJy4uL1NlcnZpY2VzL1JlZ2lzdGVyQWxsRXh0ZW5zaW9uc1NlcnZpY2VzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2UgfSBmcm9tICcuLi9TZXJ2aWNlcy9VSVNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zRm9udEZhbWlseU5hbWUsXG4gIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZSxcbiAgQmVudG9uU2Fuc0xvd0RQSUZvbnRGYW1pbHlOYW1lLFxuICBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lLFxuICBCZW50b25TYW5zU2VtaURlbWlGb250RmFjZU5hbWUsXG4gIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZSxcbiAgU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlcyxcbn0gZnJvbSAnLi9CZW50b25TYW5zRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsIH0gZnJvbSAnLi9FeHRlbnNpb25Xb3JrYm9va0ltcGwnO1xuaW1wb3J0IHsgTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIH0gZnJvbSAnLi9MZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXInO1xuaW1wb3J0IHsgU2V0dGluZ3NJbXBsIH0gZnJvbSAnLi9TZXR0aW5nc0ltcGwnO1xuaW1wb3J0IHtcbiAgU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlcyxcbiAgVGFibGVhdUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVCb2xkRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVMaWdodEZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1TWVkaXVtRm9udEZhbWlseU5hbWUsXG4gIFRhYmxlYXVSZWd1bGFyRm9udEZhY2VOYW1lLFxuICBUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lLFxuICBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVTZW1pYm9sZEZvbnRGYW1pbHlOYW1lLFxufSBmcm9tICcuL1RhYmxlYXVCb29rRm9udE5hbWVDb25zdGFudHMnO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi9VSUltcGwnO1xuXG5leHBvcnQgdHlwZSBDYWxsYmFja01hcCA9IHsgW2tleTogc3RyaW5nXTogKCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfTtcblxuZXhwb3J0IGNsYXNzIEV4dGVuc2lvbnNJbXBsIHtcbiAgcHJpdmF0ZSBfaW5pdGlhbGl6YXRpb25Qcm9taXNlOiBQcm9taXNlPHN0cmluZz47XG4gIHByaXZhdGUgX3N0eWxlRWxlbWVudDogSFRNTFN0eWxlRWxlbWVudDtcbiAgcHVibGljIGRhc2hib2FyZENvbnRlbnQ/OiBEYXNoYm9hcmRDb250ZW50O1xuICBwdWJsaWMgd29ya3NoZWV0Q29udGVudD86IFdvcmtzaGVldENvbnRlbnQ7XG4gIHB1YmxpYyBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XG4gIHB1YmxpYyBzZXR0aW5nczogU2V0dGluZ3M7XG4gIHB1YmxpYyB1aTogVUk7XG4gIHB1YmxpYyB3b3JrYm9vazogV29ya2Jvb2s7XG4gIHB1YmxpYyBleHRlbnNpb25ab25lSWQ6IG51bWJlcjtcblxuICBwdWJsaWMgaW5pdGlhbGl6ZUFzeW5jKGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLCBjb250ZXh0TWVudUNhbGxiYWNrcz86IENhbGxiYWNrTWFwKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoIXRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZSkge1xuICAgICAgdGhpcy5faW5pdGlhbGl6YXRpb25Qcm9taXNlID0gbmV3IFByb21pc2U8c3RyaW5nPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGNvbnN0IGluaXRPcHRpb25zOiBJbml0aWFsaXphdGlvbk9wdGlvbnMgPSB7IGlzQWxwaGE6IEFwaVZlcnNpb24uSW5zdGFuY2UuaXNBbHBoYSwgaXNFeHRlbnNpb25EaWFsb2c6IGlzRXh0ZW5zaW9uRGlhbG9nIH07XG4gICAgICAgIC8vIEZpcnN0IHRoaW5nIHdlIHdhbnQgdG8gZG8gaXMgY2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgZGVza3RvcCBkaXNwYXRjaGVyIGFscmVhZHkgcmVnaXN0ZXJlZCBmb3IgdXNcbiAgICAgICAgaWYgKExlZ2FjeUludGVybmFsQXBpRGlzcGF0Y2hlckhvbGRlci5oYXNEZXNrdG9wQXBpRGlzcGF0Y2hlclByb21pc2UoaW5pdE9wdGlvbnMpKSB7XG4gICAgICAgICAgLy8gUnVubmluZyBpbiBhIHByZS0yMDE5LjMgZGVza3RvcCwgdXNlIG91ciBsZWdhY3kgZGlzcGF0Y2hlciBwcm9taXNlXG4gICAgICAgICAgY29uc3QgZGVza3RvcERpc3BhdGNoZXJQcm9taXNlID0gTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyLmdldERlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZShpbml0T3B0aW9ucyk7XG4gICAgICAgICAgZGVza3RvcERpc3BhdGNoZXJQcm9taXNlXG4gICAgICAgICAgICA/LnRoZW4oKGRpc3BhdGNoZXJGYWN0b3J5KSA9PiB0aGlzLm9uRGlzcGF0Y2hlclJlY2VpdmVkKGRpc3BhdGNoZXJGYWN0b3J5LCBpc0V4dGVuc2lvbkRpYWxvZywgY29udGV4dE1lbnVDYWxsYmFja3MpKVxuICAgICAgICAgICAgLnRoZW4oKG9wZW5QYXlsb2FkKSA9PiB7XG4gICAgICAgICAgICAgIHJlc29sdmUob3BlblBheWxvYWQpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFdlIG11c3QgYmUgcnVubmluZyBpbiBzZXJ2ZXIsIHNvIHdlIHNob3VsZCB0cnkgdG8ga2ljayBvZiB0aGUgc2VydmVyIGRpc3BhdGNoZXIgYm9vdHN0cmFwcGluZ1xuICAgICAgICAgIGNvbnN0IG9uRGlzcGF0Y2hlclJlY2VpdmVkQ2FsbGJhY2sgPSB0aGlzLm9uRGlzcGF0Y2hlclJlY2VpdmVkLmJpbmQodGhpcyk7XG4gICAgICAgICAgZG9Dcm9zc0ZyYW1lQm9vdHN0cmFwKHdpbmRvdywgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgaW5pdE9wdGlvbnMpXG4gICAgICAgICAgICAudGhlbigoZmFjdG9yeTogSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSkgPT4ge1xuICAgICAgICAgICAgICByZXR1cm4gb25EaXNwYXRjaGVyUmVjZWl2ZWRDYWxsYmFjayhmYWN0b3J5LCBpc0V4dGVuc2lvbkRpYWxvZywgY29udGV4dE1lbnVDYWxsYmFja3MpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKChvcGVuUGF5bG9hZCkgPT4ge1xuICAgICAgICAgICAgICByZXNvbHZlKG9wZW5QYXlsb2FkKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX2luaXRpYWxpemF0aW9uUHJvbWlzZTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyByZXBvcnRFeHRlbnNpb25SZW5kZXJDb21wbGV0ZShtZWRpYUJsb2I/OiBBcnJheUJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGV4cG9ydFNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPEV4cG9ydFNlcnZpY2U+KFNlcnZpY2VOYW1lcy5FeHBvcnQpO1xuXG4gICAgcmV0dXJuIGV4cG9ydFNlcnZpY2UucmVwb3J0RXh0ZW5zaW9uUmVuZGVyQ29tcGxldGUobWVkaWFCbG9iKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYzogb2JqZWN0KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB2aXpTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxWaXpTZXJ2aWNlPihTZXJ2aWNlTmFtZXMuVml6KTtcblxuICAgIHJldHVybiB2aXpTZXJ2aWNlLmNyZWF0ZVZpekltYWdlQXN5bmMoaW5wdXRTcGVjKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDbGlja1Rocm91Z2hBc3luYyhjbGlja1Rocm91Z2hFbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcblxuICAgIHJldHVybiB1aVNlcnZpY2Uuc2V0Q2xpY2tUaHJvdWdoQXN5bmMoY2xpY2tUaHJvdWdoRW5hYmxlZCwgdGhpcy5leHRlbnNpb25ab25lSWQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpc0Rhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3IobG9jYXRvcjogRXh0ZW5zaW9uTG9jYXRvcik6IGxvY2F0b3IgaXMgRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvciB7XG4gICAgY29uc3QgZGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvciA9IGxvY2F0b3IgYXMgRGFzaGJvYXJkRXh0ZW5zaW9uTG9jYXRvcjtcbiAgICBpZiAoIWRhc2hib2FyZEV4dGVuc2lvbkxvY2F0b3IuZGFzaGJvYXJkUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsICdVbmV4cGVjdGVkIGVycm9yIGR1cmluZyBpbml0aWFsaXphdGlvbi4nKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIG9uRGlzcGF0Y2hlclJlY2VpdmVkKFxuICAgIGRpc3BhdGNoZXJGYWN0b3J5OiBJbnRlcm5hbEFwaURpc3BhdGNoZXJGYWN0b3J5LFxuICAgIGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuLFxuICAgIGNvbnRleHRNZW51RnVuY3Rpb25zPzogQ2FsbGJhY2tNYXAsXG4gICk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgbGV0IGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJGYWN0b3J5KElOVEVSTkFMX0NPTlRSQUNUX1ZFUlNJT04pO1xuXG4gICAgLy8gQ2FsbCB0byByZWdpc3RlciBhbGwgdGhlIHNlcnZpY2VzIHdoaWNoIHdpbGwgdXNlIHRoZSBuZXdseSBpbml0aWFsaXplZCBkaXNwYXRjaGVyXG4gICAgcmVnaXN0ZXJJbml0aWFsaXphdGlvbkV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyKTtcblxuICAgIC8vIEdldCB0aGUgaW5pdGlhbGl6YXRpb24gc2VydmljZSBhbmQgaW5pdGlhbGl6ZSB0aGlzIGV4dGVuc2lvblxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8SW5pdGlhbGl6YXRpb25TZXJ2aWNlPihcbiAgICAgIEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuSW5pdGlhbGl6YXRpb25TZXJ2aWNlLFxuICAgICk7XG5cbiAgICBjb25zdCBjYWxsYmFja01hcEtleXMgPSBjb250ZXh0TWVudUZ1bmN0aW9ucyA/IE9iamVjdC5rZXlzKGNvbnRleHRNZW51RnVuY3Rpb25zKSA6IFtdO1xuICAgIHJldHVybiBpbml0aWFsaXphdGlvblNlcnZpY2UuaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYyhpc0V4dGVuc2lvbkRpYWxvZywgY2FsbGJhY2tNYXBLZXlzKS50aGVuPHN0cmluZz4oKHJlc3VsdCkgPT4ge1xuICAgICAgLy8gSWYgd2UgcmVjZWl2ZSBhbiBpbnZhbGlkIHBsYWZvcm0gdmVyc2lvbiwgdGhpcyBtZWFucyB0aGF0IHBsYXRmb3JtIGlzIHJ1bm5uaW5nIDEuNCBvciAyLjEgYW5kXG4gICAgICAvLyBkb2Vzbid0IHBhc3MgdGhlIHBsYXRmb3JtIHZlcnNpb24gdG8gZXh0ZXJuYWwuIEluIHRoaXMgY2FzZSB3ZSBhc3N1bWUgdGhlIHBsYXRmb3JtIHZlcnNpb24gdG8gYmUgMS45XG4gICAgICBjb25zdCBwbGF0Zm9ybVZlcnNpb24gPSByZXN1bHQuZXh0ZW5zaW9uRW52aXJvbm1lbnQucGxhdGZvcm1WZXJzaW9uXG4gICAgICAgID8gcmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50LnBsYXRmb3JtVmVyc2lvblxuICAgICAgICA6IHsgbWFqb3I6IDEsIG1pbm9yOiA5LCBmaXg6IDAgfTtcblxuICAgICAgLy8gV3JhcCBvdXIgZXhpc3RpbmcgZGlzcGF0Y2hlciBpbiBhIGRpc3BhdGNoZXIgdGhhdCBjYW4gZG93bmdyYWRlL3VwZ3JhZGUgZm9yIGFuIG9sZGVyIHBsYXRmb3JtLlxuICAgICAgaWYgKFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlci5uZWVkc1ZlcnNpb25Db252ZXJ0ZXIocGxhdGZvcm1WZXJzaW9uKSkge1xuICAgICAgICBkaXNwYXRjaGVyID0gbmV3IFZlcnNpb25lZEV4dGVybmFsQXBpRGlzcGF0Y2hlcihkaXNwYXRjaGVyLCBwbGF0Zm9ybVZlcnNpb24pO1xuICAgICAgfVxuICAgICAgLy8gUmVnaXN0cmF0aW9uIG9mIHNlcnZpY2VzIG11c3QgaGFwcGVuIGJlZm9yZSBpbml0aWFsaXppbmcgY29udGVudCBhbmQgZW52aXJvbm1lbnRcbiAgICAgIC8vIEV4dGVuc2lvbnMgZG9lc24ndCBuZWVkIHRvIHBhc3MgaW4gYSByZWdpc3RyeUlkLiBCeSBkZWZhdWx0LCB0aGUgc2VydmljZSByZWdpc3RyeSBpbnN0YW5jZSBpcyBhc3NvY2lhdGVkIHdpdGggcmVnaXN0cnlJZD0wLlxuICAgICAgcmVnaXN0ZXJBbGxTaGFyZWRTZXJ2aWNlcyhkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCk7XG4gICAgICByZWdpc3RlckFsbEV4dGVuc2lvbnNTZXJ2aWNlcyhkaXNwYXRjaGVyKTtcblxuICAgICAgaWYgKHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvICYmIHRoaXMuaXNEYXNoYm9hcmRFeHRlbnNpb25Mb2NhdG9yKHJlc3VsdC5leHRlbnNpb25JbnN0YW5jZS5sb2NhdG9yKSkge1xuICAgICAgICB0aGlzLmRhc2hib2FyZENvbnRlbnQgPSB0aGlzLmluaXRpYWxpemVEYXNoYm9hcmRDb250ZW50KFxuICAgICAgICAgIHJlc3VsdC5leHRlbnNpb25EYXNoYm9hcmRJbmZvLFxuICAgICAgICAgIHJlc3VsdC5leHRlbnNpb25JbnN0YW5jZS5sb2NhdG9yLmRhc2hib2FyZFBhdGgsXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9uWm9uZUlkID0gcmVzdWx0LmV4dGVuc2lvbkRhc2hib2FyZEluZm8uZXh0ZW5zaW9uWm9uZUlkO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVzdWx0LmV4dGVuc2lvbldvcmtzaGVldEluZm8pIHtcbiAgICAgICAgdGhpcy53b3Jrc2hlZXRDb250ZW50ID0gdGhpcy5pbml0aWFsaXplV29ya3NoZWV0Q29udGVudChyZXN1bHQuZXh0ZW5zaW9uV29ya3NoZWV0SW5mbyk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZW52aXJvbm1lbnQgPSBuZXcgRW52aXJvbm1lbnQocmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50KTtcbiAgICAgIHRoaXMuc2V0dGluZ3MgPSB0aGlzLmluaXRpYWxpemVTZXR0aW5ncyhyZXN1bHQuZXh0ZW5zaW9uU2V0dGluZ3NJbmZvKTtcbiAgICAgIHRoaXMudWkgPSBuZXcgVUkobmV3IFVJSW1wbChpc0V4dGVuc2lvbkRpYWxvZykpO1xuICAgICAgdGhpcy53b3JrYm9vayA9IG5ldyBXb3JrYm9vayhuZXcgRXh0ZW5zaW9uV29ya2Jvb2tJbXBsKCkpO1xuXG4gICAgICBpZiAocmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rRm9ybWF0dGluZykge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVUYWJsZWF1Rm9udHMoZGlzcGF0Y2hlciwgcmVzdWx0LmV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rRm9ybWF0dGluZyk7XG4gICAgICAgIHRoaXMuYXBwbHlBbGxGb3JtYXR0aW5nKHJlc3VsdC5leHRlbnNpb25FbnZpcm9ubWVudC53b3JrYm9va0Zvcm1hdHRpbmcpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZnRlciBpbml0aWFsaXphdGlvbiBoYXMgY29tcGxldGVkLCBzZXR1cCBsaXN0ZW5lcnMgZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMgdGhhdFxuICAgICAgLy8gYXJlIG1lYW50IHRvIGJlIHRyaWdnZXJlZCB3aGVuZXZlciBhIGNvbnRleHQgbWVudSBpdGVtIGlzIGNsaWNrZWQuXG4gICAgICB0aGlzLmluaXRpYWxpemVDb250ZXh0TWVudUNhbGxiYWNrcyhjb250ZXh0TWVudUZ1bmN0aW9ucyk7XG5cbiAgICAgIC8vIEFsc28gc2V0IHVwIGxpc3RlbmVycyBmb3IgRXh0ZW5zaW9uU3R5bGVzQ2hhbmdlZEV2ZW50XG4gICAgICB0aGlzLmluaXRpYWxpemVXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnRDYWxsYmFjayhkaXNwYXRjaGVyKTtcblxuICAgICAgLy8gSW4gdGhlIG5vcm1hbCBpbml0aWFsaXphdGlvbiBjYXNlLCB0aGlzIHdpbGwgYmUgYW4gZW1wdHkgc3RyaW5nLiAgV2hlbiByZXR1cm5pbmcgZnJvbSBpbml0aWFsaXplQXN5bmMgdG8gdGhlXG4gICAgICAvLyBkZXZlbG9wZXIsIHdlIGp1c3QgaW5nb3JlIHRoYXQgc3RyaW5nLiAgSW4gdGhlIGNhc2Ugb2YgaW5pdGlhbGl6aW5nIGZyb20gYW4gZXh0ZW5zaW9uIGRpYWxvZywgdGhpcyBzdHJpbmdcbiAgICAgIC8vIGlzIGFuIG9wdGlvbmFsIHBheWxvYWQgc2VudCBmcm9tIHRoZSBwYXJlbnQgZXh0ZW5zaW9uLlxuICAgICAgcmV0dXJuIHJlc3VsdC5leHRlbnNpb25EaWFsb2dQYXlsb2FkO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5QWxsRm9ybWF0dGluZyhmb3JtYXR0aW5nTW9kZWw6IFdvcmtib29rRm9ybWF0dGluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fc3R5bGVFbGVtZW50KSB7XG4gICAgICB0aGlzLl9zdHlsZUVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgdGhpcy5fc3R5bGVFbGVtZW50LmlkID0gJ1RhYmxlYXUtRXh0ZW5zaW9uLUZvcm1hdHRpbmcnO1xuICAgICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzLl9zdHlsZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy5fc3R5bGVFbGVtZW50LnNoZWV0IHx8ICFmb3JtYXR0aW5nTW9kZWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBzdHlsZXNoZWV0OiBDU1NTdHlsZVNoZWV0ID0gdGhpcy5fc3R5bGVFbGVtZW50LnNoZWV0O1xuICAgIHdoaWxlIChzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCA+IDApIHtcbiAgICAgIHN0eWxlc2hlZXQuZGVsZXRlUnVsZShzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCAtIDEpO1xuICAgIH1cbiAgICBmb3JtYXR0aW5nTW9kZWwuZm9ybWF0dGluZ1NoZWV0cy5tYXAoKGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQpID0+IHtcbiAgICAgIHRoaXMuYXBwbHlGb3JtYXR0aW5nU2hlZXRUb1N0eWxlU2hlZXQoY3VycmVudEZvcm1hdHRpbmdTaGVldCwgc3R5bGVzaGVldCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFwcGx5Rm9ybWF0dGluZ1NoZWV0VG9TdHlsZVNoZWV0KGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQ6IEZvcm1hdHRpbmdTaGVldCwgc3R5bGVzaGVldDogQ1NTU3R5bGVTaGVldCk6IHZvaWQge1xuICAgIGxldCBzdHlsZUluZm8gPSAnJztcblxuICAgIGNvbnN0IGNzc1Byb3BlcnRpZXMgPSBjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXM7XG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LWZhbWlseTogJyArIGNzc1Byb3BlcnRpZXMuZm9udEZhbWlseS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy5mb250U2l6ZSkge1xuICAgICAgc3R5bGVJbmZvICs9ICdmb250LXNpemU6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRTaXplLnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQpIHtcbiAgICAgIHN0eWxlSW5mbyArPSAnZm9udC13ZWlnaHQ6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQudG9TdHJpbmcoKSArICc7ICc7XG4gICAgfVxuXG4gICAgaWYgKGNzc1Byb3BlcnRpZXMuZm9udFN0eWxlKSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2ZvbnQtc3R5bGU6ICcgKyBjc3NQcm9wZXJ0aWVzLmZvbnRTdHlsZS50b1N0cmluZygpICsgJzsgJztcbiAgICB9XG5cbiAgICBpZiAoY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbikge1xuICAgICAgc3R5bGVJbmZvICs9ICd0ZXh0LWRlY29yYXRpb246ICcgKyBjc3NQcm9wZXJ0aWVzLnRleHREZWNvcmF0aW9uLnRvU3RyaW5nKCkgKyAnOyAnO1xuICAgIH1cblxuICAgIGlmIChjc3NQcm9wZXJ0aWVzLmNvbG9yKSB7XG4gICAgICBzdHlsZUluZm8gKz0gJ2NvbG9yOiAnICsgY3NzUHJvcGVydGllcy5jb2xvciArICc7ICc7XG4gICAgfVxuXG4gICAgY29uc3Qgc2VsZWN0b3I6IHN0cmluZyA9ICcuJyArIGN1cnJlbnRGb3JtYXR0aW5nU2hlZXQuY2xhc3NOYW1lS2V5O1xuICAgIGNvbnN0IHJ1bGU6IHN0cmluZyA9IHNlbGVjdG9yICsgJyB7ICcgKyBzdHlsZUluZm8gKyAnIH0nO1xuICAgIHN0eWxlc2hlZXQuaW5zZXJ0UnVsZShydWxlLCBzdHlsZXNoZWV0LmNzc1J1bGVzLmxlbmd0aCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnRDYWxsYmFjayhkaXNwYXRjaGVyOiBJbnRlcm5hbEFwaURpc3BhdGNoZXIpOiB2b2lkIHtcbiAgICBjb25zdCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihcbiAgICAgIFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24sXG4gICAgKTtcbiAgICAvLyBVbnJlZ2lzdGVyIGZ1bmN0aW9uIG5vdCB1c2VkIHNpbmNlIHRoZXNlIG5vdGlmaWNhdGlvbnMgc2hvdWxkIGJlXG4gICAgLy8gb2JzZXJ2ZWQgZm9yIHRoZSBmdWxsIGxpZmV0aW1lIG9mIHRoZSBleHRlbnNpb24uXG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5Xb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudEZvcm1hdHRpbmc6IFdvcmtib29rRm9ybWF0dGluZykgPT4ge1xuICAgICAgICBpZiAoZXZlbnRGb3JtYXR0aW5nKSB7XG4gICAgICAgICAgdGhpcy5pbml0aWFsaXplVGFibGVhdUZvbnRzKGRpc3BhdGNoZXIsIGV2ZW50Rm9ybWF0dGluZyk7XG4gICAgICAgICAgdGhpcy5hcHBseUFsbEZvcm1hdHRpbmcoZXZlbnRGb3JtYXR0aW5nKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplVGFibGVhdUZvbnRzKGRpc3BhdGNoZXI6IEludGVybmFsQXBpRGlzcGF0Y2hlciwgd29ya2Jvb2tGb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBmb250TmFtZXM6IE1vZGVsW10gPSBbLi4uU3VwcG9ydGVkQmVudG9uU2Fuc0ZvbnRGYWNlcywgLi4uU3VwcG9ydGVkVGFibGVhdUZvbnRGYWNlc107XG4gICAgd29ya2Jvb2tGb3JtYXR0aW5nLmZvcm1hdHRpbmdTaGVldHMuZm9yRWFjaCgoZm9ybWF0dGluZ1NoZWV0KSA9PiB7XG4gICAgICBpZiAoZm9ybWF0dGluZ1NoZWV0LmNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSkge1xuICAgICAgICBmb250TmFtZXMucHVzaChmb3JtYXR0aW5nU2hlZXQuY3NzUHJvcGVydGllcy5mb250RmFtaWx5KTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChmb250TmFtZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7IFtQYXJhbWV0ZXJJZC5Gb250TmFtZUxpc3RJdGVtc106IGZvbnROYW1lcyB9O1xuICAgICAgZGlzcGF0Y2hlclxuICAgICAgICAuZXhlY3V0ZShWZXJiSWQuR2V0Rm9udHMsIHBhcmFtZXRlcnMpXG4gICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9hZEZvbnRzKHJlc3BvbnNlLnJlc3VsdCBhcyBBcnJheTxGb250TmFtZUFuZEluZm8+KTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkRm9udHMoZm9udHM6IEFycmF5PEZvbnROYW1lQW5kSW5mbz4pOiB2b2lkIHtcbiAgICBmb250cy5mb3JFYWNoKChmb250TmFtZUFuZEluZm8pID0+IHtcbiAgICAgIGlmIChTdXBwb3J0ZWRUYWJsZWF1Rm9udEZhY2VzLmluY2x1ZGVzKGZvbnROYW1lQW5kSW5mby5mb250TmFtZSkpIHtcbiAgICAgICAgdGhpcy5sb2FkVGFibGVhdUZvbnRzKGZvbnROYW1lQW5kSW5mbyk7XG4gICAgICB9IGVsc2UgaWYgKFN1cHBvcnRlZEJlbnRvblNhbnNGb250RmFjZXMuaW5jbHVkZXMoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSkge1xuICAgICAgICB0aGlzLmxvYWRCZW50b25TYW5zRm9udHMoZm9udE5hbWVBbmRJbmZvKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8pKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZURhc2hib2FyZENvbnRlbnQoaW5mbzogRXh0ZW5zaW9uRGFzaGJvYXJkSW5mbywgc2hlZXRQYXRoOiBTaGVldFBhdGgpOiBEYXNoYm9hcmRDb250ZW50IHtcbiAgICAvLyBzaGVldHMgYXJlIGFsd2F5cyBhY3RpdmUgZm9yIEV4dGVuc2lvbnNcbiAgICBjb25zdCBzaGVldEluZm9JbXBsID0gbmV3IFNoZWV0SW5mb0ltcGwoaW5mby5uYW1lLCBTaGVldFR5cGUuRGFzaGJvYXJkLCB7IHdpZHRoOiBpbmZvLnNpemUudywgaGVpZ2h0OiBpbmZvLnNpemUuaCB9LCB1bmRlZmluZWQsIHRydWUpO1xuICAgIGNvbnN0IGRhc2hib2FyZEltcGwgPSBuZXcgRGFzaGJvYXJkSW1wbChzaGVldEluZm9JbXBsLCBpbmZvLnpvbmVzLCBzaGVldFBhdGgsIEV4dGVuc2lvbnNSZWdpc3RyeUlkLCBudWxsLCBpbmZvLmFjdGl2ZURhc2hib2FyZE9iamVjdElkKTtcbiAgICBjb25zdCBkYXNoYm9hcmQgPSBuZXcgRGFzaGJvYXJkKGRhc2hib2FyZEltcGwpO1xuICAgIHJldHVybiBuZXcgRGFzaGJvYXJkQ29udGVudChkYXNoYm9hcmQpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplV29ya3NoZWV0Q29udGVudChpbmZvOiBFeHRlbnNpb25Xb3Jrc2hlZXRJbmZvKTogV29ya3NoZWV0Q29udGVudCB7XG4gICAgY29uc3Qgc2hlZXRJbmZvSW1wbCA9IG5ldyBTaGVldEluZm9JbXBsKFxuICAgICAgaW5mby52aXN1YWxJZC53b3Jrc2hlZXQsXG4gICAgICBTaGVldFR5cGUuV29ya3NoZWV0LFxuICAgICAgeyB3aWR0aDogaW5mby5zaXplLncsIGhlaWdodDogaW5mby5zaXplLmggfSxcbiAgICAgIHVuZGVmaW5lZCwgLy8gaW5kZXggcHJvcGVydHkgaXMgZW1iZWRkaW5nIHNwZWNpZmljXG4gICAgICB0cnVlLCAvLyBzaGVldHMgYXJlIGFsd2F5cyBhY3RpdmUgZm9yIEV4dGVuc2lvbnNcbiAgICApO1xuXG4gICAgY29uc3Qgd29ya3NoZWV0SW1wbCA9IG5ldyBXb3Jrc2hlZXRJbXBsKFxuICAgICAgc2hlZXRJbmZvSW1wbCxcbiAgICAgIEV4dGVuc2lvbnNSZWdpc3RyeUlkLFxuICAgICAgaW5mby52aXN1YWxJZCxcbiAgICAgIG51bGwsIC8vIHBhcmVudERhc2hib2FyZCBpcyBhbHdheXMgbnVsbCBmb3Igd29ya3NoZWV0IGluIFdvcmtzaGVldENvbnRlbnRcbiAgICAgIG51bGwsIC8vIHBhcmVudFN0b3J5UG9pbnQgaXMgb25seSB1c2VkIGZvciBlbWJlZGRpbmdcbiAgICAgIGluZm8uYmFja2dyb3VuZENvbG9yLFxuICAgICAgV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbC5jb252ZXJ0VG9Xb3JrYm9va0Zvcm1hdHRpbmcoaW5mby5mb3JtYXR0aW5nKSxcbiAgICApO1xuICAgIGNvbnN0IHdvcmtzaGVldCA9IG5ldyBXb3Jrc2hlZXQod29ya3NoZWV0SW1wbCk7XG4gICAgcmV0dXJuIG5ldyBXb3Jrc2hlZXRDb250ZW50KHdvcmtzaGVldCk7XG4gIH1cblxuICBwcml2YXRlIGluaXRpYWxpemVTZXR0aW5ncyhzZXR0aW5nc0luZm86IEV4dGVuc2lvblNldHRpbmdzSW5mbyk6IFNldHRpbmdzIHtcbiAgICBjb25zdCBzZXR0aW5nc0ltcGwgPSBuZXcgU2V0dGluZ3NJbXBsKHNldHRpbmdzSW5mbyk7XG4gICAgcmV0dXJuIG5ldyBTZXR0aW5ncyhzZXR0aW5nc0ltcGwpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQ29udGV4dE1lbnVDYWxsYmFja3MoY29udGV4dE1lbnVGdW5jdGlvbnM/OiBDYWxsYmFja01hcCk6IHZvaWQge1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFxuICAgICAgU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbixcbiAgICApO1xuXG4gICAgLy8gVW5yZWdpc3RlciBmdW5jdGlvbiBub3QgdXNlZCBzaW5jZSB0aGVzZSBub3RpZmljYXRpb25zIHNob3VsZCBiZVxuICAgIC8vIG9ic2VydmVkIGZvciB0aGUgZnVsbCBsaWZldGltZSBvZiB0aGUgZXh0ZW5zaW9uLlxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuQ29udGV4dE1lbnVDbGljayxcbiAgICAgICgpID0+IHtcbiAgICAgICAgLy8gTGV0IHRocm91Z2ggYW55IGNvbnRleHQgbWVudSBldmVudCwgdGhlc2UgYXJlIGFscmVhZHkgZmlsdGVyZWQgb24gYXBpLWNvcmVcbiAgICAgICAgLy8gYmFzZWQgb24gdGhlIGV4dGVuc2lvbiBsb2NhdG9yLlxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0sXG4gICAgICAoZXZlbnQ6IENvbnRleHRNZW51RXZlbnQpID0+IHtcbiAgICAgICAgLy8gRXhlY3V0ZSB0aGUgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29udGV4dCBtZW51IElEXG4gICAgICAgIGlmIChjb250ZXh0TWVudUZ1bmN0aW9ucykge1xuICAgICAgICAgIGlmICghY29udGV4dE1lbnVGdW5jdGlvbnNbZXZlbnQuaWRdKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlY2VpdmVkIHVuZXhwZWN0ZWQgY29udGV4dCBtZW51IElkIGZyb20gZXZlbnQ6ICR7ZXZlbnQuaWR9YCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dE1lbnVGdW5jdGlvbnNbZXZlbnQuaWRdKCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZFRhYmxlYXVGb250cyhmb250TmFtZUFuZEluZm86IEZvbnROYW1lQW5kSW5mbyk6IHZvaWQge1xuICAgIHN3aXRjaCAoZm9udE5hbWVBbmRJbmZvLmZvbnROYW1lKSB7XG4gICAgICBjYXNlIFRhYmxlYXVCb29rRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1TGlnaHRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdUxpZ2h0Rm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1UmVndWxhckZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShUYWJsZWF1UmVndWxhckZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1U2VtaUJvbGRGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVNlbWlib2xkRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdVJlZ3VsYXJGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1Qm9sZEZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1Qm9sZEZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoVGFibGVhdU1lZGl1bUZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnYm9sZCcsIHN0eWxlOiAnbm9ybWFsJyB9KSk7XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChcbiAgICAgICAgICBuZXcgRm9udEZhY2UoVGFibGVhdVNlbWlib2xkRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pLFxuICAgICAgICApO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKFRhYmxlYXVNZWRpdW1Gb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ25vcm1hbCcsIHN0eWxlOiAnbm9ybWFsJyB9KSxcbiAgICAgICAgKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShUYWJsZWF1TGlnaHRGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKFRhYmxlYXVCb29rRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdib2xkJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgJ2F0dGVtcHRlZCB0byBsb2FkIHVuc3VwcG9ydGVkIGZvbnQ6ICR7Zm9udE5hbWVBbmRJbmZvLmZvbnROYW1lfS4nYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkQmVudG9uU2Fuc0ZvbnRzKGZvbnROYW1lQW5kSW5mbzogRm9udE5hbWVBbmRJbmZvKTogdm9pZCB7XG4gICAgc3dpdGNoIChmb250TmFtZUFuZEluZm8uZm9udE5hbWUpIHtcbiAgICAgIGNhc2UgQmVudG9uU2Fuc0Jvb2tGb250RmFjZU5hbWU6XG4gICAgICAgIGRvY3VtZW50LmZvbnRzLmFkZChuZXcgRm9udEZhY2UoQmVudG9uU2Fuc0ZvbnRGYW1pbHlOYW1lLCBmb250TmFtZUFuZEluZm8uZm9udEJpbmFyeUluZm8sIHsgd2VpZ2h0OiAnbm9ybWFsJywgc3R5bGU6ICdub3JtYWwnIH0pKTtcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICcxMDAnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNMaWdodEZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICcxMDAnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSBCZW50b25TYW5zTWVkaXVtRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSkpO1xuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoXG4gICAgICAgICAgbmV3IEZvbnRGYWNlKEJlbnRvblNhbnNMb3dEUElGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHdlaWdodDogJ2JvbGQnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNTZW1pRGVtaUZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKFxuICAgICAgICAgIG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyB3ZWlnaHQ6ICdub3JtYWwnLCBzdHlsZTogJ25vcm1hbCcgfSksXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNCb29rSXRhbGljRm9udEZhY2VOYW1lOlxuICAgICAgICBkb2N1bWVudC5mb250cy5hZGQobmV3IEZvbnRGYWNlKEJlbnRvblNhbnNGb250RmFtaWx5TmFtZSwgZm9udE5hbWVBbmRJbmZvLmZvbnRCaW5hcnlJbmZvLCB7IHN0eWxlOiAnaXRhbGljJyB9KSk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIEJlbnRvblNhbnNTZW1pRGVtaUl0YWxpY0ZvbnRGYWNlTmFtZTpcbiAgICAgICAgZG9jdW1lbnQuZm9udHMuYWRkKG5ldyBGb250RmFjZShCZW50b25TYW5zTG93RFBJRm9udEZhbWlseU5hbWUsIGZvbnROYW1lQW5kSW5mby5mb250QmluYXJ5SW5mbywgeyBzdHlsZTogJ2l0YWxpYycgfSkpO1xuICAgICAgICBicmVhaztcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihFcnJvckNvZGVzLkludGVybmFsRXJyb3IsIGAnYXR0ZW1wdGVkIHRvIGxvYWQgdW5zdXBwb3J0ZWQgZm9udDogJHtmb250TmFtZUFuZEluZm8uZm9udE5hbWV9LidgKTtcbiAgICB9XG4gIH1cbn1cbiIsImltcG9ydCB7IEluaXRpYWxpemF0aW9uT3B0aW9ucywgSU5URVJOQUxfQ09OVFJBQ1RfVkVSU0lPTiwgSW50ZXJuYWxBcGlEaXNwYXRjaGVyRmFjdG9yeSwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBMZWdhY3lJbnRlcm5hbEFwaURpc3BhdGNoZXJIb2xkZXIgaGFzIGJlZW4gbW92ZWQgKGFuZCByZW5hbWVkKSBmcm9tIGFwaS1pbnRlcm5hbC1jb250cmFjdC5cbiAqIEl0IHN1cHBvcnRzIHJ1bm5pbmcgYSBuZXdlciBleHRlcm5hbCBsaWJyYXJ5IGFnYWluc3QgYSBwcmUgMjAxOS4zIGRlc2t0b3AuXG4gKiBTdGFydGluZyBpbiAyMDE5LjMsIHdlIGhhdmUgYSBtZXJnZWQgYm9vdHN0cmFwIHN0eWxlIGZvciBib3RoIGRlc2t0b3AgYW5kIHNlcnZlci5cbiAqIEluIGFkZGl0aW9uLCB0aGUgYWxwaGEgY2hlY2tpbmcgdGhhdCBpcyBoYXBwZW5pbmcgaGVyZSBpcyBub3QgbmVjZXNzYXJ5IGluIGV4dGVybmFsLWFwaS1qc1xuICogIGFmdGVyIDIwMTkuMyBiZWNhdXNlIHRoYXQgY2hlY2tpbmcgaGFwcGVucyBpbiBhcGktcGxhdGZvcm0tanMgKEFwaURpc3BhdGNoZXJUZXN0LnRzKVxuICogVEZTSUQ6IDEwOTE1NjEgdHJhY2tzIGFuIGltcHJvdmVtZW50IHRvIHRoaXMgc3lzdGVtIHRvIG1ha2UgaXQgbGVzcyBjb21wbGV4IGFuZCB0aWUgaXQgZGlyZWN0bHkgdG9cbiAqICB0YWJsZWF1IGJldGEgcmVsZWFzZSB2ZXJzaW9ucy5cbiAqIEBkZXByZWNhdGVkXG4gKi9cbmV4cG9ydCBuYW1lc3BhY2UgTGVnYWN5SW50ZXJuYWxBcGlEaXNwYXRjaGVySG9sZGVyIHtcbiAgLyoqXG4gICAqIEBwYXJhbSBvcHRpb25zXG4gICAqL1xuICBleHBvcnQgZnVuY3Rpb24gZ2V0RGVza3RvcERpc3BhdGNoZXJQcm9taXNlKG9wdGlvbnM/OiBJbml0aWFsaXphdGlvbk9wdGlvbnMpOiBQcm9taXNlPEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3Rvcnk+IHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoKCFvcHRpb25zIHx8IHR5cGVvZiBvcHRpb25zLmlzQWxwaGEgPT09ICd1bmRlZmluZWQnKSAmJiAhd2luZG93Ll9fd2FybmluZ0lzc3VlZCkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGVcbiAgICAgIGNvbnNvbGUud2FybignVGhpcyBpcyBhIGJldGEgdmVyc2lvbiBvZiB0aGUgRXh0ZW5zaW9ucyBBUEkuIFBsZWFzZSB1cGdyYWRlIHRvIGFuIG9mZmljaWFsIHJlbGVhc2UuJyk7XG4gICAgICB3aW5kb3cuX193YXJuaW5nSXNzdWVkID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnM/LmlzQWxwaGEgJiYgd2luZG93Ll9fcGxhdGZvcm1Jc09mZmljaWFsUmVsZWFzZSkge1xuICAgICAgd2luZG93Ll9fdGFibGVhdURlc2t0b3BEaXNwYXRjaGVyXG4gICAgICAgIC50aGVuKChkaXNwYXRjaGVyRmFjdG9yeSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGRpc3BhdGNoZXIgPSBkaXNwYXRjaGVyRmFjdG9yeShJTlRFUk5BTF9DT05UUkFDVF9WRVJTSU9OKTtcbiAgICAgICAgICBkaXNwYXRjaGVyLmV4ZWN1dGUoVmVyYklkLkJsb2NrRXh0ZW5zaW9uLCB7fSkuY2F0Y2goKTtcbiAgICAgICAgfSlcbiAgICAgICAgLmNhdGNoKCk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyB3aWxsIGJlIHVuZGVmaW5lZCBpZiBwcm9taXNlIGlzIHJlamVjdGVkIG9yIHRocm93c1xuICAgIHJldHVybiB3aW5kb3cuX190YWJsZWF1RGVza3RvcERpc3BhdGNoZXI7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIG9wdGlvbnNcbiAgICovXG4gIGV4cG9ydCBmdW5jdGlvbiBoYXNEZXNrdG9wQXBpRGlzcGF0Y2hlclByb21pc2Uob3B0aW9ucz86IEluaXRpYWxpemF0aW9uT3B0aW9ucyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIWdldERlc2t0b3BEaXNwYXRjaGVyUHJvbWlzZShvcHRpb25zKTtcbiAgfVxufVxuXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGludGVyZmFjZSBXaW5kb3cge1xuICAgIF9fdGFibGVhdURlc2t0b3BEaXNwYXRjaGVyOiBQcm9taXNlPEludGVybmFsQXBpRGlzcGF0Y2hlckZhY3Rvcnk+O1xuICAgIF9fcGxhdGZvcm1Jc09mZmljaWFsUmVsZWFzZTogYm9vbGVhbjtcbiAgICBfX3dhcm5pbmdJc3N1ZWQ6IGJvb2xlYW47XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25TZXR0aW5nc0luZm8sIE5vdGlmaWNhdGlvbklkLCBTZXR0aW5nc0V2ZW50IH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRXJyb3JIZWxwZXJzLFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgVGFibGVhdUVycm9yLFxufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFRhYmxlYXVFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9UYWJsZWF1RXZlbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyB9IGZyb20gJy4uL1NlcnZpY2VzL0V4dGVuc2lvbnNTZXJ2aWNlTmFtZXMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IFNldHRpbmdzQ29sbGVjdGlvbiwgU2V0dGluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvU2V0dGluZ3NTZXJ2aWNlJztcblxuY2xhc3MgU2V0dGluZ3NDaGFuZ2VkRXZlbnQgZXh0ZW5kcyBUYWJsZWF1RXZlbnQgaW1wbGVtZW50cyBDb250cmFjdC5TZXR0aW5nc0NoYW5nZWRFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9uZXdTZXR0aW5nczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSkge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuU2V0dGluZ3NDaGFuZ2VkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmV3U2V0dGluZ3MoKTogU2V0dGluZ3NDb2xsZWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fbmV3U2V0dGluZ3M7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIFNldHRpbmdzSW1wbCB7XG4gIHByaXZhdGUgc3RhdGljIEFTWU5DX1NBVkVfSU5fUFJPR1JFU1MgPSAnQXN5bmMgU2F2ZSBpcyBpbiBwcm9ncmVzcywgdXBkYXRpbmcgc2V0dGluZ3MgaXMgbm90IGFsbG93ZWQuJztcbiAgcHJpdmF0ZSBfaXNNb2RpZmllZDogYm9vbGVhbjtcbiAgcHJpdmF0ZSBfY3VycmVudFNldHRpbmdzOiBTZXR0aW5nc0NvbGxlY3Rpb247XG5cbiAgLy8gU2luY2UgcHJvbWlzZXMgY2FuJ3QgYmUgaW50cm9zcGVjdGVkIGZvciBzdGF0ZSwga2VlcCBhIHZhcmlhYmxlIHRoYXRcbiAgLy8gaW5kaWNhdGVzIGEgc2F2ZSBpcyBpbiBwcm9ncmVzcywgc28gdGhhdCBzZXQvZXJhc2UgY2FuJ3QgYmUgY2FsbGVkIGR1cmluZyBhIHNhdmUuXG4gIHByaXZhdGUgX3NhdmVJblByb2dyZXNzID0gZmFsc2U7XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHNldHRpbmdzSW5mbzogRXh0ZW5zaW9uU2V0dGluZ3NJbmZvKSB7XG4gICAgdGhpcy5pbml0aWFsaXplU2V0dGluZ3Moc2V0dGluZ3NJbmZvKTtcbiAgfVxuXG4gIHB1YmxpYyBlcmFzZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoa2V5LCAna2V5Jyk7XG5cbiAgICAvLyBPbmx5IG1ha2UgYSBtb2RpZmljYXRpb24gaWYgd2UgaGF2ZSB0aGUga2V5IGFscmVhZHlcbiAgICBpZiAodGhpcy5fY3VycmVudFNldHRpbmdzW2tleV0pIHtcbiAgICAgIHRoaXMudmVyaWZ5U2V0dGluZ3NBcmVVbmxvY2tlZCgpO1xuXG4gICAgICBkZWxldGUgdGhpcy5fY3VycmVudFNldHRpbmdzW2tleV07XG4gICAgICB0aGlzLl9pc01vZGlmaWVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0KGtleTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKGtleSwgJ2tleScpO1xuXG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldO1xuICB9XG5cbiAgcHVibGljIGdldEFsbCgpOiBTZXR0aW5nc0NvbGxlY3Rpb24ge1xuICAgIC8vIFJldHVybnMgYSBtdXRhYmxlIGNvcHkgb2YgdGhlIHNldHRpbmdzXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2N1cnJlbnRTZXR0aW5ncyk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzTW9kaWZpZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzTW9kaWZpZWQ7XG4gIH1cblxuICBwdWJsaWMgc2F2ZUFzeW5jKCk6IFByb21pc2U8U2V0dGluZ3NDb2xsZWN0aW9uPiB7XG4gICAgdGhpcy52ZXJpZnlTZXR0aW5nc0FyZVVubG9ja2VkKCk7XG5cbiAgICAvLyBKdXN0IHJlc29sdmUgaW1tZWRpYXRlbHkgaWYgc2V0dGluZ3MgYXJlIHVuY2hhbmdlZFxuICAgIGlmICghdGhpcy5faXNNb2RpZmllZCkge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZTxTZXR0aW5nc0NvbGxlY3Rpb24+KHRoaXMuX2N1cnJlbnRTZXR0aW5ncyk7XG4gICAgfVxuXG4gICAgdGhpcy5fc2F2ZUluUHJvZ3Jlc3MgPSB0cnVlO1xuXG4gICAgLy8gVXNlIHRoZSBzZXR0aW5ncyBzZXJ2aWNlIHRvIHNhdmUgc2V0dGluZ3MgdG8gdHdiXG4gICAgY29uc3Qgc2V0dGluZ3NTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxTZXR0aW5nc1NlcnZpY2U+KFxuICAgICAgRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5TZXR0aW5nc1NlcnZpY2UsXG4gICAgKTtcblxuICAgIHJldHVybiBzZXR0aW5nc1NlcnZpY2Uuc2F2ZVNldHRpbmdzQXN5bmModGhpcy5fY3VycmVudFNldHRpbmdzKS50aGVuPFNldHRpbmdzQ29sbGVjdGlvbj4oXG4gICAgICAobmV3U2V0dGluZ3MpID0+IHtcbiAgICAgICAgdGhpcy5fc2F2ZUluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5faXNNb2RpZmllZCA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5fY3VycmVudFNldHRpbmdzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICB0aGlzLl9jdXJyZW50U2V0dGluZ3MgPSBuZXdTZXR0aW5ncztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMuX2N1cnJlbnRTZXR0aW5ncywgbmV3U2V0dGluZ3MpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdTZXR0aW5ncztcbiAgICAgIH0sXG4gICAgICAocmVhc29uKSA9PiB7XG4gICAgICAgIHRoaXMuX3NhdmVJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChyZWFzb24pO1xuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlTdHJpbmdQYXJhbWV0ZXIoa2V5LCAna2V5Jyk7IC8vIEtleSBzaG91bGRuJ3QgYmUgYW4gZW1wdHkgc3RyaW5nLlxuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIodmFsdWUsICd2YWx1ZScpOyAvLyBFbXB0eSBzdHJpbmcgdmFsdWUgaXMgYWxsb3dlZC5cbiAgICB0aGlzLnZlcmlmeVNldHRpbmdzQXJlVW5sb2NrZWQoKTtcblxuICAgIHRoaXMuX2N1cnJlbnRTZXR0aW5nc1trZXldID0gdmFsdWU7XG4gICAgdGhpcy5faXNNb2RpZmllZCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXMgYWxsIGV2ZW50cyByZWxldmFudCB0byBzZXR0aW5ncyBvYmplY3QuICBUaGlzIGlzIG9ubHkgYSBzZXR0aW5nc1VwZGF0ZSBldmVudCBjdXJyZW50bHkuXG4gICAqXG4gICAqIEByZXR1cm5zIHtBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+fSBDb2xsZWN0aW9uIG9mIGV2ZW50IG1hbmFnZXJzIHRvIHBhc3MgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXIuXG4gICAqL1xuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cygpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcbiAgICBsZXQgbm90aWZpY2F0aW9uU2VydmljZTogTm90aWZpY2F0aW9uU2VydmljZTtcblxuICAgIHRyeSB7XG4gICAgICBub3RpZmljYXRpb25TZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxOb3RpZmljYXRpb25TZXJ2aWNlPihTZXJ2aWNlTmFtZXMuTm90aWZpY2F0aW9uKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIHRoaXMgc2VydmljZSByZWdpc3RlcmVkLCBqdXN0IHJldHVyblxuICAgICAgcmV0dXJuIHJlc3VsdHM7XG4gICAgfVxuXG4gICAgY29uc3Qgc2V0dGluZ3NDaGFuZ2VkRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxTZXR0aW5nc0NoYW5nZWRFdmVudD4oQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5TZXR0aW5nc0NoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuU2V0dGluZ3NDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudDogU2V0dGluZ3NFdmVudCkgPT4ge1xuICAgICAgICB0aGlzLl9jdXJyZW50U2V0dGluZ3MgPSBldmVudC5uZXdTZXR0aW5ncyA/PyB7fTtcbiAgICAgICAgc2V0dGluZ3NDaGFuZ2VkRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBTZXR0aW5nc0NoYW5nZWRFdmVudChldmVudC5uZXdTZXR0aW5ncykpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKHNldHRpbmdzQ2hhbmdlZEV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplU2V0dGluZ3Moc2V0dGluZ3NJbmZvOiBFeHRlbnNpb25TZXR0aW5nc0luZm8pOiB2b2lkIHtcbiAgICBFcnJvckhlbHBlcnMudmVyaWZ5UGFyYW1ldGVyKHNldHRpbmdzSW5mbywgJ3NldHRpbmdzSW5mbycpO1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlQYXJhbWV0ZXIoc2V0dGluZ3NJbmZvLnNldHRpbmdzVmFsdWVzLCAnc2V0dGluZ3NJbmZvLlNldHRpbmdzVmFsdWVzJyk7XG5cbiAgICB0aGlzLl9jdXJyZW50U2V0dGluZ3MgPSBzZXR0aW5nc0luZm8uc2V0dGluZ3NWYWx1ZXM7XG5cbiAgICAvLyBSZXNldCB0aGUgaXNNb2RpZmllZCBmbGFnXG4gICAgdGhpcy5faXNNb2RpZmllZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaGVscGVyIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIGFueSBsb2NhbCB1cGRhdGUgdG8gdGhpcy5jdXJyZW50U2V0dGluZ3MuXG4gICAqIENoZWNrcyBpZiBhIGN1cnJlbnQgc2F2ZSBjYWxsIGlzIHN0aWxsIGluIHByb2dyZXNzIGFuZCB0aHJvd3MgYW4gZXJyb3IgaWYgc28uXG4gICAqL1xuICBwcml2YXRlIHZlcmlmeVNldHRpbmdzQXJlVW5sb2NrZWQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuX3NhdmVJblByb2dyZXNzKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LkVycm9yQ29kZXMuU2V0dGluZ1NhdmVJblByb2dyZXNzLCBTZXR0aW5nc0ltcGwuQVNZTkNfU0FWRV9JTl9QUk9HUkVTUyk7XG4gICAgfVxuICB9XG59XG4iLCJpbXBvcnQgeyBNb2RlbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5cbmV4cG9ydCBjb25zdCBUYWJsZWF1Qm9va0ZvbnRGYW1pbHlOYW1lID0gJ1RhYmxlYXUgQm9vayc7XG5leHBvcnQgY29uc3QgVGFibGVhdUxpZ2h0Rm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBMaWdodCc7XG5leHBvcnQgY29uc3QgVGFibGVhdVJlZ3VsYXJGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IFJlZ3VsYXInO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVNZWRpdW1Gb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IE1lZGl1bSc7XG5leHBvcnQgY29uc3QgVGFibGVhdVNlbWlib2xkRm9udEZhbWlseU5hbWUgPSAnVGFibGVhdSBTZW1pYm9sZCc7XG5leHBvcnQgY29uc3QgVGFibGVhdUJvbGRGb250RmFtaWx5TmFtZSA9ICdUYWJsZWF1IEJvbGQnO1xuXG5leHBvcnQgY29uc3QgVGFibGVhdUJvb2tGb250RmFjZU5hbWUgPSAnVGFibGVhdSBCb29rJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1Qm9sZEZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IEJvbGQnO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVMaWdodEZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IExpZ2h0JztcbmV4cG9ydCBjb25zdCBUYWJsZWF1TWVkaXVtRm9udEZhY2VOYW1lID0gJ1RhYmxlYXUgTWVkaXVtJztcbmV4cG9ydCBjb25zdCBUYWJsZWF1UmVndWxhckZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IFJlZ3VsYXInO1xuZXhwb3J0IGNvbnN0IFRhYmxlYXVTZW1pQm9sZEZvbnRGYWNlTmFtZSA9ICdUYWJsZWF1IFNlbWkgQm9sZCc7XG5cbmV4cG9ydCBjb25zdCBTdXBwb3J0ZWRUYWJsZWF1Rm9udEZhY2VzOiBNb2RlbFtdID0gW1xuICBUYWJsZWF1Qm9va0ZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdUJvbGRGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVMaWdodEZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdU1lZGl1bUZvbnRGYWNlTmFtZSxcbiAgVGFibGVhdVJlZ3VsYXJGb250RmFjZU5hbWUsXG4gIFRhYmxlYXVTZW1pQm9sZEZvbnRGYWNlTmFtZSxcbl07XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRW1iZWRkaW5nRXJyb3JDb2RlcywgRXJyb3JDb2RlcywgU2hhcmVkRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEaWFsb2dNZXNzYWdlRXZlbnQgYXMgRGlhbG9nTWVzc2FnZUV2ZW50Q29udHJhY3QsIERpYWxvZ1VwZGF0ZUV2ZW50LCBOb3RpZmljYXRpb25JZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnksXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIFNlcnZpY2VOYW1lcyxcbiAgU2luZ2xlRXZlbnRNYW5hZ2VyLFxuICBTaW5nbGVFdmVudE1hbmFnZXJJbXBsLFxuICBUYWJsZWF1RXJyb3IsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVGFibGVhdUV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1RhYmxlYXVFdmVudCc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vU2VydmljZXMvRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zUmVnaXN0cnlJZCB9IGZyb20gJy4uL1NlcnZpY2VzL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuaW1wb3J0IHsgVUlTZXJ2aWNlIH0gZnJvbSAnLi4vU2VydmljZXMvVUlTZXJ2aWNlJztcblxuZXhwb3J0IGNsYXNzIERpYWxvZ01lc3NhZ2VFdmVudCBleHRlbmRzIFRhYmxlYXVFdmVudCBpbXBsZW1lbnRzIENvbnRyYWN0LkRpYWxvZ01lc3NhZ2VFdmVudCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihcbiAgICBwdWJsaWMgcmVhZG9ubHkgbWVzc2FnZTogc3RyaW5nLFxuICAgIHB1YmxpYyByZWFkb25seSBzb3VyY2VEaWFsb2dVcmw/OiBzdHJpbmcsXG4gICkge1xuICAgIHN1cGVyKENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuRGlhbG9nTWVzc2FnZVJlY2VpdmVkKTtcbiAgfVxufVxuXG4vKipcbiAqIEN1c3RvbSBlcnJvciBjbGFzcyB0aGF0IGV4dGVuZHMgdGhlIFRhYmxlYXVFcnJvciBvYmplY3QuXG4gKiBJbmNsdWRlcyBjb250ZXh0IGZvciB3aGljaCBkaWFsb2cgY2F1c2VkIHRoZSBleGNlcHRpb24gdmlhIGl0cyB1cmwuXG4gKi9cbmV4cG9ydCBjbGFzcyBUYWJsZWF1RGlhbG9nRXJyb3IgZXh0ZW5kcyBUYWJsZWF1RXJyb3Ige1xuICBwdWJsaWMgY29uc3RydWN0b3IoX2Vycm9yQ29kZTogRXJyb3JDb2RlcyB8IEVtYmVkZGluZ0Vycm9yQ29kZXMgfCBTaGFyZWRFcnJvckNvZGVzLCBtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBzdXBlcihfZXJyb3JDb2RlLCBtZXNzYWdlKTtcblxuICAgIC8qdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0LXdpa2kvYmxvYi9tYXN0ZXIvQnJlYWtpbmctQ2hhbmdlcy5tZCNleHRlbmRpbmctYnVpbHQtaW5zLWxpa2UtZXJyb3ItYXJyYXktYW5kLW1hcC1tYXktbm8tbG9uZ2VyLXdvcmtcbiAgICAvLyBFcnJvciBpbmhlcml0YW5jZSBkb2VzIG5vdCB3b3JrIHByb3BlcnRseSB3aGVuIGNvbXBpbGluZyB0byBFUzUsIHRoaXMgaXMgYSB3b3JrYXJvdW5kIHRvIGZvcmNlXG4gICAgLy8gdGhlIHByb3RvIGNoYWluIHRvIGJlIGJ1aWx0IGNvcnJlY3RseS4gIFNlZSB0aGUgZ2l0aHViIGxpbmsgYWJvdmUgZm9yIGRldGFpbHMuXG4gICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsIFRhYmxlYXVEaWFsb2dFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBVSUltcGwge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIHJlYWRvbmx5IGlzRXh0ZW5zaW9uRGlhbG9nOiBib29sZWFuKSB7fVxuXG4gIHB1YmxpYyBkaXNwbGF5RGlhbG9nQXN5bmModXJsOiBzdHJpbmcsIHBheWxvYWQ/OiBzdHJpbmcsIG9wdGlvbnM/OiBDb250cmFjdC5EaWFsb2dPcHRpb25zKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCB1aVNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPFVJU2VydmljZT4oRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5VSVNlcnZpY2UpO1xuICAgIGNvbnN0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFxuICAgICAgU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbixcbiAgICApO1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHVpU2VydmljZVxuICAgICAgICAuZGlzcGxheURpYWxvZ0FzeW5jKHVybCwgcGF5bG9hZCB8fCAnJywgdGhpcy5pc0V4dGVuc2lvbkRpYWxvZywgb3B0aW9ucylcbiAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHVucmVnaXN0ZXJGbiA9IG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgICAgICAgTm90aWZpY2F0aW9uSWQuRXh0ZW5zaW9uRGlhbG9nVXBkYXRlLFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBMZXQgdGhyb3VnaCBhbnkgZGlhbG9nIHVwZGF0ZSBldmVudFxuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAoZXZlbnQ6IERpYWxvZ1VwZGF0ZUV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChldmVudC5pc0Nsb3NlRXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuY2xvc2VQYXlsb2FkID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUYWJsZWF1RGlhbG9nRXJyb3IoQ29udHJhY3QuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnY2xvc2VQYXlsb2FkIGlzIHVuZGVmaW5lZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXNvbHZlKGV2ZW50LmNsb3NlUGF5bG9hZCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBUYWJsZWF1RGlhbG9nRXJyb3IoRXJyb3JDb2Rlcy5EaWFsb2dDbG9zZWRCeVVzZXIsICdFeHRlbnNpb24gZGlhbG9nIGNsb3NlZCBieSB1c2VyLicpKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIHVucmVnaXN0ZXJGbigpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgc2VuZERpYWxvZ01lc3NhZ2VBc3luYyhtZXNzYWdlOiBzdHJpbmcsIHRhcmdldERpYWxvZ1VybD86IHN0cmluZykge1xuICAgIGNvbnN0IHVpU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8VUlTZXJ2aWNlPihFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZSk7XG5cbiAgICB1aVNlcnZpY2Uuc2VuZERpYWxvZ01lc3NhZ2VBc3luYyhtZXNzYWdlLCB0YXJnZXREaWFsb2dVcmwpO1xuICB9XG5cbiAgcHVibGljIHNlbmREaWFsb2dNZXNzYWdlVG9QYXJlbnRBc3luYyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuaXNFeHRlbnNpb25EaWFsb2cpIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCAnc2VuZERpYWxvZ01lc3NhZ2VUb1BhcmVudEFzeW5jIGNhbiBvbmx5IGJlIGNhbGxlZCBmcm9tIGFuIGV4dGVuc2lvbiBkaWFsb2cuJyk7XG4gICAgfVxuXG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcblxuICAgIHVpU2VydmljZS5zZW5kRGlhbG9nTWVzc2FnZVRvUGFyZW50QXN5bmMobWVzc2FnZSk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VEaWFsb2cocGF5bG9hZD86IHN0cmluZywgZGlhbG9nVXJsPzogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgdWlTZXJ2aWNlID0gQXBpU2VydmljZVJlZ2lzdHJ5LmdldChFeHRlbnNpb25zUmVnaXN0cnlJZCkuZ2V0U2VydmljZTxVSVNlcnZpY2U+KEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMuVUlTZXJ2aWNlKTtcblxuICAgIHVpU2VydmljZS5jbG9zZURpYWxvZyhwYXlsb2FkLCBkaWFsb2dVcmwpO1xuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVzIGFsbCBldmVudHMgcmVsZXZhbnQgdG8gVUkgb2JqZWN0LlxuICAgKlxuICAgKiBAcmV0dXJucyB7QXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPn0gQ29sbGVjdGlvbiBvZiBldmVudCBtYW5hZ2VycyB0byBwYXNzIHRvIGFuIEV2ZW50TGlzdGVuZXJNYW5hZ2VyLlxuICAgKi9cbiAgcHVibGljIGluaXRpYWxpemVFdmVudHMoKTogQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPiB7XG4gICAgY29uc3QgcmVzdWx0cyA9IG5ldyBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+KCk7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2U7XG5cbiAgICB0cnkge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIHNlcnZpY2UgcmVnaXN0ZXJlZCwganVzdCByZXR1cm5cbiAgICAgIHJldHVybiByZXN1bHRzO1xuICAgIH1cblxuICAgIGNvbnN0IGRpYWxvZ01lc3NhZ2VFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPENvbnRyYWN0LkRpYWxvZ01lc3NhZ2VFdmVudD4oQ29udHJhY3QuVGFibGVhdUV2ZW50VHlwZS5EaWFsb2dNZXNzYWdlUmVjZWl2ZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuRXh0ZW5zaW9uRGlhbG9nTWVzc2FnZSxcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXZlbnQ6IERpYWxvZ01lc3NhZ2VFdmVudENvbnRyYWN0KSA9PiB7XG4gICAgICAgIGRpYWxvZ01lc3NhZ2VFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IERpYWxvZ01lc3NhZ2VFdmVudChldmVudC5tZXNzYWdlLCBldmVudC5zb3VyY2VEaWFsb2dVcmwpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIHJlc3VsdHMucHVzaChkaWFsb2dNZXNzYWdlRXZlbnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBEYXNoYm9hcmRMYXlvdXRDaGFuZ2VEZXRhaWxzLCBUYWJsZWF1RXZlbnRUeXBlLCBXb3JrYm9va0Zvcm1hdHRpbmcgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkTGF5b3V0RXZlbnQsIE5vdGlmaWNhdGlvbklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeSxcbiAgRGFzaGJvYXJkSW1wbCxcbiAgRGFzaGJvYXJkT2JqZWN0SW1wbCxcbiAgTm90aWZpY2F0aW9uU2VydmljZSxcbiAgU2VydmljZU5hbWVzLFxuICBTaW5nbGVFdmVudE1hbmFnZXIsXG4gIFNpbmdsZUV2ZW50TWFuYWdlckltcGwsXG4gIFdvcmtzaGVldEltcGwsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL0Rhc2hib2FyZExheW91dENoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBXb3JrYm9va0Zvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgfSBmcm9tICcuLi9FdmVudHMvV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50JztcbmltcG9ydCB7IEV4dGVuc2lvbnNSZWdpc3RyeUlkIH0gZnJvbSAnLi4vU2VydmljZXMvU2VydmljZVJlZ2lzdHJ5VXRpbCc7XG5pbXBvcnQgeyBEYXNoYm9hcmRPYmplY3QgfSBmcm9tICcuL0Rhc2hib2FyZE9iamVjdCc7XG5pbXBvcnQgeyBTaGVldCB9IGZyb20gJy4vU2hlZXQnO1xuaW1wb3J0IHsgV29ya3NoZWV0IH0gZnJvbSAnLi9Xb3Jrc2hlZXQnO1xuXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkIGV4dGVuZHMgU2hlZXQgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGFzaGJvYXJkSW1wbDogRGFzaGJvYXJkSW1wbCkge1xuICAgIHN1cGVyKF9kYXNoYm9hcmRJbXBsKTtcbiAgICBfZGFzaGJvYXJkSW1wbC5pbml0aWFsaXplV2l0aFB1YmxpY0ludGVyZmFjZXMoKTtcbiAgICB0aGlzLmluaXRpYWxpemVFdmVudHMoKS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtzaGVldHMoKTogQXJyYXk8Q29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwud29ya3NoZWV0c0ltcGwubWFwKCh3b3Jrc2hlZXRJbXBsOiBXb3Jrc2hlZXRJbXBsKSA9PiB7XG4gICAgICByZXR1cm4gbmV3IFdvcmtzaGVldCh3b3Jrc2hlZXRJbXBsKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgb2JqZWN0cygpOiBBcnJheTxDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmRPYmplY3Q+IHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5vYmplY3RzLm1hcCgoZGFzaGJvYXJkT2JqZWN0SW1wbDogRGFzaGJvYXJkT2JqZWN0SW1wbCkgPT4ge1xuICAgICAgcmV0dXJuIG5ldyBEYXNoYm9hcmRPYmplY3QoZGFzaGJvYXJkT2JqZWN0SW1wbCk7XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZURhc2hib2FyZE9iamVjdElkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuYWN0aXZlRGFzaGJvYXJkT2JqZWN0SWQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFjdGl2ZURhc2hib2FyZE5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkSW1wbC5hY3RpdmVEYXNoYm9hcmROYW1lO1xuICB9XG5cbiAgcHVibGljIHNldFpvbmVWaXNpYmlsaXR5QXN5bmMoem9uZVZpc2liaWxpdHlNYXA6IENvbnRyYWN0LlpvbmVWaXNpYmlsaXR5TWFwKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuc2V0RGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eUFzeW5jKHpvbmVWaXNpYmlsaXR5TWFwKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXREYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5QXN5bmMoZGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcDogQ29udHJhY3QuRGFzaGJvYXJkT2JqZWN0VmlzaWJpbGl0eU1hcCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLnNldERhc2hib2FyZE9iamVjdFZpc2liaWxpdHlBc3luYyhkYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5TWFwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXREYXNoYm9hcmRPYmplY3RCeUlkKGRhc2hib2FyZE9iamVjdElkOiBudW1iZXIpOiBEYXNoYm9hcmRPYmplY3QgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHpvbmUgPSB0aGlzLl9kYXNoYm9hcmRJbXBsLmdldERhc2hib2FyZE9iamVjdEJ5SWQoZGFzaGJvYXJkT2JqZWN0SWQpO1xuICAgIHJldHVybiB6b25lICYmIG5ldyBEYXNoYm9hcmRPYmplY3Qoem9uZSk7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZUV2ZW50cygpOiBBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+IHtcbiAgICBjb25zdCByZXN1bHRzID0gbmV3IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4oKTtcblxuICAgIC8vIEluaXRpYWxpemluZyBldmVudHMgYW5kIHJlZ2lzdGVyaW5nIG5vdGlmaWNhdGlvbiBzZXJ2aWNlXG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcnZpY2U6IE5vdGlmaWNhdGlvblNlcnZpY2U7XG5cbiAgICB0cnkge1xuICAgICAgbm90aWZpY2F0aW9uU2VydmljZSA9IEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLmdldFNlcnZpY2U8Tm90aWZpY2F0aW9uU2VydmljZT4oU2VydmljZU5hbWVzLk5vdGlmaWNhdGlvbik7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSB0aGlzIHNlcnZpY2UgcmVnaXN0ZXJlZCwganVzdCByZXR1cm4gKGFsbG93cyB1bml0IHRlc3Rpbmcgd2l0aG91dCBOb3RpZmljYXRpb25TZXJ2aWNlIG1vY2spXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICBjb25zdCBkYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxEYXNoYm9hcmRMYXlvdXRDaGFuZ2VkRXZlbnQ+KFRhYmxlYXVFdmVudFR5cGUuRGFzaGJvYXJkTGF5b3V0Q2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5EYXNoYm9hcmRMYXlvdXRDaGFuZ2VkLFxuICAgICAgKCkgPT4gdHJ1ZSxcbiAgICAgIChldmVudDogRGFzaGJvYXJkTGF5b3V0RXZlbnQpID0+IHtcbiAgICAgICAgY29uc3QgZGFzaGJvYXJkT2JqZWN0Q2hhbmdlczogRGFzaGJvYXJkTGF5b3V0Q2hhbmdlRGV0YWlscyA9IHRoaXMuX2Rhc2hib2FyZEltcGwudXBkYXRlWm9uZXMoXG4gICAgICAgICAgZXZlbnQuem9uZXMsXG4gICAgICAgICAgZXZlbnQuYWN0aXZlWm9uZUlkLFxuICAgICAgICAgIGV2ZW50LmFjdGl2ZURhc2hib2FyZE5hbWUsXG4gICAgICAgICk7XG4gICAgICAgIGRhc2hib2FyZExheW91dENoYW5nZWRFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IERhc2hib2FyZExheW91dENoYW5nZWRFdmVudChkYXNoYm9hcmRPYmplY3RDaGFuZ2VzKSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2goZGFzaGJvYXJkTGF5b3V0Q2hhbmdlZEV2ZW50KTtcblxuICAgIGNvbnN0IHdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPFdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudD4oXG4gICAgICBUYWJsZWF1RXZlbnRUeXBlLldvcmtib29rRm9ybWF0dGluZ0NoYW5nZWQsXG4gICAgKTtcblxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZCxcbiAgICAgICgpID0+IHRydWUsXG4gICAgICAoZXZlbnRGb3JtYXR0aW5nOiBXb3JrYm9va0Zvcm1hdHRpbmcpID0+IHtcbiAgICAgICAgd29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50LnRyaWdnZXJFdmVudCgoKSA9PiBuZXcgV29ya2Jvb2tGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50KGV2ZW50Rm9ybWF0dGluZykpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKHdvcmtib29rRm9ybWF0dGluZ0NoYW5nZWRFdmVudCk7XG5cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlQW5kUmVzaXplRGFzaGJvYXJkT2JqZWN0c0FzeW5jKFxuICAgIGRhc2hib2FyZE9iamVjdFBvc2l0aW9uQW5kU2l6ZVVwZGF0ZUFycmF5OiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSxcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwubW92ZUFuZFJlc2l6ZURhc2hib2FyZE9iamVjdHNBc3luYyhkYXNoYm9hcmRPYmplY3RQb3NpdGlvbkFuZFNpemVVcGRhdGVBcnJheSk7XG4gIH1cblxuICBwdWJsaWMgcmVwbGF5QW5pbWF0aW9uQXN5bmMocmVwbGF5U3BlZWQ6IENvbnRyYWN0LlJlcGxheVNwZWVkVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLnJlcGxheUFuaW1hdGlvbkFzeW5jKHJlcGxheVNwZWVkKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRGaWx0ZXJzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5GaWx0ZXI+PiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZEltcGwuZ2V0RmlsdGVyc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRJbXBsLmFwcGx5RmlsdGVyQXN5bmMoZmllbGROYW1lLCB2YWx1ZXMsIHVwZGF0ZVR5cGUsIG9wdGlvbnMpO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkT2JqZWN0SW1wbCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgRGFzaGJvYXJkIH0gZnJvbSAnLi9EYXNoYm9hcmQnO1xuaW1wb3J0IHsgV29ya3NoZWV0IH0gZnJvbSAnLi9Xb3Jrc2hlZXQnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBkYXNoYm9hcmQgb2JqZWN0cyAtIHRoZSB6b25lcyBpbiBhIGRhc2hib2FyZC5cbiAqL1xuZXhwb3J0IGNsYXNzIERhc2hib2FyZE9iamVjdCBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZE9iamVjdCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kYXNoYm9hcmRPYmplY3RJbXBsOiBEYXNoYm9hcmRPYmplY3RJbXBsKSB7fVxuXG4gIHB1YmxpYyBnZXQgZGFzaGJvYXJkKCk6IENvbnRyYWN0LkV4dGVuc2lvbkRhc2hib2FyZCB7XG4gICAgcmV0dXJuIG5ldyBEYXNoYm9hcmQodGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5kYXNoYm9hcmRJbXBsKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdHlwZSgpOiBDb250cmFjdC5EYXNoYm9hcmRPYmplY3RUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC50eXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBwb3NpdGlvbigpOiBDb250cmFjdC5Qb2ludCB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwucG9zaXRpb247XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNpemUoKTogQ29udHJhY3QuU2l6ZSB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuc2l6ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCB8IHVuZGVmaW5lZCB7XG4gICAgaWYgKHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwud29ya3NoZWV0SW1wbCkge1xuICAgICAgcmV0dXJuIG5ldyBXb3Jrc2hlZXQodGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC53b3Jrc2hlZXRJbXBsKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgbmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGlzRmxvYXRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2Rhc2hib2FyZE9iamVjdEltcGwuaXNGbG9hdGluZztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNWaXNpYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmlzVmlzaWJsZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkT2JqZWN0SW1wbC5pZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZmllbGRJZCgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLl9kYXNoYm9hcmRPYmplY3RJbXBsLmZpZWxkSWQ7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25JZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQge1xuICBBcGlTZXJ2aWNlUmVnaXN0cnksXG4gIEVycm9ySGVscGVycyxcbiAgRXZlbnRMaXN0ZW5lck1hbmFnZXIsXG4gIE5vdGlmaWNhdGlvblNlcnZpY2UsXG4gIFBhcmFtZXRlckltcGwsXG4gIFNlcnZpY2VOYW1lcyxcbiAgU2luZ2xlRXZlbnRNYW5hZ2VyLFxuICBTaW5nbGVFdmVudE1hbmFnZXJJbXBsLFxufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFBhcmFtZXRlckNoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9QYXJhbWV0ZXJDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgUGFyYW1ldGVyIGNvbnRyYWN0LiBDYWxscyBkb3duIHRvIHRoZSBpbXBsXG4gKiBjbGFzcyBmb3IgYWxtb3N0IGFsbCBvZiB0aGUgd29yayBpdCBkb2VzLlxuICovXG5leHBvcnQgY2xhc3MgUGFyYW1ldGVyIGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBDb250cmFjdC5QYXJhbWV0ZXIge1xuICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBwYXJhbWV0ZXJJbXBsOiBQYXJhbWV0ZXJJbXBsLFxuICAgIHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCxcbiAgKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEluaXRpYWxpemUgb3VyIGV2ZW50IGhhbmRsaW5nIGZvciB0aGlzIGNsYXNzXG4gICAgdGhpcy5pbml0aWFsaXplRXZlbnRzKHNoZWV0KS5mb3JFYWNoKChlKSA9PiB0aGlzLmFkZE5ld0V2ZW50VHlwZShlKSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGN1cnJlbnRWYWx1ZSgpOiBDb250cmFjdC5EYXRhVmFsdWUge1xuICAgIHJldHVybiB0aGlzLnBhcmFtZXRlckltcGwuY3VycmVudFZhbHVlO1xuICB9XG5cbiAgcHVibGljIGdldCBkYXRhVHlwZSgpOiBDb250cmFjdC5EYXRhVHlwZSB7XG4gICAgcmV0dXJuIHRoaXMucGFyYW1ldGVySW1wbC5kYXRhVHlwZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgYWxsb3dhYmxlVmFsdWVzKCk6IENvbnRyYWN0LlBhcmFtZXRlckRvbWFpblJlc3RyaWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmFsbG93YWJsZVZhbHVlcztcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmlkO1xuICB9XG5cbiAgcHVibGljIGNoYW5nZVZhbHVlQXN5bmMobmV3VmFsdWU6IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBEYXRlKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVmFsdWU+IHtcbiAgICByZXR1cm4gdGhpcy5wYXJhbWV0ZXJJbXBsLmNoYW5nZVZhbHVlQXN5bmMobmV3VmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2Qgd2hpY2ggZ29lcyB0aHJvdWdoIGFuZCByZWdpc3RlcnMgZWFjaCBldmVudCB0eXBlIHRoaXMgaW1wbCBrbm93cyBhYm91dFxuICAgKiB3aXRoIHRoZSBOb3RpZmljYXRpb25TZXJ2aWNlLiBJdCByZXR1cm5zIGFuIGFycmF5IG9mIFNpbmdsZUV2ZW50TWFuYWdlciBvYmplY3RzIHdoaWNoXG4gICAqIGNhbiB0aGVuIGJlIHBhc3NlZCB0byBhbiBFdmVudExpc3RlbmVyTWFuYWdlciB0byBoYW5kbGUgdXNlciByZWdpc3RyYXRpb24gLyB1bnJlZ2lzdHJhdGlvbi5cbiAgICpcbiAgICogQHBhcmFtIHNoZWV0IFRoZSBzaGVldCBvYmplY3Qgd2hpY2ggd2lsbCBiZSBpbmNsdWRlZCB3aXRoIHRoZSBldmVudCBub3RpZmljYXRpb25zXG4gICAqIEByZXR1cm5zIHtBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+fSBDb2xsZWN0aW9uIG9mIGV2ZW50IG1hbmFnZXJzIHRvIHBhc3MgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXJcbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKHNoZWV0OiBDb250cmFjdC5FeHRlbnNpb25TaGVldCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlJbnRlcm5hbFZhbHVlKHNoZWV0LCAnc2hlZXQnKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIGFsbCBvZiB0aGUgZXZlbnQgbWFuYWdlcnMgd2UnbGwgbmVlZCAob25lIGZvciBlYWNoIGV2ZW50IHR5cGUpXG4gICAgY29uc3QgcGFyYW1ldGVyRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxQYXJhbWV0ZXJDaGFuZ2VkRXZlbnQ+KENvbnRyYWN0LlRhYmxlYXVFdmVudFR5cGUuUGFyYW1ldGVyQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5QYXJhbWV0ZXJDaGFuZ2VkLFxuICAgICAgKG1vZGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IGZpZWxkTmFtZSA9IG1vZGVsIGFzIHN0cmluZztcbiAgICAgICAgcmV0dXJuIGZpZWxkTmFtZSA9PT0gdGhpcy5wYXJhbWV0ZXJJbXBsLmlkO1xuICAgICAgfSxcbiAgICAgIChmaWVsZE5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICBwYXJhbWV0ZXJFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IFBhcmFtZXRlckNoYW5nZWRFdmVudChmaWVsZE5hbWUsIHNoZWV0KSk7XG4gICAgICB9LFxuICAgICk7XG5cbiAgICByZXN1bHRzLnB1c2gocGFyYW1ldGVyRXZlbnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciwgU2hlZXRJbXBsLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IFBhcmFtZXRlciB9IGZyb20gJy4vUGFyYW1ldGVyJztcblxuZXhwb3J0IGNsYXNzIFNoZWV0IGV4dGVuZHMgRXZlbnRMaXN0ZW5lck1hbmFnZXIgaW1wbGVtZW50cyBDb250cmFjdC5FeHRlbnNpb25TaGVldCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcml2YXRlIF9zaGVldEltcGw6IFNoZWV0SW1wbCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IG5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLm5hbWU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNoZWV0VHlwZSgpOiBDb250cmFjdC5TaGVldFR5cGUge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwuc2hlZXRUeXBlO1xuICB9XG5cbiAgcHVibGljIGdldCBzaXplKCk6IENvbnRyYWN0LlNpemUge1xuICAgIGlmICh0aGlzLmlzVmFsaWRTaXplKHRoaXMuX3NoZWV0SW1wbC5zaXplKSkge1xuICAgICAgcmV0dXJuIHRoaXMuX3NoZWV0SW1wbC5zaXplO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoQ29udHJhY3QuRW1iZWRkaW5nRXJyb3JDb2Rlcy5JbXBsZW1lbnRhdGlvbkVycm9yLCAnU2l6ZSBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIHByaXZhdGUgaXNWYWxpZFNpemUoc2l6ZTogYW55KTogc2l6ZSBpcyBDb250cmFjdC5TaXplIHtcbiAgICBjb25zdCB0ZXN0U2l6ZSA9IHNpemUgYXMgQ29udHJhY3QuU2l6ZTtcbiAgICBpZiAodGVzdFNpemUud2lkdGggIT09IHVuZGVmaW5lZCAmJiB0ZXN0U2l6ZS5oZWlnaHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGZpbmRQYXJhbWV0ZXJBc3luYyhwYXJhbWV0ZXJOYW1lOiBzdHJpbmcpOiBQcm9taXNlPENvbnRyYWN0LlBhcmFtZXRlciB8IHVuZGVmaW5lZD4ge1xuICAgIHJldHVybiB0aGlzLl9zaGVldEltcGwuZmluZFBhcmFtZXRlckFzeW5jKHBhcmFtZXRlck5hbWUpLnRoZW4oKHBhcmFtZXRlckltcGwpID0+IHtcbiAgICAgIGlmIChwYXJhbWV0ZXJJbXBsKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxDb250cmFjdC5QYXJhbWV0ZXI+KChyZXNvbHZlKSA9PiByZXNvbHZlKG5ldyBQYXJhbWV0ZXIocGFyYW1ldGVySW1wbCwgdGhpcykpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZTx1bmRlZmluZWQ+KChyZXNvbHZlKSA9PiByZXNvbHZlKHVuZGVmaW5lZCkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldFBhcmFtZXRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LlBhcmFtZXRlcj4+IHtcbiAgICByZXR1cm4gdGhpcy5fc2hlZXRJbXBsLmdldFBhcmFtZXRlcnNBc3luYygpLnRoZW4oKHBhcmFtZXRlcnNJbXBsKSA9PiB7XG4gICAgICByZXR1cm4gcGFyYW1ldGVyc0ltcGwubWFwKChwYXJhbWV0ZXJJbXBsKSA9PiB7XG4gICAgICAgIHJldHVybiBuZXcgUGFyYW1ldGVyKHBhcmFtZXRlckltcGwsIHRoaXMpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25Xb3JrYm9va0ltcGwgfSBmcm9tICcuLi9JbXBsL0V4dGVuc2lvbldvcmtib29rSW1wbCc7XG5cbmV4cG9ydCBjbGFzcyBXb3JrYm9vayBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbldvcmtib29rIHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3dvcmtib29rSW1wbDogRXh0ZW5zaW9uV29ya2Jvb2tJbXBsKSB7fVxuXG4gIHB1YmxpYyBnZXRBbGxEYXRhU291cmNlc0FzeW5jKCk6IFByb21pc2U8QXJyYXk8Q29udHJhY3QuRGF0YVNvdXJjZT4+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya2Jvb2tJbXBsLmdldEFsbERhdGFTb3VyY2VzQXN5bmMoKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7XG4gIENvbHVtbixcbiAgRmlsdGVyVXBkYXRlVHlwZSxcbiAgU2VsZWN0aW9uVXBkYXRlVHlwZSxcbiAgVGFibGVhdUV2ZW50VHlwZSxcbiAgVG9vbHRpcENvbnRleHQsXG4gIFdvcmtzaGVldEZvcm1hdHRpbmcsXG59IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBGaWx0ZXJFdmVudCwgTm90aWZpY2F0aW9uSWQsIFN1bW1hcnlEYXRhRXZlbnQsIFZpc3VhbElkLCBXb3Jrc2hlZXRGb3JtYXR0aW5nRXZlbnQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHtcbiAgQXBpU2VydmljZVJlZ2lzdHJ5LFxuICBOb3RpZmljYXRpb25TZXJ2aWNlLFxuICBTZXJ2aWNlTmFtZXMsXG4gIFNpbmdsZUV2ZW50TWFuYWdlcixcbiAgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbCxcbiAgVGFibGVhdUVycm9yLFxuICBXb3Jrc2hlZXRJbXBsLFxufSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEZpbHRlckNoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9GaWx0ZXJDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgTWFya3NTZWxlY3RlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL01hcmtzU2VsZWN0ZWRFdmVudCc7XG5pbXBvcnQgeyBTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCB9IGZyb20gJy4uL0V2ZW50cy9TdW1tYXJ5RGF0YUNoYW5nZWRFdmVudCc7XG5pbXBvcnQgeyBXb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50IH0gZnJvbSAnLi4vRXZlbnRzL1dvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuLi9TZXJ2aWNlcy9TZXJ2aWNlUmVnaXN0cnlVdGlsJztcbmltcG9ydCB7IERhc2hib2FyZCB9IGZyb20gJy4vRGFzaGJvYXJkJztcbmltcG9ydCB7IFNoZWV0IH0gZnJvbSAnLi9TaGVldCc7XG5cbmV4cG9ydCBjbGFzcyBXb3Jrc2hlZXQgZXh0ZW5kcyBTaGVldCBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCB7XG4gIHB1YmxpYyBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgX3dvcmtzaGVldEltcGw6IFdvcmtzaGVldEltcGwpIHtcbiAgICBzdXBlcihfd29ya3NoZWV0SW1wbCk7XG5cbiAgICAvLyBDYWxsIHRvIGluaXRpYWxpemUgZXZlbnRzIGFuZCB0aGVuIGNhbGwgZG93biB0byB0aGUgZXZlbnQgbGlzdGVuZXIgbWFuYWdlciB0byBoYW5kbGUgdGhpbmdzXG4gICAgdGhpcy5pbml0aWFsaXplRXZlbnRzKCkuZm9yRWFjaCgoZSkgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGdldCBwYXJlbnREYXNoYm9hcmQoKTogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkIHtcbiAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gZm9yIEV4dGVuc2lvbnMgaWYgdGhlIERhc2hib2FyZEltcGxzIGFyZSBjcmVhdGVkIGNvcnJlY3RseVxuICAgIGlmICh0aGlzLl93b3Jrc2hlZXRJbXBsLnBhcmVudERhc2hib2FyZCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKENvbnRyYWN0LlNoYXJlZEVycm9yQ29kZXMuSW1wbGVtZW50YXRpb25FcnJvciwgYFBhcmVudCBkYXNoYm9hcmQgbm90IGltcGxlbWVudGVkYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEYXNoYm9hcmQodGhpcy5fd29ya3NoZWV0SW1wbC5wYXJlbnREYXNoYm9hcmQpO1xuICB9XG5cbiAgcHVibGljIGdldCBiYWNrZ3JvdW5kQ29sb3IoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5fd29ya3NoZWV0SW1wbC5iYWNrZ3JvdW5kQ29sb3IgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBXb3Jrc2hlZXQgYmFja2dyb3VuZCBjb2xvciBpcyBub3QgYXZhaWxhYmxlYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYmFja2dyb3VuZENvbG9yO1xuICB9XG5cbiAgcHVibGljIGdldCBmb3JtYXR0aW5nKCk6IFdvcmtzaGVldEZvcm1hdHRpbmcge1xuICAgIGlmICh0aGlzLl93b3Jrc2hlZXRJbXBsLmZvcm1hdHRpbmcgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihDb250cmFjdC5TaGFyZWRFcnJvckNvZGVzLkltcGxlbWVudGF0aW9uRXJyb3IsIGBXb3Jrc2hlZXQgZm9ybWF0dGluZyBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZm9ybWF0dGluZztcbiAgfVxuXG4gIC8qKlxuICAgKiBIZWxwZXIgbWV0aG9kIHdoaWNoIGdvZXMgdGhyb3VnaCBhbmQgcmVnaXN0ZXJzIGVhY2ggZXZlbnQgdHlwZSB0aGlzIGltcGwga25vd3MgYWJvdXRcbiAgICogd2l0aCB0aGUgTm90aWZpY2F0aW9uU2VydmljZS4gSXQgcmV0dXJucyBhbiBhcnJheSBvZiBTaW5nbGVFdmVudE1hbmFnZXIgb2JqZWN0cyB3aGljaFxuICAgKiBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXIgdG8gaGFuZGxlIHVzZXIgcmVnaXN0cmF0aW9uIC8gdW5yZWdpc3RyYXRpb24uXG4gICAqXG4gICAqIEBwYXJhbSB7V29ya3NoZWV0fSB3b3Jrc2hlZXQgVGhlIHdvcmtzaGVldCBvYmplY3Qgd2hpY2ggd2lsbCBiZSBpbmNsdWRlZCB3aXRoIHRoZSBldmVudCBub3RpZmljYXRpb25zXG4gICAqIEByZXR1cm5zIHtBcnJheTxTaW5nbGVFdmVudE1hbmFnZXI+fSBDb2xsZWN0aW9uIG9mIGV2ZW50IG1hbmFnZXJzIHRvIHBhc3MgdG8gYW4gRXZlbnRMaXN0ZW5lck1hbmFnZXJcbiAgICovXG4gIHB1YmxpYyBpbml0aWFsaXplRXZlbnRzKCk6IEFycmF5PFNpbmdsZUV2ZW50TWFuYWdlcj4ge1xuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgQXJyYXk8U2luZ2xlRXZlbnRNYW5hZ2VyPigpO1xuICAgIGxldCBub3RpZmljYXRpb25TZXJ2aWNlOiBOb3RpZmljYXRpb25TZXJ2aWNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIG5vdGlmaWNhdGlvblNlcnZpY2UgPSBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5nZXRTZXJ2aWNlPE5vdGlmaWNhdGlvblNlcnZpY2U+KFNlcnZpY2VOYW1lcy5Ob3RpZmljYXRpb24pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGhpcyBzZXJ2aWNlIHJlZ2lzdGVyZWQsIGp1c3QgcmV0dXJuXG4gICAgICByZXR1cm4gcmVzdWx0cztcbiAgICB9XG5cbiAgICAvLyBJbml0aWFsaXplIGFsbCBvZiB0aGUgZXZlbnQgbWFuYWdlcnMgd2UnbGwgbmVlZCAob25lIGZvciBlYWNoIGV2ZW50IHR5cGUpXG4gICAgY29uc3QgbWFya3NFdmVudCA9IG5ldyBTaW5nbGVFdmVudE1hbmFnZXJJbXBsPE1hcmtzU2VsZWN0ZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5NYXJrU2VsZWN0aW9uQ2hhbmdlZCk7XG4gICAgbm90aWZpY2F0aW9uU2VydmljZS5yZWdpc3RlckhhbmRsZXIoXG4gICAgICBOb3RpZmljYXRpb25JZC5TZWxlY3RlZE1hcmtzQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCB2aXN1YWxJZCA9IG1vZGVsIGFzIFZpc3VhbElkO1xuICAgICAgICByZXR1cm4gdGhpcy52aXN1YWxJZHNBcmVFcXVhbCh2aXN1YWxJZCwgdGhpcy5fd29ya3NoZWV0SW1wbC52aXN1YWxJZCk7XG4gICAgICB9LFxuICAgICAgKCkgPT4gbWFya3NFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IE1hcmtzU2VsZWN0ZWRFdmVudCh0aGlzKSksXG4gICAgKTtcblxuICAgIGNvbnN0IGZpbHRlckV2ZW50ID0gbmV3IFNpbmdsZUV2ZW50TWFuYWdlckltcGw8RmlsdGVyQ2hhbmdlZEV2ZW50PihUYWJsZWF1RXZlbnRUeXBlLkZpbHRlckNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuRmlsdGVyQ2hhbmdlZCxcbiAgICAgIChtb2RlbCkgPT4ge1xuICAgICAgICBjb25zdCBmaWx0ZXJFdmVudFJlc3BvbnNlID0gbW9kZWwgYXMgRmlsdGVyRXZlbnQ7XG4gICAgICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnZpc3VhbElkLndvcmtzaGVldCA9PT0gZmlsdGVyRXZlbnRSZXNwb25zZS52aXN1YWxJZC53b3Jrc2hlZXQ7XG4gICAgICB9LFxuICAgICAgKGV2ZW50OiBGaWx0ZXJFdmVudCkgPT4ge1xuICAgICAgICBmaWx0ZXJFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IEZpbHRlckNoYW5nZWRFdmVudCh0aGlzLCBldmVudC5maWVsZE5hbWUsIGV2ZW50LmZpZWxkSWQpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IHN1bW1hcnlEYXRhRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxTdW1tYXJ5RGF0YUNoYW5nZWRFdmVudD4oVGFibGVhdUV2ZW50VHlwZS5TdW1tYXJ5RGF0YUNoYW5nZWQpO1xuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuU3VtbWFyeURhdGFDaGFuZ2VkLFxuICAgICAgKG1vZGVsKSA9PiB7XG4gICAgICAgIGNvbnN0IHN1bW1hcnlEYXRhRXZlbnRSZXNwb25zZSA9IG1vZGVsIGFzIFN1bW1hcnlEYXRhRXZlbnQ7XG4gICAgICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnZpc3VhbElkLndvcmtzaGVldCA9PT0gc3VtbWFyeURhdGFFdmVudFJlc3BvbnNlLnZpc3VhbElkLndvcmtzaGVldDtcbiAgICAgIH0sXG4gICAgICAoZXZlbnQ6IFN1bW1hcnlEYXRhRXZlbnQpID0+IHtcbiAgICAgICAgc3VtbWFyeURhdGFFdmVudC50cmlnZ2VyRXZlbnQoKCkgPT4gbmV3IFN1bW1hcnlEYXRhQ2hhbmdlZEV2ZW50KHRoaXMpKTtcbiAgICAgIH0sXG4gICAgKTtcblxuICAgIGNvbnN0IHdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQgPSBuZXcgU2luZ2xlRXZlbnRNYW5hZ2VySW1wbDxXb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50PihcbiAgICAgIFRhYmxlYXVFdmVudFR5cGUuV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWQsXG4gICAgKTtcblxuICAgIG5vdGlmaWNhdGlvblNlcnZpY2UucmVnaXN0ZXJIYW5kbGVyKFxuICAgICAgTm90aWZpY2F0aW9uSWQuV29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWQsXG4gICAgICAobW9kZWwpID0+IHtcbiAgICAgICAgY29uc3Qgd29ya3NoZWV0Rm9ybWF0dGluZ0NoYW5nZWRFdmVudCA9IG1vZGVsIGFzIFdvcmtzaGVldEZvcm1hdHRpbmdFdmVudDtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwudmlzdWFsSWQud29ya3NoZWV0ID09PSB3b3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50LnZpc3VhbElkLndvcmtzaGVldDtcbiAgICAgIH0sXG4gICAgICAoZXZlbnRGb3JtYXR0aW5nOiBXb3Jrc2hlZXRGb3JtYXR0aW5nKSA9PiB7XG4gICAgICAgIHdvcmtzaGVldEZvcm1hdHRpbmdDaGFuZ2VkRXZlbnQudHJpZ2dlckV2ZW50KCgpID0+IG5ldyBXb3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50KHRoaXMsIGV2ZW50Rm9ybWF0dGluZykpO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmVzdWx0cy5wdXNoKG1hcmtzRXZlbnQpO1xuICAgIHJlc3VsdHMucHVzaChmaWx0ZXJFdmVudCk7XG4gICAgcmVzdWx0cy5wdXNoKHN1bW1hcnlEYXRhRXZlbnQpO1xuICAgIHJlc3VsdHMucHVzaCh3b3Jrc2hlZXRGb3JtYXR0aW5nQ2hhbmdlZEV2ZW50KTtcblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgcHVibGljIGFwcGx5RmlsdGVyQXN5bmMoXG4gICAgZmllbGROYW1lOiBzdHJpbmcsXG4gICAgdmFsdWVzOiBBcnJheTxzdHJpbmc+LFxuICAgIHVwZGF0ZVR5cGU6IEZpbHRlclVwZGF0ZVR5cGUsXG4gICAgb3B0aW9uczogQ29udHJhY3QuRmlsdGVyT3B0aW9ucyxcbiAgKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hcHBseUZpbHRlckFzeW5jKGZpZWxkTmFtZSwgdmFsdWVzLCB1cGRhdGVUeXBlLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseVJhbmdlRmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcsIGZpbHRlck9wdGlvbnM6IENvbnRyYWN0LlJhbmdlRmlsdGVyT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYXBwbHlSYW5nZUZpbHRlckFzeW5jKGZpZWxkTmFtZSwgZmlsdGVyT3B0aW9ucyk7XG4gIH1cblxuICBwdWJsaWMgYXBwbHlIaWVyYXJjaGljYWxGaWx0ZXJBc3luYyhcbiAgICBmaWVsZE5hbWU6IHN0cmluZyxcbiAgICB2YWx1ZXM6IEFycmF5PHN0cmluZz4sXG4gICAgdXBkYXRlVHlwZTogQ29udHJhY3QuRmlsdGVyVXBkYXRlVHlwZSxcbiAgICBvcHRpb25zOiBDb250cmFjdC5GaWx0ZXJPcHRpb25zLFxuICApOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFwcGx5SGllcmFyY2hpY2FsRmlsdGVyQXN5bmMoZmllbGROYW1lLCB2YWx1ZXMsIHVwZGF0ZVR5cGUsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmMoZmllbGROYW1lOiBzdHJpbmcsIG9wdGlvbnM6IENvbnRyYWN0LlJlbGF0aXZlRGF0ZUZpbHRlck9wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmFwcGx5UmVsYXRpdmVEYXRlRmlsdGVyQXN5bmMoZmllbGROYW1lLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBjbGVhckZpbHRlckFzeW5jKGZpZWxkTmFtZTogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5jbGVhckZpbHRlckFzeW5jKGZpZWxkTmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0RGF0YVNvdXJjZXNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkRhdGFTb3VyY2U+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0RGF0YVNvdXJjZXNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldEZpbHRlcnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkZpbHRlcj4+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRGaWx0ZXJzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRIaWdobGlnaHRlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTxDb250cmFjdC5NYXJrc0NvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRIaWdobGlnaHRlZE1hcmtzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdW1tYXJ5RGF0YUFzeW5jKG9wdGlvbnM6IENvbnRyYWN0LkdldFN1bW1hcnlEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0U3VtbWFyeURhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdW1tYXJ5RGF0YVJlYWRlckFzeW5jKHBhZ2VSb3dDb3VudDogbnVtYmVyLCBvcHRpb25zOiBDb250cmFjdC5HZXRTdW1tYXJ5RGF0YU9wdGlvbnMpOiBQcm9taXNlPENvbnRyYWN0LkRhdGFUYWJsZVJlYWRlcj4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmdldFN1bW1hcnlEYXRhUmVhZGVyQXN5bmMocGFnZVJvd0NvdW50LCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYygpOiBQcm9taXNlPEFycmF5PENvbHVtbj4+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRTdW1tYXJ5Q29sdW1uc0luZm9Bc3luYygpO1xuICB9XG5cbiAgcHVibGljIGdldFVuZGVybHlpbmdEYXRhQXN5bmMob3B0aW9uczogQ29udHJhY3QuR2V0VW5kZXJseWluZ0RhdGFPcHRpb25zKTogUHJvbWlzZTxDb250cmFjdC5EYXRhVGFibGU+IHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAnV29ya3NoZWV0LmdldFVuZGVybHlpbmdEYXRhQXN5bmMgaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSAnICtcbiAgICAgICAgJ1dvcmtzaGVldC5nZXRVbmRlcmx5aW5nVGFibGVzQXN5bmMgYW5kIFdvcmtzaGVldC5nZXRVbmRlcmx5aW5nVGFibGVEYXRhQXN5bmMnLFxuICAgICk7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VW5kZXJseWluZ0RhdGFBc3luYyhvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVzQXN5bmMoKTogUHJvbWlzZTxBcnJheTxDb250cmFjdC5Mb2dpY2FsVGFibGU+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VW5kZXJseWluZ1RhYmxlc0FzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM6IENvbnRyYWN0LkdldFVuZGVybHlpbmdEYXRhT3B0aW9ucyk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YUFzeW5jKGxvZ2ljYWxUYWJsZUlkLCBvcHRpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmRlcmx5aW5nVGFibGVEYXRhUmVhZGVyQXN5bmMoXG4gICAgbG9naWNhbFRhYmxlSWQ6IHN0cmluZyxcbiAgICBwYWdlUm93Q291bnQ6IG51bWJlcixcbiAgICBvcHRpb25zOiBDb250cmFjdC5HZXRVbmRlcmx5aW5nRGF0YU9wdGlvbnMsXG4gICk6IFByb21pc2U8Q29udHJhY3QuRGF0YVRhYmxlUmVhZGVyPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VW5kZXJseWluZ1RhYmxlRGF0YVJlYWRlckFzeW5jKGxvZ2ljYWxUYWJsZUlkLCBwYWdlUm93Q291bnQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIGdldFZpc3VhbFNwZWNpZmljYXRpb25Bc3luYygpOiBQcm9taXNlPENvbnRyYWN0LlZpc3VhbFNwZWNpZmljYXRpb24+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5nZXRWaXN1YWxTcGVjaWZpY2F0aW9uQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBhZGRNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIGNvbHVtbnM6IHN0cmluZ1tdLFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuYWRkTWFya3NDYXJkRmllbGRzQXN5bmMobWFya3NDYXJkSW5kZXgsIGVuY29kaW5nVHlwZSwgY29sdW1ucywgc3RhcnRJbmRleCk7XG4gIH1cblxuICBwdWJsaWMgbW92ZU1hcmtzQ2FyZEZpZWxkQXN5bmMobWFya3NDYXJkSW5kZXg6IG51bWJlciwgZnJvbUluZGV4OiBudW1iZXIsIHRvSW5kZXg6IG51bWJlciwgZmllbGRDb3VudCA9IDEpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5tb3ZlTWFya3NDYXJkRmllbGRBc3luYyhtYXJrc0NhcmRJbmRleCwgZnJvbUluZGV4LCB0b0luZGV4LCBmaWVsZENvdW50KTtcbiAgfVxuXG4gIHB1YmxpYyBzcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhcbiAgICBtYXJrc0NhcmRJbmRleDogbnVtYmVyLFxuICAgIGVuY29kaW5nVHlwZTogQ29udHJhY3QuRW5jb2RpbmdUeXBlLFxuICAgIHN0YXJ0SW5kZXg6IG51bWJlcixcbiAgICBkZWxldGVDb3VudDogbnVtYmVyLFxuICAgIGNvbHVtbnM6IHN0cmluZ1tdLFxuICApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zcGxpY2VNYXJrc0NhcmRGaWVsZHNBc3luYyhtYXJrc0NhcmRJbmRleCwgZW5jb2RpbmdUeXBlLCBzdGFydEluZGV4LCBkZWxldGVDb3VudCwgY29sdW1ucyk7XG4gIH1cblxuICBwdWJsaWMgY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuY2xlYXJTZWxlY3RlZE1hcmtzQXN5bmMoKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RNYXJrc0J5SURBc3luYyhtYXJrc0luZm86IEFycmF5PENvbnRyYWN0Lk1hcmtJbmZvPiwgdXBkYXRlVHlwZTogU2VsZWN0aW9uVXBkYXRlVHlwZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLnNlbGVjdE1hcmtzQnlJZEFzeW5jKG1hcmtzSW5mbywgdXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuU2VsZWN0aW9uQ3JpdGVyaWE+LCBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeVZhbHVlQXN5bmMoc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9uczogQXJyYXk8Q29udHJhY3QuTWFya0luZm8+LCBzZWxlY3Rpb25VcGRhdGVUeXBlOiBTZWxlY3Rpb25VcGRhdGVUeXBlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuc2VsZWN0TWFya3NCeUlkQXN5bmMoc2VsZWN0aW9ucywgc2VsZWN0aW9uVXBkYXRlVHlwZSk7XG4gIH1cblxuICBwdWJsaWMgYW5ub3RhdGVNYXJrQXN5bmMobWFyazogQ29udHJhY3QuTWFya0luZm8sIGFubm90YXRpb25UZXh0OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5hbm5vdGF0ZU1hcmtBc3luYyhtYXJrLCBhbm5vdGF0aW9uVGV4dCk7XG4gIH1cblxuICBwdWJsaWMgZ2V0QW5ub3RhdGlvbnNBc3luYygpOiBQcm9taXNlPEFycmF5PENvbnRyYWN0LkFubm90YXRpb24+PiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0QW5ub3RhdGlvbnNBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHJlbW92ZUFubm90YXRpb25Bc3luYyhhbm5vdGF0aW9uOiBDb250cmFjdC5Bbm5vdGF0aW9uKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwucmVtb3ZlQW5ub3RhdGlvbkFzeW5jKGFubm90YXRpb24pO1xuICB9XG5cbiAgcHVibGljIGhvdmVyVHVwbGVBc3luYyhob3ZlcmVkVHVwbGU/OiBudW1iZXIsIHRvb2x0aXA/OiBUb29sdGlwQ29udGV4dCB8IG51bGwsIGFsbG93SG92ZXJBY3Rpb25zID0gdHJ1ZSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmhvdmVyVHVwbGVBc3luYyhob3ZlcmVkVHVwbGUsIHRvb2x0aXAsIGFsbG93SG92ZXJBY3Rpb25zKTtcbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RUdXBsZXNBc3luYyhzZWxlY3RlZFR1cGxlczogQXJyYXk8bnVtYmVyPiwgc2VsZWN0T3B0aW9uOiBDb250cmFjdC5TZWxlY3RPcHRpb25zLCB0b29sdGlwPzogVG9vbHRpcENvbnRleHQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5fd29ya3NoZWV0SW1wbC5zZWxlY3RUdXBsZXNBc3luYyhzZWxlY3RlZFR1cGxlcywgc2VsZWN0T3B0aW9uLCB0b29sdGlwKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUb29sdGlwVGV4dEFzeW5jKHR1cGxlSWQ6IG51bWJlcik6IFByb21pc2U8U3RyaW5nPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwuZ2V0VG9vbHRpcFRleHRBc3luYyh0dXBsZUlkKTtcbiAgfVxuXG4gIHB1YmxpYyBsZWF2ZU1hcmtOYXZpZ2F0aW9uQXN5bmMoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldEltcGwubGVhdmVNYXJrTmF2aWdhdGlvbkFzeW5jKCk7XG4gIH1cblxuICBwdWJsaWMgZWRpdEFsaWFzZXNEaWFsb2dBc3luYyhmaWVsZE5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl93b3Jrc2hlZXRJbXBsLmVkaXRBbGlhc2VzRGlhbG9nQXN5bmMoZmllbGROYW1lKTtcbiAgfVxuXG4gIHByaXZhdGUgdmlzdWFsSWRzQXJlRXF1YWwoYTogVmlzdWFsSWQsIGI6IFZpc3VhbElkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGEgJiZcbiAgICAgIGIgJiZcbiAgICAgIGEud29ya3NoZWV0ID09PSBiLndvcmtzaGVldCAmJlxuICAgICAgYS5kYXNoYm9hcmQgPT09IGIuZGFzaGJvYXJkICYmXG4gICAgICBhLnN0b3J5Ym9hcmQgPT09IGIuc3Rvcnlib2FyZCAmJlxuICAgICAgYS5zdG9yeVBvaW50SUQgPT09IGIuc3RvcnlQb2ludElEXG4gICAgKTtcbiAgfVxufVxuIiwiaW1wb3J0ICogYXMgQ29udHJhY3QgZnJvbSAnQHRhYmxlYXUvYXBpLWV4dGVybmFsLWNvbnRyYWN0LWpzJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgRGFzaGJvYXJkQ29udGVudCBuYW1lc3BhY2UuXG4gKiBUaGlzIGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIERhc2hib2FyZENvbnRlbnQgaXNcbiAqIGN1cnJlbnRseSBqdXN0IGEgKHNpbmdsZSkgcHJvcGVydHkgYmFnLlxuICovXG5leHBvcnQgY2xhc3MgRGFzaGJvYXJkQ29udGVudCBpbXBsZW1lbnRzIENvbnRyYWN0LkRhc2hib2FyZENvbnRlbnQge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfZGFzaGJvYXJkOiBDb250cmFjdC5FeHRlbnNpb25EYXNoYm9hcmQpIHt9XG5cbiAgcHVibGljIGdldCBkYXNoYm9hcmQoKTogQ29udHJhY3QuRXh0ZW5zaW9uRGFzaGJvYXJkIHtcbiAgICByZXR1cm4gdGhpcy5fZGFzaGJvYXJkO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uRW52aXJvbm1lbnQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQXBpVmVyc2lvbiwgSW50ZXJuYWxUb0V4dGVybmFsRW51bU1hcHBpbmdzIGFzIEVudW1NYXBwaW5ncyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgQ29ubmVjdGVkU2VydmVyIH0gZnJvbSAnLi4vSW1wbC9Db25uZWN0ZWRTZXJ2ZXInO1xuaW1wb3J0IHsgV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCB9IGZyb20gJy4vV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIGVudmlyb25tZW50IG5hbWVzcGFjZS5cbiAqIEVudmlyb25tZW50IGRvZXMgbm90IGZvbGxvdyB0aGUgSW1wbCBwYXR0ZXJuIGFzIGl0IGlzXG4gKiBqdXN0IGEgcHJvcGVydHkgYmFnLlxuICogRmlyc3QgY2xhc3MgZXh0ZW5zaW9ucyBjYW4gZ2V0IHRvIENvbm5lY3RlZFNlcnZlciB3aXRoOiBlbnZpcm9ubWVudFsnY29ubmVjdGVkU2VydmVyJ11cbiAqL1xuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50IGltcGxlbWVudHMgQ29udHJhY3QuRW52aXJvbm1lbnQge1xuICAvKipUaGUgZm9sbG93aW5nIGlzIGFuIGluZGV4IHNpZ25hdHVyZS4gSXQgYWxsb3dzIHByb3BlcnRpZXMgdG8gYmUgYWNjZXNzZWQgYnkgbmFtZS5cbiAgICogVGhpcyBhbGxvd3MgdXMgdG8gYWRkIHByb3BlcnRpZXMgZHluYW1pY2FsbHkgKHNlZSB1c2FnZSBvZiB0aGlzLmNvbm5lY3RlZFNlcnZlciBiZWxvdykgd2l0aG91dCBUeXBlc2NyaXB0IGVycm9ycy5cbiAgICogVGhlIHJlYXNvbiB3ZSBkbyB0aGlzIGlzIHNvIHRoYXQgM3JkLXBhcnR5IGV4dGVuc2lvbiBkZXZlbG9wZXJzIGRvIG5vdCBzZWUgdGhlIGNvbm5lY3RlZFNlcnZlciBwcm9wZXJ0eVxuICAgKiB0aGF0IGlzIG9ubHkgYXZhaWxhYmxlIHRvIGZpcnN0IGNsYXNzIGV4dGVuc2lvbiBkZXZlbG9wZXJzLlxuICAgKiBUaGUgdHlwZSBvZiB0aGUgaW5kZXggc2lnYXR1cmUgbmVlZHMgdG8gYmUgYSB1bmlvbiBvZiBhbGwgcHJvcGVydGllcyBpbiB0aGUgb2JqZWN0LCBzaW5jZSB3ZSBjb3VsZFxuICAgKiBhY2Nlc3MgYW55IHByb3BlcnR5IHVzaW5nIHRoZSBwcm9wZXJ0eSBpbmRleCBtZXRob2QuXG4gICAqL1xuICBbeDogc3RyaW5nXTogQ29ubmVjdGVkU2VydmVyIHwgc3RyaW5nIHwgQ29udHJhY3QuV29ya2Jvb2tGb3JtYXR0aW5nIHwgc3RyaW5nW10gfCBib29sZWFuIHwgdW5kZWZpbmVkIHwgQ29udHJhY3QuRXhwb3J0ZWRNZWRpYVR5cGU7XG4gIHByaXZhdGUgX2FwaVZlcnNpb246IHN0cmluZztcbiAgcHJpdmF0ZSBfY29udGV4dDogQ29udHJhY3QuRXh0ZW5zaW9uQ29udGV4dDtcbiAgcHJpdmF0ZSBfZm9ybWF0dGluZz86IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZztcbiAgcHJpdmF0ZSBfbGFuZ3VhZ2U6IHN0cmluZztcbiAgcHJpdmF0ZSBfY291bnRyeT86IHN0cmluZztcbiAgcHJpdmF0ZSBfbG9jYWxlOiBzdHJpbmc7XG4gIHByaXZhdGUgX3dvcmtib29rTG9jYWxlOiBzdHJpbmc7XG4gIHByaXZhdGUgX21vZGU6IENvbnRyYWN0LkV4dGVuc2lvbk1vZGU7XG4gIHByaXZhdGUgX29wZXJhdGluZ1N5c3RlbTogc3RyaW5nO1xuICBwcml2YXRlIF90YWJsZWF1VmVyc2lvbjogc3RyaW5nO1xuICBwcml2YXRlIF91bmlxdWVVc2VySWQ/OiBzdHJpbmc7XG4gIHByaXZhdGUgX2V4cG9ydGVkTWVkaWFUeXBlPzogQ29udHJhY3QuRXhwb3J0ZWRNZWRpYVR5cGU7XG4gIHByaXZhdGUgX2lzRXhwb3J0aW5nOiBib29sZWFuO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihleHRlbnNpb25FbnZpcm9ubWVudDogRXh0ZW5zaW9uRW52aXJvbm1lbnQpIHtcbiAgICB0aGlzLl9hcGlWZXJzaW9uID0gQXBpVmVyc2lvbi5JbnN0YW5jZSAmJiBBcGlWZXJzaW9uLkluc3RhbmNlLmZvcm1hdHRlZFZhbHVlOyAvLyBtYWoubWluLmZpeCAobm8gYnVpbGQpXG4gICAgdGhpcy5fY29udGV4dCA9IEVudW1NYXBwaW5ncy5leHRlbnNpb25Db250ZXh0LmNvbnZlcnQoZXh0ZW5zaW9uRW52aXJvbm1lbnQuZXh0ZW5zaW9uQ29udGV4dCk7XG4gICAgdGhpcy5faXNFeHBvcnRpbmcgPSBleHRlbnNpb25FbnZpcm9ubWVudC5pc0V4cG9ydGluZztcbiAgICB0aGlzLl9mb3JtYXR0aW5nID0gV29ya2Jvb2tGb3JtYXR0aW5nRW52VXRpbC5jb252ZXJ0VG9Xb3JrYm9va0Zvcm1hdHRpbmcoZXh0ZW5zaW9uRW52aXJvbm1lbnQud29ya2Jvb2tGb3JtYXR0aW5nKTtcbiAgICB0aGlzLl9sYW5ndWFnZSA9IGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkxhbmd1YWdlO1xuICAgIHRoaXMuX2NvdW50cnkgPSBleHRlbnNpb25FbnZpcm9ubWVudC5leHRlbnNpb25Db3VudHJ5O1xuICAgIHRoaXMuX2xvY2FsZSA9IGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbkxvY2FsZTtcbiAgICB0aGlzLl93b3JrYm9va0xvY2FsZSA9IGV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rTG9jYWxlO1xuICAgIHRoaXMuX21vZGUgPSBFbnVtTWFwcGluZ3MuZXh0ZW5zaW9uTW9kZS5jb252ZXJ0KGV4dGVuc2lvbkVudmlyb25tZW50LmV4dGVuc2lvbk1vZGUpO1xuICAgIHRoaXMuX29wZXJhdGluZ1N5c3RlbSA9IGV4dGVuc2lvbkVudmlyb25tZW50Lm9wZXJhdGluZ1N5c3RlbTtcbiAgICB0aGlzLl90YWJsZWF1VmVyc2lvbiA9IGV4dGVuc2lvbkVudmlyb25tZW50LnRhYmxlYXVWZXJzaW9uO1xuICAgIHRoaXMuX3VuaXF1ZVVzZXJJZCA9IGV4dGVuc2lvbkVudmlyb25tZW50LnVuaXF1ZVVzZXJJZDtcbiAgICB0aGlzLl9leHBvcnRlZE1lZGlhVHlwZSA9IGV4dGVuc2lvbkVudmlyb25tZW50LmV4cG9ydGVkTWVkaWFUeXBlXG4gICAgICA/IEVudW1NYXBwaW5ncy5leHBvcnRlZE1lZGlhVHlwZS5jb252ZXJ0KGV4dGVuc2lvbkVudmlyb25tZW50LmV4cG9ydGVkTWVkaWFUeXBlKVxuICAgICAgOiB1bmRlZmluZWQ7XG5cbiAgICAvLyBJZiB3ZSBoYXZlIGEgdXNlcklkLCB0aGVuIHdlIGFyZSBhIGZpcnN0IGNsYXNzIGV4dGVuc2lvblxuICAgIGlmIChleHRlbnNpb25FbnZpcm9ubWVudC51c2VySWQpIHtcbiAgICAgIHRoaXMuY29ubmVjdGVkU2VydmVyID0gbmV3IENvbm5lY3RlZFNlcnZlcihcbiAgICAgICAgZXh0ZW5zaW9uRW52aXJvbm1lbnQudXNlcklkLFxuICAgICAgICBleHRlbnNpb25FbnZpcm9ubWVudC5zaXRlSWQsXG4gICAgICAgIGV4dGVuc2lvbkVudmlyb25tZW50LnNpdGVOYW1lc3BhY2UsXG4gICAgICAgIGV4dGVuc2lvbkVudmlyb25tZW50Lndvcmtib29rSWQsXG4gICAgICApO1xuXG4gICAgICB0aGlzLmZlYXR1cmVGbGFncyA9IGV4dGVuc2lvbkVudmlyb25tZW50LmZlYXR1cmVGbGFncztcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZ2V0IGFwaVZlcnNpb24oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fYXBpVmVyc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29udGV4dCgpOiBDb250cmFjdC5FeHRlbnNpb25Db250ZXh0IHtcbiAgICByZXR1cm4gdGhpcy5fY29udGV4dDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya2Jvb2tGb3JtYXR0aW5nKCk6IENvbnRyYWN0Lldvcmtib29rRm9ybWF0dGluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2Zvcm1hdHRpbmc7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxhbmd1YWdlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlO1xuICB9XG5cbiAgcHVibGljIGdldCBjb3VudHJ5KCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2NvdW50cnk7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGxvY2FsZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9sb2NhbGU7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHdvcmtib29rTG9jYWxlKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtib29rTG9jYWxlO1xuICB9XG5cbiAgcHVibGljIGdldCBtb2RlKCk6IENvbnRyYWN0LkV4dGVuc2lvbk1vZGUge1xuICAgIHJldHVybiB0aGlzLl9tb2RlO1xuICB9XG5cbiAgcHVibGljIGdldCBvcGVyYXRpbmdTeXN0ZW0oKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fb3BlcmF0aW5nU3lzdGVtO1xuICB9XG5cbiAgcHVibGljIGdldCB0YWJsZWF1VmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl90YWJsZWF1VmVyc2lvbjtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgdW5pcXVlVXNlcklkKCk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3VuaXF1ZVVzZXJJZDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgaXNFeHBvcnRpbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX2lzRXhwb3J0aW5nO1xuICB9XG5cbiAgcHVibGljIGdldCBleHBvcnRlZE1lZGlhVHlwZSgpOiBDb250cmFjdC5FeHBvcnRlZE1lZGlhVHlwZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX2V4cG9ydGVkTWVkaWFUeXBlO1xuICB9XG59XG4iLCJpbXBvcnQgKiBhcyBDb250cmFjdCBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgQ2FsbGJhY2tNYXAsIEV4dGVuc2lvbnNJbXBsIH0gZnJvbSAnLi4vSW1wbC9FeHRlbnNpb25zSW1wbCc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIEV4dGVuc2lvbnMgbmFtZXNwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgRXh0ZW5zaW9ucyBpbXBsZW1lbnRzIENvbnRyYWN0LkV4dGVuc2lvbnMge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBleHRlbnNpb25JbXBsOiBFeHRlbnNpb25zSW1wbCkge1xuICAgIHRoaXMuZXh0ZW5zaW9uSW1wbCA9IGV4dGVuc2lvbkltcGw7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZENvbnRlbnQoKTogQ29udHJhY3QuRGFzaGJvYXJkQ29udGVudCB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5kYXNoYm9hcmRDb250ZW50O1xuICB9XG5cbiAgcHVibGljIGdldCB3b3Jrc2hlZXRDb250ZW50KCk6IENvbnRyYWN0LldvcmtzaGVldENvbnRlbnQgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwud29ya3NoZWV0Q29udGVudDtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgZW52aXJvbm1lbnQoKTogQ29udHJhY3QuRW52aXJvbm1lbnQge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwuZW52aXJvbm1lbnQ7XG4gIH1cblxuICBwdWJsaWMgZ2V0IHNldHRpbmdzKCk6IENvbnRyYWN0LlNldHRpbmdzIHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLnNldHRpbmdzO1xuICB9XG5cbiAgcHVibGljIGdldCB1aSgpOiBDb250cmFjdC5VSSB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC51aTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgd29ya2Jvb2soKTogQ29udHJhY3QuRXh0ZW5zaW9uV29ya2Jvb2sge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwud29ya2Jvb2s7XG4gIH1cblxuICBwdWJsaWMgZ2V0IGRhc2hib2FyZE9iamVjdElkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5leHRlbnNpb25ab25lSWQ7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZUFzeW5jKGNvbnRleHRNZW51Q2FsbGJhY2tzPzogQ2FsbGJhY2tNYXApOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmluaXRpYWxpemVBc3luYyhmYWxzZSwgY29udGV4dE1lbnVDYWxsYmFja3MpLnRoZW48dm9pZD4oKTtcbiAgfVxuXG4gIHB1YmxpYyBpbml0aWFsaXplRGlhbG9nQXN5bmMoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmluaXRpYWxpemVBc3luYyh0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVWaXpJbWFnZUFzeW5jKGlucHV0U3BlYzogb2JqZWN0KTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy5leHRlbnNpb25JbXBsLmNyZWF0ZVZpekltYWdlQXN5bmMoaW5wdXRTcGVjKTtcbiAgfVxuXG4gIHB1YmxpYyBzZXRDbGlja1Rocm91Z2hBc3luYyhjbGlja1Rocm91Z2hFbmFibGVkOiBib29sZWFuKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuZXh0ZW5zaW9uSW1wbC5zZXRDbGlja1Rocm91Z2hBc3luYyhjbGlja1Rocm91Z2hFbmFibGVkKTtcbiAgfVxuXG4gIHB1YmxpYyByZXBvcnRFeHRlbnNpb25SZW5kZXJDb21wbGV0ZShtZWRpYUJsb2I/OiBBcnJheUJ1ZmZlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmV4dGVuc2lvbkltcGwucmVwb3J0RXh0ZW5zaW9uUmVuZGVyQ29tcGxldGUobWVkaWFCbG9iKTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgU2V0dGluZ3MgYXMgU2V0dGluZ3NDb250cmFjdCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgU2V0dGluZ3NJbXBsIH0gZnJvbSAnLi4vSW1wbC9TZXR0aW5nc0ltcGwnO1xuaW1wb3J0IHsgU2V0dGluZ3NDb2xsZWN0aW9uIH0gZnJvbSAnLi4vU2VydmljZXMvU2V0dGluZ3NTZXJ2aWNlJztcblxuLyoqXG4gKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgZXh0ZXJuYWwgc2V0dGluZ3MgbmFtZXNwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgU2V0dGluZ3MgZXh0ZW5kcyBFdmVudExpc3RlbmVyTWFuYWdlciBpbXBsZW1lbnRzIFNldHRpbmdzQ29udHJhY3Qge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfc2V0dGluZ3NJbXBsOiBTZXR0aW5nc0ltcGwpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBvdXIgZXZlbnQgaGFuZGxpbmcgZm9yIHRoaXMgY2xhc3NcbiAgICB0aGlzLl9zZXR0aW5nc0ltcGwuaW5pdGlhbGl6ZUV2ZW50cygpLmZvckVhY2goKGUpID0+IHRoaXMuYWRkTmV3RXZlbnRUeXBlKGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBlcmFzZShrZXk6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3NldHRpbmdzSW1wbC5lcmFzZShrZXkpO1xuICB9XG5cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMuX3NldHRpbmdzSW1wbC5nZXQoa2V5KTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRBbGwoKTogU2V0dGluZ3NDb2xsZWN0aW9uIHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLmdldEFsbCgpO1xuICB9XG5cbiAgcHVibGljIGdldCBpc01vZGlmaWVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9zZXR0aW5nc0ltcGwuaXNNb2RpZmllZDtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlQXN5bmMoKTogUHJvbWlzZTxTZXR0aW5nc0NvbGxlY3Rpb24+IHtcbiAgICByZXR1cm4gdGhpcy5fc2V0dGluZ3NJbXBsLnNhdmVBc3luYygpO1xuICB9XG5cbiAgcHVibGljIHNldChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIHRoaXMuX3NldHRpbmdzSW1wbC5zZXQoa2V5LCB2YWx1ZSk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFdmVudExpc3RlbmVyTWFuYWdlciB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgVUlJbXBsIH0gZnJvbSAnLi4vSW1wbC9VSUltcGwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlcm5hbCBVSSBuYW1lc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBVSSBleHRlbmRzIEV2ZW50TGlzdGVuZXJNYW5hZ2VyIGltcGxlbWVudHMgQ29udHJhY3QuVUkge1xuICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBfaW1wbDogVUlJbXBsKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIC8vIEluaXRpYWxpemUgb3VyIGV2ZW50IGhhbmRsaW5nIGZvciB0aGlzIGNsYXNzXG4gICAgdGhpcy5faW1wbC5pbml0aWFsaXplRXZlbnRzKCkuZm9yRWFjaCgoZSkgPT4gdGhpcy5hZGROZXdFdmVudFR5cGUoZSkpO1xuICB9XG5cbiAgcHVibGljIGRpc3BsYXlEaWFsb2dBc3luYyh1cmw6IHN0cmluZywgcGF5bG9hZD86IHN0cmluZywgb3B0aW9ucz86IENvbnRyYWN0LkRpYWxvZ09wdGlvbnMpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIHJldHVybiB0aGlzLl9pbXBsLmRpc3BsYXlEaWFsb2dBc3luYyh1cmwsIHBheWxvYWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgcHVibGljIHNlbmREaWFsb2dNZXNzYWdlQXN5bmMobWVzc2FnZTogc3RyaW5nLCB0YXJnZXREaWFsb2dVcmw/OiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5faW1wbC5zZW5kRGlhbG9nTWVzc2FnZUFzeW5jKG1lc3NhZ2UsIHRhcmdldERpYWxvZ1VybCk7XG4gIH1cblxuICBwdWJsaWMgc2VuZERpYWxvZ01lc3NhZ2VUb1BhcmVudEFzeW5jKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHJldHVybiB0aGlzLl9pbXBsLnNlbmREaWFsb2dNZXNzYWdlVG9QYXJlbnRBc3luYyhtZXNzYWdlKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZURpYWxvZyhwYXlsb2FkPzogc3RyaW5nLCBkaWFsb2dVcmw/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLl9pbXBsLmNsb3NlRGlhbG9nKHBheWxvYWQsIGRpYWxvZ1VybCk7XG4gIH1cbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBDbGFzc05hbWVLZXksIFdvcmtib29rRm9ybWF0dGluZyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBJbnRlcm5hbFRvRXh0ZXJuYWxFbnVtTWFwcGluZ3MgYXMgRW51bU1hcHBpbmdzIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbmV4cG9ydCBjbGFzcyBXb3JrYm9va0Zvcm1hdHRpbmdFbnZVdGlsIHtcbiAgcHVibGljIHN0YXRpYyBjb252ZXJ0VG9Xb3JrYm9va0Zvcm1hdHRpbmcod29ya2Jvb2tGb3JtYXR0aW5nTW9kZWw/OiBXb3JrYm9va0Zvcm1hdHRpbmcpOiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgfCB1bmRlZmluZWQge1xuICAgIGlmICghd29ya2Jvb2tGb3JtYXR0aW5nTW9kZWwpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGZvcm1hdHRpbmdNYXA6IEFycmF5PENvbnRyYWN0LkZvcm1hdHRpbmdTaGVldD4gPSB3b3JrYm9va0Zvcm1hdHRpbmdNb2RlbC5mb3JtYXR0aW5nU2hlZXRzLm1hcCgoY3VycmVudEZvcm1hdHRpbmdTaGVldCkgPT4ge1xuICAgICAgICBjb25zdCBmb3JtYXR0aW5nU2hlZXQ6IENvbnRyYWN0LkZvcm1hdHRpbmdTaGVldCA9IHtcbiAgICAgICAgICBjbGFzc05hbWVLZXk6IEVudW1NYXBwaW5ncy5jbGFzc05hbWVLZXkuY29udmVydChjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNsYXNzTmFtZUtleSksXG4gICAgICAgICAgY3NzUHJvcGVydGllczogZ2V0Q3NzUHJvcGVydGllcyhjdXJyZW50Rm9ybWF0dGluZ1NoZWV0LmNsYXNzTmFtZUtleSwgY3VycmVudEZvcm1hdHRpbmdTaGVldC5jc3NQcm9wZXJ0aWVzKSxcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIGZvcm1hdHRpbmdTaGVldDtcbiAgICAgIH0pO1xuICAgICAgY29uc3QgcmVzdWx0OiBDb250cmFjdC5Xb3JrYm9va0Zvcm1hdHRpbmcgPSB7XG4gICAgICAgIGZvcm1hdHRpbmdTaGVldHM6IGZvcm1hdHRpbmdNYXAsXG4gICAgICB9O1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Q3NzUHJvcGVydGllcyhjbGFzc05hbWVLZXk6IENsYXNzTmFtZUtleSwgY3NzUHJvcGVydGllczogUmVhY3QuQ1NTUHJvcGVydGllcyk6IGltcG9ydCgncmVhY3QnKS5DU1NQcm9wZXJ0aWVzIHtcbiAgaWYgKGNsYXNzTmFtZUtleSA9PT0gQ2xhc3NOYW1lS2V5LlJvd0RpdmlkZXJzIHx8IGNsYXNzTmFtZUtleSA9PT0gQ2xhc3NOYW1lS2V5LkNvbHVtbkRpdmlkZXJzKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGJvcmRlckNvbG9yOiBjc3NQcm9wZXJ0aWVzLmJvcmRlckNvbG9yLFxuICAgICAgYm9yZGVyU3R5bGU6IGNzc1Byb3BlcnRpZXMuYm9yZGVyU3R5bGUsXG4gICAgICBib3JkZXJXaWR0aDogY3NzUHJvcGVydGllcy5ib3JkZXJXaWR0aCxcbiAgICB9IGFzIFJlYWN0LkNTU1Byb3BlcnRpZXM7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGZvbnRGYW1pbHk6IGNzc1Byb3BlcnRpZXMuZm9udEZhbWlseSxcbiAgICBmb250U2l6ZTogY3NzUHJvcGVydGllcy5mb250U2l6ZSxcbiAgICBmb250V2VpZ2h0OiBjc3NQcm9wZXJ0aWVzLmZvbnRXZWlnaHQsXG4gICAgZm9udFN0eWxlOiBjc3NQcm9wZXJ0aWVzLmZvbnRTdHlsZSxcbiAgICB0ZXh0RGVjb3JhdGlvbjogY3NzUHJvcGVydGllcy50ZXh0RGVjb3JhdGlvbixcbiAgICBjb2xvcjogY3NzUHJvcGVydGllcy5jb2xvcixcbiAgfTtcbn1cbiIsImltcG9ydCAqIGFzIENvbnRyYWN0IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5cbi8qKlxuICogSW1wbGVtZW50YXRpb24gb2YgdGhlIGV4dGVybmFsIFdvcmtzaGVldENvbnRlbnQgbmFtZXNwYWNlLlxuICogVGhpcyBkb2VzIG5vdCBmb2xsb3cgdGhlIEltcGwgcGF0dGVybiBhcyBXb3Jrc2hlZXRDb250ZW50IGlzXG4gKiBjdXJyZW50bHkganVzdCBhIChzaW5nbGUpIHByb3BlcnR5IGJhZy5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtzaGVldENvbnRlbnQgaW1wbGVtZW50cyBDb250cmFjdC5Xb3Jrc2hlZXRDb250ZW50IHtcbiAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgX3dvcmtzaGVldDogQ29udHJhY3QuRXh0ZW5zaW9uV29ya3NoZWV0KSB7fVxuXG4gIHB1YmxpYyBnZXQgd29ya3NoZWV0KCk6IENvbnRyYWN0LkV4dGVuc2lvbldvcmtzaGVldCB7XG4gICAgcmV0dXJuIHRoaXMuX3dvcmtzaGVldDtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4dGVuc2lvbkJvb3RzdHJhcEluZm8sIFBhcmFtZXRlcklkLCBWZXJiSWQgfSBmcm9tICdAdGFibGVhdS9hcGktaW50ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgU2VydmljZUltcGxCYXNlIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBJbml0aWFsaXphdGlvblNlcnZpY2UgfSBmcm9tICcuLi9Jbml0aWFsaXphdGlvblNlcnZpY2UnO1xuXG5leHBvcnQgY2xhc3MgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbCBleHRlbmRzIFNlcnZpY2VJbXBsQmFzZSBpbXBsZW1lbnRzIEluaXRpYWxpemF0aW9uU2VydmljZSB7XG4gIHB1YmxpYyBnZXQgc2VydmljZU5hbWUoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcy5Jbml0aWFsaXphdGlvblNlcnZpY2U7XG4gIH1cblxuICBwdWJsaWMgaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYyhpc0V4dGVuc2lvbkRpYWxvZzogYm9vbGVhbiwgY29udGV4dE1lbnVJZHM6IHN0cmluZ1tdKTogUHJvbWlzZTxFeHRlbnNpb25Cb290c3RyYXBJbmZvPiB7XG4gICAgY29uc3QgcGFyYW1zOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnaW5pdGlhbGl6ZURhc2hib2FyZEV4dGVuc2lvbnNBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uQ29udGV4dE1lbnVJZHNdOiBjb250ZXh0TWVudUlkcyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5Jc0V4dGVuc2lvbkRpYWxvZ106IGlzRXh0ZW5zaW9uRGlhbG9nLFxuICAgIH07XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5Jbml0aWFsaXplRXh0ZW5zaW9uLCBwYXJhbXMpLnRoZW48RXh0ZW5zaW9uQm9vdHN0cmFwSW5mbz4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAvLyBUT0RPIC0gVmFsaWRhdGUgcmV0dXJuIHZhbHVlXG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25Cb290c3RyYXBJbmZvO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRXJyb3JDb2RlcyB9IGZyb20gJ0B0YWJsZWF1L2FwaS1leHRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFeGVjdXRlUGFyYW1ldGVycywgRXh0ZW5zaW9uU2V0dGluZ3NJbmZvLCBQYXJhbWV0ZXJJZCwgVmVyYklkIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IFNlcnZpY2VJbXBsQmFzZSwgVGFibGVhdUVycm9yIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5pbXBvcnQgeyBFeHRlbnNpb25zU2VydmljZU5hbWVzIH0gZnJvbSAnLi4vRXh0ZW5zaW9uc1NlcnZpY2VOYW1lcyc7XG5pbXBvcnQgeyBTZXR0aW5nc0NvbGxlY3Rpb24sIFNldHRpbmdzU2VydmljZSB9IGZyb20gJy4uL1NldHRpbmdzU2VydmljZSc7XG5cbmV4cG9ydCBjbGFzcyBTZXR0aW5nc1NlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgU2V0dGluZ3NTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLlNldHRpbmdzU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBzYXZlU2V0dGluZ3NBc3luYyhzZXR0aW5nczogU2V0dGluZ3NDb2xsZWN0aW9uKTogUHJvbWlzZTxTZXR0aW5nc0NvbGxlY3Rpb24+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2F2ZVNldHRpbmdzQXN5bmMnLFxuICAgICAgW1BhcmFtZXRlcklkLlNldHRpbmdzVmFsdWVzXTogc2V0dGluZ3MsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNhdmVFeHRlbnNpb25TZXR0aW5ncywgcGFyYW1ldGVycykudGhlbjxTZXR0aW5nc0NvbGxlY3Rpb24+KCh2YWx1ZSkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0ID0gdmFsdWUucmVzdWx0IGFzIEV4dGVuc2lvblNldHRpbmdzSW5mbztcblxuICAgICAgaWYgKCFyZXN1bHQgfHwgIXJlc3VsdC5zZXR0aW5nc1ZhbHVlcykge1xuICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ1VuZXhwZWN0ZWQgZXJyb3Igc2F2aW5ncyBzZXR0aW5ncy4nKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlc3VsdC5zZXR0aW5nc1ZhbHVlcztcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgRGlhbG9nT3B0aW9ucywgRGlhbG9nU3R5bGUsIEVycm9yQ29kZXMgfSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuaW1wb3J0IHsgRXhlY3V0ZVBhcmFtZXRlcnMsIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdCwgUGFyYW1ldGVySWQsIFZlcmJJZCB9IGZyb20gJ0B0YWJsZWF1L2FwaS1pbnRlcm5hbC1jb250cmFjdC1qcyc7XG5pbXBvcnQgeyBFcnJvckhlbHBlcnMsIEV4dGVybmFsVG9JbnRlcm5hbEVudW1NYXBwaW5ncywgU2VydmljZUltcGxCYXNlLCBUYWJsZWF1RXJyb3IgfSBmcm9tICdAdGFibGVhdS9hcGktc2hhcmVkLWpzJztcbmltcG9ydCB7IEV4dGVuc2lvbnNTZXJ2aWNlTmFtZXMgfSBmcm9tICcuLi9FeHRlbnNpb25zU2VydmljZU5hbWVzJztcbmltcG9ydCB7IFVJU2VydmljZSB9IGZyb20gJy4uL1VJU2VydmljZSc7XG5cbmNvbnN0IERFRkFVTFRfRElBTE9HX0hFSUdIVCA9IDQwMDsgLy8gaW4gcGl4ZWxzXG5jb25zdCBERUZBVUxUX0RJQUxPR19XSURUSCA9IDYwMDsgLy8gaW4gcGl4ZWxzXG5jb25zdCBERUZBVUxUX0RJQUxPR19TVFlMRTogRGlhbG9nU3R5bGUgPSBEaWFsb2dTdHlsZS5XaW5kb3c7XG5cbmV4cG9ydCBjbGFzcyBVSVNlcnZpY2VJbXBsIGV4dGVuZHMgU2VydmljZUltcGxCYXNlIGltcGxlbWVudHMgVUlTZXJ2aWNlIHtcbiAgcHVibGljIGdldCBzZXJ2aWNlTmFtZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiBFeHRlbnNpb25zU2VydmljZU5hbWVzLlVJU2VydmljZTtcbiAgfVxuXG4gIHB1YmxpYyBkaXNwbGF5RGlhbG9nQXN5bmModXJsOiBzdHJpbmcsIHBheWxvYWQ6IHN0cmluZywgaXNFeHRlbnNpb25EaWFsb2c6IGJvb2xlYW4sIG9wdGlvbnM/OiBEaWFsb2dPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2Rpc3BsYXlEaWFsb2dBc3luYycsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nVXJsXTogdXJsLFxuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvbkRpYWxvZ1BheWxvYWRdOiBwYXlsb2FkLFxuICAgIH07XG5cbiAgICAvLyBUaGUgZGlhbG9nIHVybCBzb3VyY2UgcmVmZXJzIHRvIHdobyBpcyBvcGVuaW5nIGEgbmV3IGRpYWxvZyAoaS5lLiB0aGUgZGlhbG9nJ3MgcGFyZW50KS5cbiAgICAvLyBJZiB0aGUgaG9zdCBleHRlbnNpb24gaXMgb3BlbmluZyBhIGRpYWxvZyB3ZSBsZWF2ZSB0aGUgc291cmNlIHVybCBhcyB1bmRlZmluZWQgdG8gaGVscCB1cyBkaWZmZXJlbnRpYXRlIGZyb20gb3RoZXIgZGlhbG9ncy5cbiAgICBpZiAoaXNFeHRlbnNpb25EaWFsb2cpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nVXJsU291cmNlXSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmO1xuICAgIH1cblxuICAgIGNvbnN0IGg6IG51bWJlciA9IG9wdGlvbnMgJiYgb3B0aW9ucy5oZWlnaHQgPyBvcHRpb25zLmhlaWdodCA6IERFRkFVTFRfRElBTE9HX0hFSUdIVDtcbiAgICBjb25zdCB3OiBudW1iZXIgPSBvcHRpb25zICYmIG9wdGlvbnMud2lkdGggPyBvcHRpb25zLndpZHRoIDogREVGQVVMVF9ESUFMT0dfV0lEVEg7XG4gICAgY29uc3QgZGlhbG9nU3R5bGU6IERpYWxvZ1N0eWxlID0gb3B0aW9ucyAmJiBvcHRpb25zLmRpYWxvZ1N0eWxlID8gb3B0aW9ucy5kaWFsb2dTdHlsZSA6IERFRkFVTFRfRElBTE9HX1NUWUxFO1xuXG4gICAgLy8gT24gdGhlIHBsYXRmb3JtIHNpZGUsIHdlIGRvIHNvbWV0aGluZyByZWFzb25hYmxlIHJlZ2FyZGVzcyBvZiB3aGV0aGVyIHRoZSBwYXNzZWRcbiAgICAvLyBoZWlnaHQgYW5kIHdpZHRoIGFyZSB0b28gbGFyZ2Ugb3IgdG9vIHNtYWxsLiAgQnV0IHRoaXMgbGlrZWx5IGluZGljYXRlcyBhIGRldmVsb3BlciBlcnJvcixcbiAgICAvLyBzbyB3ZSB0aHJvdyBhbiBlcnJvciBoZXJlIHRvIGhlbHAgd2l0aCBkZWJ1Z2dpbmcuXG4gICAgaWYgKGggPD0gMCB8fCB3IDw9IDApIHtcbiAgICAgIHRocm93IG5ldyBUYWJsZWF1RXJyb3IoRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1ldGVyLCAnU2l6ZSBwYXJhbWV0ZXJzIGZvciBkaXNwbGF5RGlhbG9nQXN5bmMgbXVzdCBiZSBwb3NpdGl2ZScpO1xuICAgIH1cblxuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nSF0gPSBoO1xuICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nV10gPSB3O1xuICAgIEVycm9ySGVscGVycy52ZXJpZnlFbnVtVmFsdWU8RGlhbG9nU3R5bGU+KGRpYWxvZ1N0eWxlLCBEaWFsb2dTdHlsZSwgJ0RpYWxvZ1N0eWxlJyk7XG4gICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dTdHlsZV0gPSBFeHRlcm5hbFRvSW50ZXJuYWxFbnVtTWFwcGluZ3MuZGlhbG9nU3R5bGVzLmNvbnZlcnQoZGlhbG9nU3R5bGUpO1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuRGlzcGxheURpYWxvZywgcGFyYW1ldGVycykudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgIGNvbnN0IGRpYWxvZ1Jlc3VsdCA9IHJlc3BvbnNlLnJlc3VsdCBhcyBFeHRlbnNpb25EaWFsb2dSZXN1bHQ7XG4gICAgICBzd2l0Y2ggKGRpYWxvZ1Jlc3VsdCkge1xuICAgICAgICBjYXNlIEV4dGVuc2lvbkRpYWxvZ1Jlc3VsdC5EaWFsb2dBbHJlYWR5T3BlbjpcbiAgICAgICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuRGlhbG9nQWxyZWFkeU9wZW4sICdUaGVyZSBhbHJlYWR5IGV4aXN0cyBhbiBvcGVuIGRpYWxvZyBmb3IgdGhpcyBleHRlbnNpb24uJyk7XG4gICAgICAgIGNhc2UgRXh0ZW5zaW9uRGlhbG9nUmVzdWx0LkludmFsaWREb21haW46XG4gICAgICAgICAgdGhyb3cgbmV3IFRhYmxlYXVFcnJvcihcbiAgICAgICAgICAgIEVycm9yQ29kZXMuSW52YWxpZERvbWFpbkRpYWxvZyxcbiAgICAgICAgICAgICdUaGUgdXJsIG9mIGFuIGV4dGVuc2lvbiBkaWFsb2cgbXVzdCBtYXRjaCB0aGUgZG9tYWluIG9mIHRoZSBwYXJlbnQgZXh0ZW5zaW9uLicsXG4gICAgICAgICAgKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAvLyBTdWNjZXNzIGNhc2VcbiAgICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VEaWFsb2cocGF5bG9hZD86IHN0cmluZywgZGlhbG9nVXJsPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ2Nsb3NlRGlhbG9nJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dVcmxTb3VyY2VdOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICB9O1xuXG4gICAgaWYgKHBheWxvYWQpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nUGF5bG9hZF0gPSBwYXlsb2FkO1xuICAgIH1cblxuICAgIGlmIChkaWFsb2dVcmwpIHtcbiAgICAgIHBhcmFtZXRlcnNbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nVXJsXSA9IGRpYWxvZ1VybDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5leGVjdXRlKFZlcmJJZC5DbG9zZURpYWxvZywgcGFyYW1ldGVycykudGhlbigoKSA9PiB7XG4gICAgICByZXR1cm47XG4gICAgfSk7XG4gIH1cblxuICBzZW5kRGlhbG9nTWVzc2FnZUFzeW5jKG1lc3NhZ2U6IHN0cmluZywgdGFyZ2V0RGlhbG9nVXJsPzogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFyYW1ldGVyczogRXhlY3V0ZVBhcmFtZXRlcnMgPSB7XG4gICAgICBbUGFyYW1ldGVySWQuRnVuY3Rpb25OYW1lXTogJ3NlbmREaWFsb2dNZXNzYWdlJyxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dNZXNzYWdlXTogbWVzc2FnZSxcbiAgICAgIFtQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dVcmxTb3VyY2VdOiB3aW5kb3cubG9jYXRpb24uaHJlZixcbiAgICB9O1xuXG4gICAgaWYgKHRhcmdldERpYWxvZ1VybCkge1xuICAgICAgcGFyYW1ldGVyc1tQYXJhbWV0ZXJJZC5FeHRlbnNpb25EaWFsb2dVcmxdID0gdGFyZ2V0RGlhbG9nVXJsO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNlbmREaWFsb2dNZXNzYWdlLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxuXG4gIHNlbmREaWFsb2dNZXNzYWdlVG9QYXJlbnRBc3luYyhtZXNzYWdlOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJhbWV0ZXJzOiBFeGVjdXRlUGFyYW1ldGVycyA9IHtcbiAgICAgIFtQYXJhbWV0ZXJJZC5GdW5jdGlvbk5hbWVdOiAnc2VuZE1lc3NhZ2VUb1BhcmVudCcsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nTWVzc2FnZV06IG1lc3NhZ2UsXG4gICAgICBbUGFyYW1ldGVySWQuRXh0ZW5zaW9uRGlhbG9nVXJsU291cmNlXTogd2luZG93LmxvY2F0aW9uLmhyZWYsXG4gICAgfTtcblxuICAgIHJldHVybiB0aGlzLmV4ZWN1dGUoVmVyYklkLlNlbmRNZXNzYWdlVG9QYXJlbnQsIHBhcmFtZXRlcnMpLnRoZW4oKCkgPT4ge1xuICAgICAgcmV0dXJuO1xuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIHNldENsaWNrVGhyb3VnaEFzeW5jKGNsaWNrVGhyb3VnaEVuYWJsZWQ6IGJvb2xlYW4sIGV4dGVuc2lvblpvbmVJZDogbnVtYmVyKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgRXJyb3JIZWxwZXJzLnZlcmlmeVBhcmFtZXRlclR5cGUoY2xpY2tUaHJvdWdoRW5hYmxlZCwgJ2Jvb2xlYW4nLCAnY2xpY2tUaHJvdWdoRW5hYmxlZCcpO1xuXG4gICAgaWYgKGV4dGVuc2lvblpvbmVJZCA9PT0gdW5kZWZpbmVkIHx8IGV4dGVuc2lvblpvbmVJZCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgVGFibGVhdUVycm9yKEVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgJ0V4dGVuc2lvbiBJZCBpcyBpbnZhbGlkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhcmFtZXRlcnM6IEV4ZWN1dGVQYXJhbWV0ZXJzID0ge1xuICAgICAgW1BhcmFtZXRlcklkLkV4dGVuc2lvblpvbmVJZF06IGV4dGVuc2lvblpvbmVJZCxcbiAgICAgIFtQYXJhbWV0ZXJJZC5DbGlja1Rocm91Z2hFbmFibGVkXTogY2xpY2tUaHJvdWdoRW5hYmxlZCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZShWZXJiSWQuU2V0Q2xpY2tUaHJvdWdoLCBwYXJhbWV0ZXJzKS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybjtcbiAgICB9KTtcbiAgfVxufVxuIiwiaW1wb3J0IHsgSW50ZXJuYWxBcGlEaXNwYXRjaGVyIH0gZnJvbSAnQHRhYmxlYXUvYXBpLWludGVybmFsLWNvbnRyYWN0LWpzJztcbmltcG9ydCB7IEFwaVNlcnZpY2VSZWdpc3RyeSB9IGZyb20gJ0B0YWJsZWF1L2FwaS1zaGFyZWQtanMnO1xuaW1wb3J0IHsgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbCB9IGZyb20gJy4vSW1wbC9Jbml0aWFsaXphdGlvblNlcnZpY2VJbXBsJztcbmltcG9ydCB7IFNldHRpbmdzU2VydmljZUltcGwgfSBmcm9tICcuL0ltcGwvU2V0dGluZ3NTZXJ2aWNlSW1wbCc7XG5pbXBvcnQgeyBVSVNlcnZpY2VJbXBsIH0gZnJvbSAnLi9JbXBsL1VJU2VydmljZUltcGwnO1xuaW1wb3J0IHsgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQgfSBmcm9tICcuL1NlcnZpY2VSZWdpc3RyeVV0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJBbGxFeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgU2V0dGluZ3NTZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCkpO1xuICBBcGlTZXJ2aWNlUmVnaXN0cnkuZ2V0KEV4dGVuc2lvbnNSZWdpc3RyeUlkKS5yZWdpc3RlclNlcnZpY2UobmV3IFVJU2VydmljZUltcGwoZGlzcGF0Y2hlciwgRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVySW5pdGlhbGl6YXRpb25FeHRlbnNpb25zU2VydmljZXMoZGlzcGF0Y2hlcjogSW50ZXJuYWxBcGlEaXNwYXRjaGVyKTogdm9pZCB7XG4gIEFwaVNlcnZpY2VSZWdpc3RyeS5nZXQoRXh0ZW5zaW9uc1JlZ2lzdHJ5SWQpLnJlZ2lzdGVyU2VydmljZShuZXcgSW5pdGlhbGl6YXRpb25TZXJ2aWNlSW1wbChkaXNwYXRjaGVyLCBFeHRlbnNpb25zUmVnaXN0cnlJZCkpO1xufVxuIiwiZXhwb3J0IGNvbnN0IEV4dGVuc2lvbnNSZWdpc3RyeUlkID0gMDtcbiIsIi8vIFRoZSBtb2R1bGUgY2FjaGVcbnZhciBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX18gPSB7fTtcblxuLy8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbmZ1bmN0aW9uIF9fd2VicGFja19yZXF1aXJlX18obW9kdWxlSWQpIHtcblx0Ly8gQ2hlY2sgaWYgbW9kdWxlIGlzIGluIGNhY2hlXG5cdHZhciBjYWNoZWRNb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdO1xuXHRpZiAoY2FjaGVkTW9kdWxlICE9PSB1bmRlZmluZWQpIHtcblx0XHRyZXR1cm4gY2FjaGVkTW9kdWxlLmV4cG9ydHM7XG5cdH1cblx0Ly8gQ3JlYXRlIGEgbmV3IG1vZHVsZSAoYW5kIHB1dCBpdCBpbnRvIHRoZSBjYWNoZSlcblx0dmFyIG1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF0gPSB7XG5cdFx0Ly8gbm8gbW9kdWxlLmlkIG5lZWRlZFxuXHRcdC8vIG5vIG1vZHVsZS5sb2FkZWQgbmVlZGVkXG5cdFx0ZXhwb3J0czoge31cblx0fTtcblxuXHQvLyBFeGVjdXRlIHRoZSBtb2R1bGUgZnVuY3Rpb25cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4iLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLm8gPSAob2JqLCBwcm9wKSA9PiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCkpIiwiLy8gZGVmaW5lIF9fZXNNb2R1bGUgb24gZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5yID0gKGV4cG9ydHMpID0+IHtcblx0aWYodHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgJiYgU3ltYm9sLnRvU3RyaW5nVGFnKSB7XG5cdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cdH1cblx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICdfX2VzTW9kdWxlJywgeyB2YWx1ZTogdHJ1ZSB9KTtcbn07IiwiLyoqXG4gKiBUaGlzIGlzIHlvdXIgbWFpbi4gVGhpcyBpcyB3aGVyZSB5b3UgcmUtZXhwb3J0IGV2ZXJ5dGhpbmcgeW91IHdhbnQgdG8gYmUgcHVibGljbHkgYXZhaWxhYmxlLlxuICpcbiAqIFRoZSBidWlsZCBlbmZvcmNlcyB0aGF0IHRoZSBmaWxlIGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBnbG9iYWwgdmFyaWFibGUgdGhhdCBpcyBleHBvcnRlZC5cbiAqL1xuXG5pbXBvcnQgeyBBcGlWZXJzaW9uIH0gZnJvbSAnQHRhYmxlYXUvYXBpLXNoYXJlZC1qcyc7XG5cbi8vIER1ZSB0byB0aGUgd2F5IHdlIGNvbmZpZ3VyZWQgd2VicGFjaywgd2Ugc2hvdWxkIGJlIGV4cG9ydGluZyB0aGluZ3Mgd2hpY2ggd2lsbCBiZSB1bmRlclxuLy8gYSBnbG9iYWwgdmFyaWFibGUgY2FsbGVkIFwidGFibGVhdVwiLiBFeHBvcnQgZXZlcnl0aGluZyB3ZSB3YW50IHRvIGJlIHZpc2libGUgdW5kZXIgdGFibGVhdVxuLy8gZnJvbSB0aGlzIGZpbGUuXG5pbXBvcnQgeyBFeHRlbnNpb25zSW1wbCB9IGZyb20gJy4vRXh0ZW5zaW9uc0FwaS9JbXBsL0V4dGVuc2lvbnNJbXBsJztcbmltcG9ydCB7IEV4dGVuc2lvbnMgfSBmcm9tICcuL0V4dGVuc2lvbnNBcGkvTmFtZXNwYWNlcy9FeHRlbnNpb25zJztcblxuZGVjbGFyZSBsZXQgVkVSU0lPTl9JU19BTFBIQTogYm9vbGVhbjtcbmNvbnN0IGlzQWxwaGE6IGJvb2xlYW4gPSB0eXBlb2YgVkVSU0lPTl9JU19BTFBIQSAhPT0gJ3VuZGVmaW5lZCcgPyBWRVJTSU9OX0lTX0FMUEhBIDogZmFsc2U7XG5cbmRlY2xhcmUgbGV0IEFQSV9WRVJTSU9OX05VTUJFUjogc3RyaW5nO1xuQXBpVmVyc2lvbi5TZXRWZXJzaW9uTnVtYmVyKHR5cGVvZiBBUElfVkVSU0lPTl9OVU1CRVIgIT09ICd1bmRlZmluZWQnID8gQVBJX1ZFUlNJT05fTlVNQkVSIDogJzAuMC4wJywgaXNBbHBoYSk7XG5cbmNvbnN0IGV4dGVuc2lvbkltcGwgPSBuZXcgRXh0ZW5zaW9uc0ltcGwoKTtcbmV4cG9ydCBjb25zdCBleHRlbnNpb25zID0gbmV3IEV4dGVuc2lvbnMoZXh0ZW5zaW9uSW1wbCk7XG5cbi8vIEV4cG9ydCBFbnVtc1xuLy8gVGhlc2Ugc2hvdyB1cCB1bmRlciB0aGUgdGFibGVhdSBvYmplY3QuIEkuZS4gdGFibGVhdS5FeHRlbnNpb25Db250ZXh0LlNlcnZlclxuZXhwb3J0IHtcbiAgQW5hbHl0aWNzT2JqZWN0VHlwZSxcbiAgQW5ub3RhdGlvblR5cGUsXG4gIENsYXNzTmFtZUtleSxcbiAgQ29sdW1uVHlwZSxcbiAgRGFzaGJvYXJkTGF5b3V0Q2hhbmdlLFxuICBEYXNoYm9hcmRPYmplY3RUeXBlLFxuICBEYXNoYm9hcmRPYmplY3RWaXNpYmlsaXR5VHlwZSxcbiAgRGF0YVR5cGUsXG4gIERhdGVSYW5nZVR5cGUsXG4gIERpYWxvZ1N0eWxlLFxuICBFbmNvZGluZ1R5cGUsXG4gIEVycm9yQ29kZXMsXG4gIEV4cG9ydGVkTWVkaWFUeXBlLFxuICBFeHRlbnNpb25Db250ZXh0LFxuICBFeHRlbnNpb25Nb2RlLFxuICBGaWVsZEFnZ3JlZ2F0aW9uVHlwZSxcbiAgRmllbGRSb2xlVHlwZSxcbiAgRmlsdGVyRG9tYWluVHlwZSxcbiAgRmlsdGVyTnVsbE9wdGlvbixcbiAgRmlsdGVyVHlwZSxcbiAgRmlsdGVyVXBkYXRlVHlwZSxcbiAgSGllcmFyY2hpY2FsTGV2ZWxTZWxlY3Rpb25TdGF0ZSxcbiAgSW5jbHVkZURhdGFWYWx1ZXNPcHRpb24sXG4gIE1hcmtUeXBlLFxuICBQYXJhbWV0ZXJWYWx1ZVR5cGUsXG4gIFBlcmlvZFR5cGUsXG4gIFF1aWNrVGFibGVDYWxjVHlwZSxcbiAgUmVsYXRpdmVEYXRlRmlsdGVyT3B0aW9ucyxcbiAgUmVwbGF5U3BlZWRUeXBlLFxuICBTZWxlY3Rpb25VcGRhdGVUeXBlLFxuICBTZWxlY3RPcHRpb25zLFxuICBTaGVldFR5cGUsXG4gIFNvcnREaXJlY3Rpb24sXG4gIFRhYmxlYXVFdmVudFR5cGUsXG4gIFRyZW5kTGluZU1vZGVsVHlwZSxcbiAgVml6SW1hZ2VFbmNvZGluZ1R5cGUsXG4gIFZpekltYWdlUGFsZXR0ZVR5cGUsXG4gIFZpekltYWdlU2l6ZVNldHRpbmdBbGlnbm1lbnRUeXBlLFxuICBWaXpJbWFnZVNpemVTZXR0aW5nVHlwZSxcbiAgVml6SW1hZ2VTb3J0RGlyZWN0aW9uVHlwZSxcbiAgWm9uZVZpc2liaWxpdHlUeXBlLFxufSBmcm9tICdAdGFibGVhdS9hcGktZXh0ZXJuYWwtY29udHJhY3QtanMnO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9 \ 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 c246e999..7c8909b0 100644 --- a/lib/tableau.extensions.1.latest.min.js +++ b/lib/tableau.extensions.1.latest.min.js @@ -1,2 +1,2 @@ -(()=>{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,isExtensionDialog:e};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 i=e.extensionEnvironment.platformVersion?e.extensionEnvironment.platformVersion:{major:1,minor:9,fix:0};return n.VersionedExternalApiDispatcher.needsVersionConverter(i)&&(a=new n.VersionedExternalApiDispatcher(a,i)),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(t)),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,t){super(a.TableauEventType.DialogMessageReceived),this.message=e,this.sourceDialogUrl=t}}t.DialogMessageEvent=d;class c extends s.TableauError{constructor(e,t){super(e,t),Object.setPrototypeOf(this,c.prototype)}}t.TableauDialogError=c,t.UIImpl=class{constructor(e){this.isExtensionDialog=e}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(((s,l)=>{o.displayDialogAsync(e,t||"",this.isExtensionDialog,r).then((()=>{const e=d.registerHandler(n.NotificationId.ExtensionDialogUpdate,(()=>!0),(t=>{if(t.isCloseEvent){if(void 0===t.closePayload)throw new c(a.ErrorCodes.InternalError,"closePayload is undefined");s(t.closePayload)}else l(new c(i.ErrorCodes.DialogClosedByUser,"Extension dialog closed by user."));e()}))})).catch((e=>{l(e)}))}))}sendDialogMessageAsync(e,t){s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService").sendDialogMessageAsync(e,t)}sendDialogMessageToParentAsync(e){if(!this.isExtensionDialog)throw new s.TableauError(i.ErrorCodes.InternalError,"sendDialogMessageToParentAsync can only be called from an extension dialog.");s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService").sendDialogMessageToParentAsync(e)}closeDialog(e,t){s.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService").closeDialog(e,t)}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.sourceDialogUrl)))})),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)}sendDialogMessageToParentAsync(e){return this._impl.sendDialogMessageToParentAsync(e)}closeDialog(e,t){this._impl.closeDialog(e,t)}}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,o){const l={[i.ParameterId.FunctionName]:"displayDialogAsync",[i.ParameterId.ExtensionDialogUrl]:e,[i.ParameterId.ExtensionDialogPayload]:t};r&&(l[i.ParameterId.ExtensionDialogUrlSource]=window.location.href);const d=o&&o.height?o.height:400,c=o&&o.width?o.width:600,u=o&&o.dialogStyle?o.dialogStyle:s;if(d<=0||c<=0)throw new n.TableauError(a.ErrorCodes.InvalidParameter,"Size parameters for displayDialogAsync must be positive");return l[i.ParameterId.ExtensionDialogH]=d,l[i.ParameterId.ExtensionDialogW]=c,n.ErrorHelpers.verifyEnumValue(u,a.DialogStyle,"DialogStyle"),l[i.ParameterId.ExtensionDialogStyle]=n.ExternalToInternalEnumMappings.dialogStyles.convert(u),this.execute(i.VerbId.DisplayDialog,l).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,t){const r={[i.ParameterId.FunctionName]:"closeDialog",[i.ParameterId.ExtensionDialogUrlSource]:window.location.href};return e&&(r[i.ParameterId.ExtensionDialogPayload]=e),t&&(r[i.ParameterId.ExtensionDialogUrl]=t),this.execute(i.VerbId.CloseDialog,r).then((()=>{}))}sendDialogMessageAsync(e,t){const r={[i.ParameterId.FunctionName]:"sendDialogMessage",[i.ParameterId.ExtensionDialogMessage]:e,[i.ParameterId.ExtensionDialogUrlSource]:window.location.href};return t&&(r[i.ParameterId.ExtensionDialogUrl]=t),this.execute(i.VerbId.SendDialogMessage,r).then((()=>{}))}sendDialogMessageToParentAsync(e){const t={[i.ParameterId.FunctionName]:"sendMessageToParent",[i.ParameterId.ExtensionDialogMessage]:e,[i.ParameterId.ExtensionDialogUrlSource]:window.location.href};return this.execute(i.VerbId.SendMessageToParent,t).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,P,A,_,D,w,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",e.IsoYears="iso-years",e.IsoQuarters="iso-quarters",e.IsoWeeks="iso-weeks"}(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"}(P=e.SelectOptions||(e.SelectOptions={})),function(e){e.Dashboard="dashboard",e.Story="story",e.Worksheet="worksheet"}(A=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"}(D=e.TrendLineModelType||(e.TrendLineModelType={})),function(e){e.Slow="slow",e.Normal="normal",e.Fast="fast"}(w=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.SelectionUpdateType=a.SelectionUpdateType,t.SelectOptions=a.SelectOptions,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,P,A,_,D,w,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",(w=t.EncodedDataType||(t.EncodedDataType={})).Number="number",w.String="string",w.Date="date",w.Boolean="boolean",(D=t.ErrorCodes||(t.ErrorCodes={})).INITIALIZATION_ERROR="initialization-error",D.INTERNAL_ERROR="internal-error",D.MISSING_ENUM_MAPPING="missing-enum-mapping",D.MISSING_PARAMETER="missing-parameter",D.PERMISSION_DENIED="permission-denied",D.PRES_MODEL_PARSING_ERROR="pres-model-parsing-error",D.VERSION_NOT_CONFIGURED="version-not-configured",D.VISIBILITY_ERROR="visibility-error",D.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",(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",(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",b.IsoYears="iso-years",b.IsoQuarters="iso-quarters",b.IsoWeeks="iso-weeks",(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.ExtensionDialogUrlSource="extension-dialog-url-source",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.SendMessageToParent="send-message-to-parent",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"];function s(e){e.allowableValuesType===a.DomainRestrictionType.Range&&(e.dateStepPeriod===a.DateStepPeriod.IsoYears?e.dateStepPeriod=a.DateStepPeriod.Years:e.dateStepPeriod===a.DateStepPeriod.IsoQuarters?e.dateStepPeriod=a.DateStepPeriod.Quarters:e.dateStepPeriod===a.DateStepPeriod.IsoWeeks&&(e.dateStepPeriod=a.DateStepPeriod.Weeks))}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},t.DowngradePeriodType=function(e){if(Array.isArray(e.result)){const t=e.result;for(const e of t)s(e)}else s(e.result);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 P=r(6368);t.Point=P.Point,a(r(8672)),a(r(3008));var A=r(1832);t.ClientInfoServiceImpl=A.ClientInfoServiceImpl;var _=r(1288);t.NotificationServiceImpl=_.NotificationServiceImpl;var D=r(8808);t.NotificationServiceImplBase=D.NotificationServiceImplBase,t.Registration=D.Registration;var w=r(1776);t.ServiceImplBase=w.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,[a.PeriodType.IsoYears]:i.DateStepPeriod.IsoYears,[a.PeriodType.IsoQuarters]:i.DateStepPeriod.IsoQuarters,[a.PeriodType.IsoWeeks]:i.DateStepPeriod.IsoWeeks}),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,[i.DateStepPeriod.IsoYears]:a.PeriodType.IsoYears,[i.DateStepPeriod.IsoQuarters]:a.PeriodType.IsoQuarters,[i.DateStepPeriod.IsoWeeks]:a.PeriodType.IsoWeeks}),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:()=>A,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 P(e,t,r,a,i,n,s){return T(r^(t|~a),e,t,i,n,s)}const A=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=w(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":191,"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.16.0-pre.5",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.16.0-pre.5.min.js.map \ No newline at end of file +(()=>{var e={74: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 o(e){try{l(a.next(e))}catch(e){n(e)}}function s(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(o,s)}l((a=a.apply(e,t||[])).next())})};Object.defineProperty(t,"__esModule",{value:!0}),t.ExtensionsImpl=void 0;const i=r(5691),n=r(6636),o=r(7464),s=r(7944),l=r(494),d=r(9680),c=r(3713),u=r(7879),p=r(4301),m=r(3694),h=r(8484),g=r(8413),y=r(7736),v=r(8518),I=r(3156),S=r(4227),f=r(4633),b=r(8013),T=r(5144),P=r(3834);t.ExtensionsImpl=class{initializeAsync(e,t){return this._initializationPromise||(this._initializationPromise=new Promise((r,a)=>{const i={isAlpha:o.ApiVersion.Instance.isAlpha,isExtensionDialog:e};if(f.LegacyInternalApiDispatcherHolder.hasDesktopApiDispatcherPromise(i)){const n=f.LegacyInternalApiDispatcherHolder.getDesktopDispatcherPromise(i);null==n||n.then(r=>this.onDispatcherReceived(r,e,t)).then(e=>{r(e)}).catch(e=>{a(e)})}else{const s=this.onDispatcherReceived.bind(this);(0,o.doCrossFrameBootstrap)(window,n.INTERNAL_CONTRACT_VERSION,i).then(r=>s(r,e,t)).then(e=>{r(e)}).catch(e=>{a(e)})}})),this._initializationPromise}reportExtensionRenderComplete(e){return a(this,void 0,void 0,function*(){return o.ApiServiceRegistry.get(v.ExtensionsRegistryId).getService("export-service").reportExtensionRenderComplete(e)})}createVizImageAsync(e){return o.ApiServiceRegistry.get(v.ExtensionsRegistryId).getService("viz-service").createVizImageAsync(e)}setClickThroughAsync(e){return o.ApiServiceRegistry.get(v.ExtensionsRegistryId).getService("UIService").setClickThroughAsync(e,this.extensionZoneId)}isDashboardExtensionLocator(e){if(!e.dashboardPath)throw new o.TableauError(i.ErrorCodes.InternalError,"Unexpected error during initialization.");return!0}onDispatcherReceived(e,t,r){let a=e(n.INTERNAL_CONTRACT_VERSION);(0,y.registerInitializationExtensionsServices)(a);const i=o.ApiServiceRegistry.get(v.ExtensionsRegistryId).getService("InitializationService"),s=r?Object.keys(r):[];return i.initializeDashboardExtensionsAsync(t,s).then(e=>{const i=e.extensionEnvironment.platformVersion?e.extensionEnvironment.platformVersion:{major:1,minor:9,fix:0};return o.VersionedExternalApiDispatcher.needsVersionConverter(i)&&(a=new o.VersionedExternalApiDispatcher(a,i)),(0,o.registerAllSharedServices)(a,v.ExtensionsRegistryId),(0,y.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 u.Environment(e.extensionEnvironment),this.settings=this.initializeSettings(e.extensionSettingsInfo),this.ui=new m.UI(new P.UIImpl(t)),this.workbook=new l.Workbook(new S.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){o.ApiServiceRegistry.get(v.ExtensionsRegistryId).getService("notification-service").registerHandler(n.NotificationId.WorkbookFormattingChanged,()=>!0,t=>{t&&(this.initializeTableauFonts(e,t),this.applyAllFormatting(t))})}initializeTableauFonts(e,t){const r=[...I.SupportedBentonSansFontFaces,...T.SupportedTableauFontFaces];if(t.formattingSheets.forEach(e=>{e.cssProperties.fontFamily&&r.push(e.cssProperties.fontFamily)}),r.length>0){const t={[n.ParameterId.FontNameListItems]:r};e.execute(n.VerbId.GetFonts,t).then(e=>{this.loadFonts(e.result)}).catch()}}loadFonts(e){e.forEach(e=>{T.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 o.SheetInfoImpl(e.name,i.SheetType.Dashboard,{width:e.size.w,height:e.size.h},void 0,!0),a=new o.DashboardImpl(r,e.zones,t,v.ExtensionsRegistryId,null,e.activeDashboardObjectId),n=new s.Dashboard(a);return new c.DashboardContent(n)}initializeWorksheetContent(e){const t=new o.SheetInfoImpl(e.visualId.worksheet,i.SheetType.Worksheet,{width:e.size.w,height:e.size.h},void 0,!0),r=new o.WorksheetImpl(t,v.ExtensionsRegistryId,e.visualId,null,null,e.backgroundColor,h.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.formatting)),a=new d.Worksheet(r);return new g.WorksheetContent(a)}initializeSettings(e){const t=new b.SettingsImpl(e);return new p.Settings(t)}initializeContextMenuCallbacks(e){o.ApiServiceRegistry.get(v.ExtensionsRegistryId).getService("notification-service").registerHandler(n.NotificationId.ContextMenuClick,()=>!0,t=>{if(e){if(!e[t.id])throw new o.TableauError(i.ErrorCodes.InternalError,`Received unexpected context menu Id from event: ${t.id}`);e[t.id]()}})}loadTableauFonts(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 o.TableauError(i.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 o.TableauError(i.ErrorCodes.InternalError,`'attempted to load unsupported font: ${e.fontName}.'`)}}}},130:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ShouldThrow=t.EnumConverter=void 0;const a=r(5691),i=r(3267);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=n={}))},154:e=>{"use strict";var t;!function(e){let t,r,a,i,n,o,s,l,d,c;!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.Image="image",e.Pdf="pdf",e.Svg="svg",e.Html="html",e.PowerPoint="powerpoint",e.Excel="excel"}(i=e.ExportedMediaType||(e.ExportedMediaType={})),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"}(n=e.TableauEventType||(e.TableauEventType={})),function(e){e.Discrete="discrete",e.Continuous="continuous"}(o=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"}(l=e.VizImagePaletteType||(e.VizImagePaletteType={})),function(e){e.Fixed="fixed",e.Manual="manual"}(d=e.VizImageSizeSettingType||(e.VizImageSizeSettingType={})),function(e){e.Right="right",e.Left="left",e.Center="center"}(c=e.VizImageSizeSettingAlignmentType||(e.VizImageSizeSettingAlignmentType={}))}(t||(t={})),e.exports=t},370:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.SharedErrorCodes=void 0,function(e){e.CrosstabCreationError="crosstab-creation-error",e.DataCreationError="data-creation-error",e.InvalidAggregationFieldName="invalid-aggregation-field-name",e.InvalidFilterFieldName="invalid-filter-name",e.InvalidFilterFieldValue="invalid-filter-fieldValue",e.InvalidSelectionDate="invalid-selection-date",e.InvalidSelectionFieldName="invalid-selection-fieldName",e.InvalidSelectionValue="invalid-selection-value",e.InvalidSelectionSheet="invalid-selection-sheet",e.InternalError="internal-error",e.InvalidParameter="invalid-parameter",e.PDFCreationError="pdf-creation-error",e.PowerPointCreationError="powerpoint-creation-error",e.NotActiveSheet="not-active-sheet",e.ImplementationError="wrong-implementation",e.ApiExecutionError="api-execution-error",e.ServerError="server-error",e.Timeout="timeout"}(r||(t.SharedErrorCodes=r={}))},385:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CrossFrameMessenger=void 0;const a=r(1966),i=r(6636),n=r(522),o=r(8531),s=r(8709);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:s.MessageType.Initialize,crossFrameVersion:t,apiVersion:e,options:r};return this.prepareMessage(i)}prepareCommandMessage(e,t){const r={msgGuid:a.raw(),msgType:s.MessageType.Command,verbId:e,parameters:t};return this.prepareMessage(r)}prepareCommandResponseMessage(e,t,r){const i={msgGuid:a.raw(),msgType:s.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:s.MessageType.Notification,notificationId:e,data:t};return this.prepareMessage(r)}prepareAckMessage(){const e={msgGuid:a.raw(),msgType:s.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((0,o.isMessage)(t))switch(t.msgType){case s.MessageType.Initialize:if(!(0,o.isInitMessage)(t)||!this.initializeMessageHandler)return;this.initializeMessageHandler(t,e.source);break;case s.MessageType.CommandResponse:if(!(0,o.isCommandResponseMessage)(t)||!this.commandResponseMessageHandler)return;this.commandResponseMessageHandler(t,e.source);break;case s.MessageType.Command:if(!(0,o.isCommandMessage)(t)||!this.commandMessageHandler)return;this.commandMessageHandler(t,e.source);break;case s.MessageType.Notification:if(!(0,o.isNotificationMessage)(t)||!this.notificationMessageHandler)return;this.notificationMessageHandler(t,e.source);break;case s.MessageType.Handshake:if(!(0,o.isHandshakeMessage)(t)||!this.handshakeMessageHandler)return;this.handshakeMessageHandler(t,e.source)}}setOtherWindow(e){this.otherWindow=e}setOtherWindowOrigin(e){this.otherWindowOrigin=e}}},386:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},396:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExternalStackingVersionConverter=void 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}}},407:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SettingsServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(7464);class o 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=o},460:function(e,t,r){"use strict";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,i)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),i=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.Toolbar=t.TableauDialogType=t.SheetSizeBehavior=t.PulseTimeDimension=t.PulseLayout=t.PulseErrorMessageVisibility=t.PrintScaling=t.PrintPageSize=t.PrintOrientation=t.EmbeddingTableauEventType=t.EmbeddingErrorCodes=t.DeviceType=t.CrosstabFileFormat=t.ApiMenuType=void 0,i(r(6835),t);var n=r(5848);Object.defineProperty(t,"ApiMenuType",{enumerable:!0,get:function(){return n.ApiMenuType}}),Object.defineProperty(t,"CrosstabFileFormat",{enumerable:!0,get:function(){return n.CrosstabFileFormat}}),Object.defineProperty(t,"DeviceType",{enumerable:!0,get:function(){return n.DeviceType}}),Object.defineProperty(t,"EmbeddingErrorCodes",{enumerable:!0,get:function(){return n.EmbeddingErrorCodes}}),Object.defineProperty(t,"EmbeddingTableauEventType",{enumerable:!0,get:function(){return n.TableauEventType}}),Object.defineProperty(t,"PrintOrientation",{enumerable:!0,get:function(){return n.PrintOrientation}}),Object.defineProperty(t,"PrintPageSize",{enumerable:!0,get:function(){return n.PrintPageSize}}),Object.defineProperty(t,"PrintScaling",{enumerable:!0,get:function(){return n.PrintScaling}}),Object.defineProperty(t,"PulseErrorMessageVisibility",{enumerable:!0,get:function(){return n.PulseErrorMessageVisibility}}),Object.defineProperty(t,"PulseLayout",{enumerable:!0,get:function(){return n.PulseLayout}}),Object.defineProperty(t,"PulseTimeDimension",{enumerable:!0,get:function(){return n.PulseTimeDimension}}),Object.defineProperty(t,"SheetSizeBehavior",{enumerable:!0,get:function(){return n.SheetSizeBehavior}}),Object.defineProperty(t,"TableauDialogType",{enumerable:!0,get:function(){return n.TableauDialogType}}),Object.defineProperty(t,"Toolbar",{enumerable:!0,get:function(){return n.Toolbar}}),i(r(3219),t),i(r(9336),t),i(r(3359),t),i(r(6707),t),i(r(6877),t),i(r(9770),t)},494:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Workbook=void 0,t.Workbook=class{constructor(e){this._workbookImpl=e}getAllDataSourcesAsync(){return this._workbookImpl.getAllDataSourcesAsync()}}},522:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CrossFramePreparedMessage=void 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}}},608:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataValue=t.Column=t.MarkInfo=t.DataTable=void 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}}},633:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SheetUtils=void 0;const a=r(5691),i=r(6636),n=r(3267);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 o=0===t&&0===i;return{behavior:a.SheetSizeBehavior.Range,minSize:{width:t,height:r},maxSize:{width:o?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}}},636:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorkbookFormattingChangedEvent=void 0;const a=r(5691),i=r(9577);class n extends i.TableauEvent{constructor(e){super(a.TableauEventType.WorkbookFormattingChanged),this._formatting=e}get formatting(){return this._formatting}}t.WorkbookFormattingChangedEvent=n},677:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExternalContextMenuServiceImpl=void 0;const a=r(6636),i=r(1891);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,o={[a.ParameterId.FunctionName]:"renameContextMenuAsync",[a.ParameterId.WorksheetName]:e,[a.ParameterId.ExternalMenuHeader]:r,[a.ParameterId.ExternalMenuDescription]:i};return this.execute(n,o).then(e=>{})}}t.ExternalContextMenuServiceImpl=n},720:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Param=void 0;const a=r(5691),i=r(3267),n=r(2782);class o{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(o.isTypeNumber(e))return o.serializeNumberForPlatform(e);if(o.isTypeDate(e))return o.serializeDateForPlatform(e);if(o.isTypeBool(e))return o.serializeBooleanForPlatform(e);if(o.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(o.isNullOrUndefined(e))return{success:!1};if(o.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=o},742:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},751:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Sheet=void 0;const a=r(5691),i=r(7464),n=r(5231);class o 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=o},769:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauWorksheetEvent=void 0;const a=r(964);class i extends a.TableauSheetEvent{get worksheet(){return this._worksheet}constructor(e,t){super(e,t),this._worksheet=t}}t.TableauWorksheetEvent=i},770:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorkbookImpl=void 0,t.WorkbookImpl=class{}},822:(e,t)=>{"use strict";var r,a,i;Object.defineProperty(t,"__esModule",{value:!0}),t.VizOptionNames=void 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_COUNT=":embcount",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={})),function(e){e.Size=":size",e.Embed=":embed",e.EmbedCount=":embcount",e.ApiInternalVersion=":apiInternalVersion",e.ApiExternalVersion=":apiExternalVersion",e.ShowVizHome=":showVizHome",e.Jsdebug=":jsdebug",e.BootstrapWhenNotified=":bootstrapWhenNotified",e.NavType="navType",e.NavSrc="navSrc",e.debug=":jsdebug",e.ApiID=":apiID",e.disableUrlActionsPopups=":disableUrlActionsPopups",e.hideTabs=":tabs",e.toolbar=":toolbar",e.device=":device",e.instanceIdToClone=":iid",e.touchOptimize="mobile",e.hideEditButton=":hideEditButton",e.hideEditInDesktopButton=":hideEditInDesktopButton",e.suppressDefaultEditBehavior=":suppressDefaultEditBehavior",e.hideCloseButton=":hideCloseButton"}(i||(t.VizOptionNames=i={}))},895:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardObject=void 0;const a=r(7944),i=r(9680);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}}},964:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauSheetEvent=void 0;const a=r(9577);class i extends a.TableauEvent{get sheet(){return this._sheet}constructor(e,t){super(e),this._sheet=t}}t.TableauSheetEvent=i},1262:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExternalIdentityVersionConverter=void 0,t.ExternalIdentityVersionConverter=class{downgradeExecuteCall(e,t){return{verb:e,parameters:t}}upgradeExecuteReturn(e,t,r){return e}upgradeNotification(e){return e}}},1273:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.GetDataType=void 0,function(e){e.Summary="summary",e.Underlying="underlying"}(r||(t.GetDataType=r={}))},1401:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataSourceServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(4602),o=r(8127),s=r(7887),l=r(7832),d=r(3267),c=r(1891);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 o.Field(new l.FieldImpl(e,t))}convertDataSource(e){return new n.DataSource(new s.DataSourceImpl(e,this._registryId))}}t.DataSourceServiceImpl=u},1471:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StoryPointInfoImpl=void 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}}},1592:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TooltipTextRequestModel=void 0,t.TooltipTextRequestModel=class{constructor(e,t){this.visualIdPresModel=e,this.tupleId=t}}},1596:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},1611:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.NotificationServiceImpl=void 0;const a=r(8194);class i extends a.NotificationServiceImplBase{get serviceName(){return"notification-service"}}t.NotificationServiceImpl=i},1615:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ClientInfoServiceImpl=void 0;const a=r(6636),i=r(1891);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},1647:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},1768:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.AskDataOptionNames=void 0,function(e){e.token="token",e.origin="origin",e.showEmbed="showEmbed",e.showPin="showPin",e.showSave="showSave",e.showShare="showShare",e.debug=":jsdebug",e.ApiID=":apiID",e.ApiExternalVersion=":apiExternalVersion",e.ApiInternalVersion=":apiInternalVersion",e.AskDataWebComponent=":askDataWebComponent"}(r||(t.AskDataOptionNames=r={}))},1871:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableSummary=void 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}}},1891:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ServiceImplBase=void 0;const a=r(6753),i=r(3267),n=r(130);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)})}}},1966: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}),t.HoverTupleInteractionModel=t.SelectTuplesInteractionModel=t.SelectionModelsContainer=t.TupleSelectionModel=t.DimensionSelectionModel=t.RangeSelectionModel=t.HierarchicalSelectionModel=t.ValueSelectionModel=t.SelectionModel=void 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}}},2140:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ApiServiceRegistry=void 0;const a=r(5691),i=r(3267);"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 o{static get(e){if(window.__tableauApiServiceRegistry&&window.__tableauApiServiceRegistry[e]||o.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=o},2219:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.VerbId=void 0,function(e){e.ActivateNextStoryPoint="activate-next-story-point",e.ActivatePreviousStoryPoint="activate-previous-story-point",e.ActivateSheet="activateSheet",e.ActivateStoryPoint="activate-story-point",e.AddMarksCardFields="add-marks-card-fields",e.AppendExternalMenuItem="append-external-menu-item",e.ApplyCategoricalFilter="categorical-filter",e.ApplyPulseFilters="apply-pulse-filters",e.ApplyPulseTimeDimension="apply-pulse-time-dimension",e.ApplyRangeFilter="range-filter",e.ApplyRelativeDateFilter="apply-relative-date-Filter",e.Authenticate="authenticate",e.BlockExtension="block-extension",e.ChangeParameterValue="change-parameter-value",e.ChangeSharedFilter="change-shared-filter",e.ClearAllPulseFilters="clear-all-pulse-filters",e.ClearFilter="clear-filter",e.ClearPulseFilters="clear-pulse-filters",e.ClearSelectedMarks="clear-selected-marks",e.CloseDialog="close-dialog",e.CreateAnnotation="create-annotation",e.DashboardCategoricalFilter="dashboard-categorical-filter",e.DisplayDialog="display-dialog",e.DownloadWorkbook="download-workbook",e.EditAliasesDialog="edit-aliases-dialog",e.ExecuteExternalMenuItem="execute-external-menu-item",e.ExportCrosstab="export-crosstab",e.ExportCrosstabCsvDownload="export-crosstab-csv-download",e.ExportCrosstabExcelDownload="export-crosstab-excel-download",e.ExportData="export-data",e.ExportDataDownload="export-data-download",e.ExportImage="export-image",e.ExportPdf="export-pdf",e.ExportPdfDownload="export-pdf-download",e.ExportPowerpoint="export-powerpoint",e.ExportPowerpointDownload="export-powerpoint-download",e.FindParameter="find-parameter",e.GetActiveTables="get-active-tables",e.GetAllDataSources="get-all-data-sources",e.GetAnnotations="get-annotations",e.GetCategoricalDomain="get-categorical-domain",e.GetConnectionDescriptionSummaries="get-connection-description-summaries",e.GetCurrentSrc="get-current-src",e.GetCustomViews="get-custom-views",e.GetDashboardFilters="get-dashboard-filters",e.GetDataSource="get-datasource",e.GetDataSourceData="get-datasource-data",e.GetDataSources="get-data-sources",e.GetDataSummaryData="get-summary-data",e.GetDataSummaryDataReader="get-summary-data-reader",e.GetDataTableReaderPage="get-data-table-reader-page",e.GetEmbeddingAbstractQueryWithDataModel="get-embedding-abstract-query-with-data-model",e.GetEmbeddingClientInfo="get-embedding-client-info",e.GetVizStateWithDataModel="get-viz-state-with-data-model",e.GetExportCrosstabSheetMap="get-export-crosstab-sheet-map",e.GetExportPdfOptions="get-export-pdf-options",e.GetField="get-field",e.GetFieldAndDataSource="get-field-and-datasource",e.GetVisualSpecification="get-visual-specification",e.GetFilters="get-filters",e.GetFonts="get-fonts",e.GetHighlightedMarks="get-highlighted-marks",e.GetJoinDescription="get-join-description",e.GetLogicalTableData="get-logical-table-data",e.GetLogicalTableDataReader="get-logical-table-data-reader",e.GetLogicalTables="get-logical-tables",e.GetParametersForSheet="get-parameters-for-sheet",e.GetPulseCategoricalDomain="get-pulse-categorical-domain",e.GetPulseFilters="get-pulse-filters",e.GetPulseTimeDimension="get-pulse-time-dimension",e.GetRangeDomain="get-range-domain",e.GetSelectedMarks="get-selected-marks",e.GetSharedFilter="get-shared-filter",e.GetTooltipText="get-tooltip-text",e.GetUnderlyingData="get-underlying-data",e.GetUnderlyingTableData="get-underlying-table-data",e.GetUnderlyingTableDataReader="get-underlying-table-data-reader",e.GetUnderlyingTables="get-underlying-tables",e.HierarchicalFilter="hierachical-filter",e.InitializeExtension="initialize-extension",e.IsAnalyticsAssistantAvailable="is-analytics-assistant-available",e.LaunchAnalyticsAssistant="launch-analytics-assistant",e.MoveAndResizeZones="move-and-resize-zones",e.MoveMarksCardField="move-marks-card-field",e.RaiseLeaveMarkNavNotification="raise-leave-mark-nav-notification",e.RaiseHoverTupleNotification="raise-hover-tuple-notification",e.RaiseSelectTuplesNotification="raise-select-tuples-notification",e.Redo="redo",e.RefreshDataSource="refresh-data-source",e.ReleaseDataTableReader="release-data-table-reader",e.RemoveAnnotation="remove-annotation",e.RemoveCustomView="remove-custom-view",e.RemoveExternalMenuItem="remove-external-menu-item",e.RenameExternalMenu="rename-external-menu",e.ReplayAnimation="replay-animation",e.ReportExtensionRenderComplete="report-extension-render-complete",e.RevertStoryPoint="revert-story-point",e.RevertWorkbook="revert-workbook",e.SaveExtensionSettings="save-extension-settings",e.SaveWorkbookAsCustomView="save-workbook-as-custom-view",e.SelectByValue="select-by-value",e.SetActiveCustomViewAsDefault="set-active-custom-view-as-default",e.SetAutoUpdate="set-auto-update",e.SetClickThrough="set-click-through",e.SendDialogMessage="send-dialog-message",e.SendMessageToParent="send-message-to-parent",e.SetVizStateWithDataModel="set-viz-state-with-data-model",e.SetSheetSize="set-sheet-size",e.SetZoneVisibility="set-zone-visibility",e.Share="share",e.ShowCustomView="show-custom-view",e.SpliceMarksCardFields="splice-marks-card-fields",e.TestConversionVerb="test-conversion-verb",e.Undo="undo",e.UpdateCustomView="update-custom-view",e.VizAPI="viz-api"}(r||(t.VerbId=r={}))},2332:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},2414:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.GetDataServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(5412),o=r(7464),s=r(4369),l=r(608),d=r(5877),c=r(9012),u=r(1273),p=r(1891);class m extends p.ServiceImplBase{constructor(){super(...arguments),this.viewDataTableCacheId=(0,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,o,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(o),[i.ParameterId.ShowDataTableFormat]:s.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,o){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]:s.ExternalToInternalEnumMappings.showDataTableFormatType.convert(o)};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,o,l){const d={[i.ParameterId.FunctionName]:"getLogicalTableDataAsync",[i.ParameterId.ColumnsToInclude]:n,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(o),[i.ParameterId.DataSourceId]:e,[i.ParameterId.IgnoreAliases]:r,[i.ParameterId.LogicalTableId]:t,[i.ParameterId.MaxRows]:this.getLimitedMaxRows(a,this.getMaxRowLimit()+1),[i.ParameterId.ShowDataTableFormat]:s.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,o){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]:s.ExternalToInternalEnumMappings.showDataTableFormatType.convert(o)};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,o,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(o),[i.ParameterId.MaxRows]:this.getLimitedMaxRows(l,this.getMaxRowLimit()+1),[i.ParameterId.ShowDataTableFormat]:s.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,o,l,c,u){r=this.getLimitedMaxRows(r,this.getMaxRowLimit());const p={[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]:o,[i.ParameterId.ColumnsToIncludeById]:this.verifyIncludeColumnArray(l),[i.ParameterId.ShowDataTableFormat]:s.ExternalToInternalEnumMappings.showDataTableFormatType.convert(c),[i.ParameterId.PageRowCount]:r,[i.ParameterId.ApplyWorksheetFormatting]:u};return this.execute(i.VerbId.GetUnderlyingTableDataReader,p).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===m.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 o.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=m,m.summaryTableId=""},2570:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.VersionNumber=void 0;const a=r(5691),i=r(3267);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}`}}},2594:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.UIServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(7464),o=a.DialogStyle.Window;class s extends n.ServiceImplBase{get serviceName(){return"UIService"}displayDialogAsync(e,t,r,s){const l={[i.ParameterId.FunctionName]:"displayDialogAsync",[i.ParameterId.ExtensionDialogUrl]:e,[i.ParameterId.ExtensionDialogPayload]:t};r&&(l[i.ParameterId.ExtensionDialogUrlSource]=window.location.href);const d=s&&s.height?s.height:400,c=s&&s.width?s.width:600,u=s&&s.dialogStyle?s.dialogStyle:o;if(d<=0||c<=0)throw new n.TableauError(a.ErrorCodes.InvalidParameter,"Size parameters for displayDialogAsync must be positive");return l[i.ParameterId.ExtensionDialogH]=d,l[i.ParameterId.ExtensionDialogW]=c,n.ErrorHelpers.verifyEnumValue(u,a.DialogStyle,"DialogStyle"),l[i.ParameterId.ExtensionDialogStyle]=n.ExternalToInternalEnumMappings.dialogStyles.convert(u),this.execute(i.VerbId.DisplayDialog,l).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,t){const r={[i.ParameterId.FunctionName]:"closeDialog",[i.ParameterId.ExtensionDialogUrlSource]:window.location.href};return e&&(r[i.ParameterId.ExtensionDialogPayload]=e),t&&(r[i.ParameterId.ExtensionDialogUrl]=t),this.execute(i.VerbId.CloseDialog,r).then(()=>{})}sendDialogMessageAsync(e,t){const r={[i.ParameterId.FunctionName]:"sendDialogMessage",[i.ParameterId.ExtensionDialogMessage]:e,[i.ParameterId.ExtensionDialogUrlSource]:window.location.href};return t&&(r[i.ParameterId.ExtensionDialogUrl]=t),this.execute(i.VerbId.SendDialogMessage,r).then(()=>{})}sendDialogMessageToParentAsync(e){const t={[i.ParameterId.FunctionName]:"sendMessageToParent",[i.ParameterId.ExtensionDialogMessage]:e,[i.ParameterId.ExtensionDialogUrlSource]:window.location.href};return this.execute(i.VerbId.SendMessageToParent,t).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=s},2616:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},2632:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardImpl=void 0;const a=r(5691),i=r(5691),n=r(6636),o=r(6753),s=r(9357),l=r(2140),d=r(3267),c=r(2782),u=r(9531),p=r(8935),m=r(9735),h=r(3964);class g extends p.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 o="",s="",l=!1;e.sheetInfo?(o=e.sheetInfo.name,s=e.sheetInfo.url||"",l=""===s):o=e.name;const d=new m.SheetInfoImpl(o,i.SheetType.Worksheet,r,this._worksheetsImpl.length,a,l,s),c={worksheet:o,dashboard:this._sheetInfoImpl.name,storyboard:this._sheetPath.storyboard,flipboardZoneID:this._sheetPath.flipboardZoneID,storyPointID:this._sheetPath.storyPointID};t=new h.WorksheetImpl(d,this._registryId,c,this,this._parentStoryPointImpl),e.zoneType===n.DashboardObjectType.Worksheet&&this._worksheetsImpl.push(t)}const l=new s.Point(e.x,e.y),d=new u.DashboardObjectImpl(this,o.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,o=this._activeDashboardObjectId,s=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)}),o!==t&&(0!==t&&this.addChange(t,c,i.DashboardLayoutChange.Selected),0!==o&&this.addChange(o,c,i.DashboardLayoutChange.Deselected)),r&&s!==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},2671:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},2782:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ErrorHelpers=void 0;const a=r(5691),i=r(3267),n=r(720);class o{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(!o.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=o},3069:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},3092:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CustomViewImpl=void 0;const a=r(7464);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)}}},3153:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataTypeConverter=void 0;const a=r(9875);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%"},3156:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SupportedBentonSansFontFaces=t.BentonSansMediumFontFaceName=t.BentonSansLightFontFaceName=t.BentonSansSemiDemiItalicFontFaceName=t.BentonSansSemiDemiFontFaceName=t.BentonSansBookItalicFontFaceName=t.BentonSansBookFontFaceName=t.BentonSansLowDPIFontFamilyName=t.BentonSansFontFamilyName=void 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]},3219:(e,t)=>{"use strict";var r,a,i;Object.defineProperty(t,"__esModule",{value:!0}),t.PulseChildElementAttributes=t.PulseChildElements=t.PulseAttributes=void 0,function(e){e.DisableExploreFilter="disable-explore-filter",e.Layout="layout",e.OnFirstInteractive="onFirstInteractive",e.OnFirstPulseMetricSizeKnown="onFirstPulseMetricSizeKnown",e.OnPulseUrlError="onPulseError",e.OnPulseFiltersChanged="onPulseFiltersChanged",e.OnPulseInsightDiscovered="onPulseInsightDiscovered",e.OnPulseMetricSizeChanged="onPulseMetricSizeChanged",e.OnPulseTimeDimensionChanged="onPulseTimeDimensionChanged",e.OnPulseUrlChanged="onPulseUrlChanged",e.TimeDimension="time-dimension",e.TokenOptional="token-optional"}(r||(t.PulseAttributes=r={})),function(e){e.IframeStyle="iframe-style",e.ThemeParameter="theme-parameter",e.PulseFilter="pulse-filter"}(a||(t.PulseChildElements=a={})),function(e){e.Name="name",e.Field="field",e.Value="value",e.Type="type"}(i||(t.PulseChildElementAttributes=i={}))},3267:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauError=void 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},3293:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.VisualModelServiceImpl=void 0;const a=r(6636),i=r(1891);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 o={[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,o).then(()=>{})}moveMarksCardFieldAsync(e,t,r,i,n=1){const o={[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,o).then(()=>{})}spliceMarksCardFieldsAsync(e,t,r,i,n,o){const s={[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]:o};return this.execute(a.VerbId.SpliceMarksCardFields,s).then(()=>{})}editAliasesDialogAsync(e){const t={[a.ParameterId.FunctionName]:"editAliasesDialogAsync",[a.ParameterId.FieldId]:e};return this.execute(a.VerbId.EditAliasesDialog,t).then(()=>{})}}t.VisualModelServiceImpl=n},3359:(e,t)=>{"use strict";var r,a,i,n,o;Object.defineProperty(t,"__esModule",{value:!0}),t.VizChildElementAttributes=t.VizChildElements=t.VizAuthoringAttributes=t.VizAttributes=t.VizSharedAttributes=void 0,function(e){e.TouchOptimize="touch-optimize",e.HideEditInDesktopButton="hide-edit-in-desktop-button",e.SuppressDefaultEditBehavior="suppress-default-edit-behavior",e.DisableVersionCheck="disable-version-check",e.OnEditInDesktopButtonClicked="onEditInDesktopButtonClicked",e.OnFirstVizSizeKnown="onFirstVizSizeKnown",e.OnFirstInteractive="onFirstInteractive"}(r||(t.VizSharedAttributes=r={})),function(e){e.DisableUrlActionsPopups="disable-url-actions",e.HideTabs="hide-tabs",e.Toolbar="toolbar",e.InstanceIdToClone="instance-id-to-clone",e.Device="device",e.HideEditButton="hide-edit-button",e.OnEditButtonClicked="onEditButtonClicked",e.OnFilterChanged="onFilterChanged",e.OnCustomMarkContextMenuEvent="onCustomMarkContextMenuEvent",e.OnMarkSelectionChanged="onMarkSelectionChanged",e.OnParameterChanged="onParameterChanged",e.OnToolbarStateChanged="onToolbarStateChanged",e.OnUrlAction="onUrlAction",e.OnTabSwitched="onTabSwitched",e.OnCustomViewLoaded="onCustomViewLoaded",e.OnCustomViewRemoved="onCustomViewRemoved",e.OnCustomViewSaved="onCustomViewSaved",e.OnCustomViewSetDefault="onCustomViewSetDefault",e.OnStoryPointSwitched="onStoryPointSwitched",e.OnSummaryDataChanged="onSummaryDataChanged",e.OnReadyToReceiveAuthToken="onReadyToReceiveAuthToken"}(a||(t.VizAttributes=a={})),function(e){e.OnWorkbookPublished="onWorkbookPublished",e.OnWorkbookPublishedAs="onWorkbookPublishedAs",e.OnWorkbookReadyToClose="onWorkbookReadyToClose",e.HideCloseButton="hide-close-button"}(i||(t.VizAuthoringAttributes=i={})),function(e){e.VizFilter="viz-filter",e.VizParameter="viz-parameter",e.CustomParameter="custom-parameter",e.IframeStyle="iframe-style"}(n||(t.VizChildElements=n={})),function(e){e.Field="field",e.Value="value",e.Name="name"}(o||(t.VizChildElementAttributes=o={}))},3443:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ParameterImpl=void 0;const a=r(5691),i=r(6753),n=r(2140),o=r(9012),s=r(2782),l=r(720);t.ParameterImpl=class{constructor(e,t){this._registryId=t,this.setParameterInfo(e)}get name(){return this._parameterInfo.name}get currentValue(){return o.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){s.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,s,l,d;t===a.ParameterValueType.List?r=(e.allowableValues||[]).map(t=>o.DataValueFactory.MakeParameterDataValue(t,e.dataType)):t===a.ParameterValueType.Range&&(n=e.minValue&&o.DataValueFactory.MakeParameterDataValue(e.minValue,e.dataType),s=e.maxValue&&o.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:s,stepSize:l,dateStepPeriod:d}}}},3658:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},3694:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.UI=void 0;const a=r(7464);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)}sendDialogMessageToParentAsync(e){return this._impl.sendDialogMessageToParentAsync(e)}closeDialog(e,t){this._impl.closeDialog(e,t)}}t.UI=i},3713:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardContent=void 0,t.DashboardContent=class{constructor(e){this._dashboard=e}get dashboard(){return this._dashboard}}},3834:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.UIImpl=t.TableauDialogError=t.DialogMessageEvent=void 0;const a=r(5691),i=r(5691),n=r(6636),o=r(7464),s=r(9577),l=r(8518);class d extends s.TableauEvent{constructor(e,t){super(a.TableauEventType.DialogMessageReceived),this.message=e,this.sourceDialogUrl=t}}t.DialogMessageEvent=d;class c extends o.TableauError{constructor(e,t){super(e,t),Object.setPrototypeOf(this,c.prototype)}}t.TableauDialogError=c,t.UIImpl=class{constructor(e){this.isExtensionDialog=e}displayDialogAsync(e,t,r){const s=o.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService"),d=o.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service");return new Promise((o,l)=>{s.displayDialogAsync(e,t||"",this.isExtensionDialog,r).then(()=>{const e=d.registerHandler(n.NotificationId.ExtensionDialogUpdate,()=>!0,t=>{if(t.isCloseEvent){if(void 0===t.closePayload)throw new c(a.ErrorCodes.InternalError,"closePayload is undefined");o(t.closePayload)}else l(new c(i.ErrorCodes.DialogClosedByUser,"Extension dialog closed by user."));e()})}).catch(e=>{l(e)})})}sendDialogMessageAsync(e,t){o.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService").sendDialogMessageAsync(e,t)}sendDialogMessageToParentAsync(e){if(!this.isExtensionDialog)throw new o.TableauError(i.ErrorCodes.InternalError,"sendDialogMessageToParentAsync can only be called from an extension dialog.");o.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService").sendDialogMessageToParentAsync(e)}closeDialog(e,t){o.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("UIService").closeDialog(e,t)}initializeEvents(){const e=new Array;let t;try{t=o.ApiServiceRegistry.get(l.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new o.SingleEventManagerImpl(a.TableauEventType.DialogMessageReceived);return t.registerHandler(n.NotificationId.ExtensionDialogMessage,()=>!0,e=>{r.triggerEvent(()=>new d(e.message,e.sourceDialogUrl))}),e.push(r),e}}},3855:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},3916:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},3964:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorksheetImpl=void 0;const a=r(5691),i=r(5691),n=r(4602),o=r(8810),s=r(1273),l=r(2140),d=r(3267),c=r(2782),u=r(7887),p=r(8935);class m extends p.SheetImpl{constructor(e,t,r,a,i,n=null,o=null){super(e,t),this._visualId=r,this._parentDashboardImpl=a,this._parentStoryPointImpl=i,this._backgroundColor=n,this._formatting=o}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,s.GetDataType.Summary,!!e.ignoreAliases,!!e.ignoreSelection,!0,e.columnsToIncludeById||[],e.maxRows||0,e.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!==(t=e.applyWorksheetFormatting)&&void 0!==t&&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)&&void 0!==r&&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,s.GetDataType.Underlying,!!e.ignoreAliases,!!e.ignoreSelection,!!e.includeAllColumns,e.columnsToIncludeById||[],e.maxRows||0,e.includeDataValuesOption||i.IncludeDataValuesOption.AllValues,null!==(t=e.applyWorksheetFormatting)&&void 0!==t&&t)}getUnderlyingTablesAsync(){return this.verifyActiveSheet(),l.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getUnderlyingTablesAsync(this.visualId).then(e=>e.map(e=>new o.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)&&void 0!==r&&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)&&void 0!==a&&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=m},3980:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},4227:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExtensionWorkbookImpl=void 0;const a=r(7464),i=r(8518);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},4301:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Settings=void 0;const a=r(7464);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},4328:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},4369:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExternalToInternalEnumMappings=void 0;const a=r(5691),i=r(6636),n=r(130);class o{}t.ExternalToInternalEnumMappings=o,o.filterDomainType=new n.EnumConverter({[a.FilterDomainType.Relevant]:i.FilterDomainType.Relevant,[a.FilterDomainType.Database]:i.FilterDomainType.Database}),o.nullOptions=new n.EnumConverter({[a.FilterNullOption.AllValues]:i.FilterNullOption.AllValues,[a.FilterNullOption.NonNullValues]:i.FilterNullOption.NonNullValues,[a.FilterNullOption.NullValues]:i.FilterNullOption.NullValues}),o.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}),o.setVisibilityType=new n.EnumConverter({[a.ZoneVisibilityType.Show]:!0,[a.ZoneVisibilityType.Hide]:!1}),o.setReplaySpeedType=new n.EnumConverter({[a.ReplaySpeedType.Slow]:2,[a.ReplaySpeedType.Normal]:1,[a.ReplaySpeedType.Fast]:.5}),o.sheetType=new n.EnumConverter({[a.SheetType.Dashboard]:i.SheetType.Dashboard,[a.SheetType.Worksheet]:i.SheetType.Worksheet,[a.SheetType.Story]:i.SheetType.Story}),o.showDataTableFormatType=new n.EnumConverter({[a.IncludeDataValuesOption.AllValues]:i.ApiShowDataTableFormat.NativeAndFormattedValues,[a.IncludeDataValuesOption.OnlyNativeValues]:i.ApiShowDataTableFormat.NativeValuesOnly,[a.IncludeDataValuesOption.OnlyFormattedValues]:i.ApiShowDataTableFormat.FormattedValuesOnly}),o.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,[a.PeriodType.IsoYears]:i.DateStepPeriod.IsoYears,[a.PeriodType.IsoQuarters]:i.DateStepPeriod.IsoQuarters,[a.PeriodType.IsoWeeks]:i.DateStepPeriod.IsoWeeks}),o.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}),o.dialogStyles=new n.EnumConverter({[a.DialogStyle.Window]:i.DialogStyle.Window,[a.DialogStyle.Modal]:i.DialogStyle.Modal,[a.DialogStyle.Modeless]:i.DialogStyle.Modeless})},4524:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ConnectedServer=void 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}}},4602:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataSource=void 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)}}},4633:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LegacyInternalApiDispatcherHolder=void 0;const a=r(6636);var i;!function(e){function t(e){return e&&void 0!==e.isAlpha||window.__warningIssued?(null==e?void 0:e.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)}}(i||(t.LegacyInternalApiDispatcherHolder=i={}))},4641:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FilterChangedEvent=void 0;const a=r(5691),i=r(7464),n=r(769);class o 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=o},4656:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExecuteMinorUpgradeNotification=t.ExecuteMinorUpgradeReturnExternal=t.ExecuteMinorDowngradeCallExternal=void 0,t.CreateExternalCompatibleVersionConverter=function(e,r){return o(e,r,t.ExecuteMinorDowngradeCallExternal,t.ExecuteMinorUpgradeReturnExternal,t.ExecuteMinorUpgradeNotification)},t.CreateExternalCompatibleVersionConverterWithTranslators=o;const a=r(4965),i=r(1262),n=r(396);function o(e,t,r,o,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";Object.defineProperty(t,"__esModule",{value:!0}),t.ExportHelpers=void 0;const a=r(6636),i=r(5691),n=r(3267);class o{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:o}=this.DefaultLayoutOptions;const s=this.fitRegex.exec(t),l=this.pctRegex.exec(t);s?([r,i]=s.slice(1).map(e=>Number(e)),n=a.ScaleMode.ScaleFitPages):l&&([o]=l.slice(1).map(e=>Number(e)),n=a.ScaleMode.ScalePercentage),e.pageFitHorizontal=r,e.pageFitVertical=i,e.pageScaleMode=n,e.pageScalePercent=o}}t.ExportHelpers=o,o.DefaultDataOptions={ignoreAliases:!1,columnsToIncludeById:[]},o.DefaultPDFOptions={scaling:i.PrintScaling.Automatic,pageSize:i.PrintPageSize.Letter,orientation:i.PrintOrientation.Portrait},o.DefaultLayoutOptions={imageHeight:0,imageWidth:0,pageFitHorizontal:1,pageFitVertical:1,pageOrientationOption:a.PageOrientation.Portrait,pageScaleMode:a.ScaleMode.ScaleAuto,pageScalePercent:100,pageSizeOption:a.PageSizeOption.Letter},o.fitRegex=new RegExp("fit([0-9]+)x([0-9]+)"),o.pctRegex=new RegExp("pct([0-9]+)")},4858:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.MarksSelectedEvent=void 0;const a=r(5691),i=r(769);class n extends i.TableauWorksheetEvent{constructor(e){super(a.TableauEventType.MarkSelectionChanged,e)}getMarksAsync(){return this.worksheet.getSelectedMarksAsync()}}t.MarksSelectedEvent=n},4879:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},4941:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.CrossFrameDispatcher=void 0;const a=r(5691);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}}}},4965:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.NotificationMinorDowngrades=t.ExecuteMinorDowngrades=t.ExecuteMinorUpgrades=void 0,t.VersionLessThan=function(e,t){return!(e.major>t.major)&&(e.majoru)throw new Error(`External version must be less than or equal to platform version.\n externalMajorVersion=${d} platformMajorVersion=${u}`);if(o(e,t))return new a.IdentityVersionConverter;const p=l(d,u,c,r),m=l(d,u,c,n),h=l(d,u,c,s);return m.reverse(),h.reverse(),i.StackingVersionConverter.fromData(e,t,p,m,h)}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,o=d(Object.keys(a[n]));for(let e=t;e<=o;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.ExecuteMinorUpgrades={1:{9:[]}},t.ExecuteMinorDowngrades={1:{5:[n.DowngradeWorksheetNames],9:[],175:[n.DowngradeWorksheetFomatting175],182:[n.DowngradeExtensionEnvironmentContext],189:[n.DowngradePeriodType]}},t.NotificationMinorDowngrades={1:{9:[],10:[n.DowngradeFlipboardZoneID],175:[n.DowngradeWorksheetFomattingNotification175]}}},5144:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SupportedTableauFontFaces=t.TableauSemiBoldFontFaceName=t.TableauRegularFontFaceName=t.TableauMediumFontFaceName=t.TableauLightFontFaceName=t.TableauBoldFontFaceName=t.TableauBookFontFaceName=t.TableauBoldFontFamilyName=t.TableauSemiboldFontFamilyName=t.TableauMediumFontFamilyName=t.TableauRegularFontFamilyName=t.TableauLightFontFamilyName=t.TableauBookFontFamilyName=void 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]},5204:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.InitializationServiceImpl=void 0;const a=r(6636),i=r(7464);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},5231:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Parameter=void 0;const a=r(5691),i=r(6636),n=r(7464),o=r(6944),s=r(8518);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(s.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 o.ParameterChangedEvent(t,e))}),t.push(l),t}}t.Parameter=l},5310:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},5412:(e,t,r)=>{"use strict";var a;r.r(t),r.d(t,{NIL:()=>C,parse:()=>y,stringify:()=>c,v1:()=>g,v3:()=>A,v4:()=>_,v5:()=>F,validate:()=>s,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 o=/^(?:[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&&o.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(!s(r))throw TypeError("Stringified UUID is invalid");return r};var u,p,m=0,h=0;const g=function(e,t,r){var a=t&&r||0,i=t||new Array(16),o=(e=e||{}).node||u,s=void 0!==e.clockseq?e.clockseq:p;if(null==o||null==s){var l=e.random||(e.rng||n)();null==o&&(o=u=[1|l[0],l[1],l[2],l[3],l[4],l[5]]),null==s&&(s=p=16383&(l[6]<<8|l[7]))}var d=void 0!==e.msecs?e.msecs:Date.now(),g=void 0!==e.nsecs?e.nsecs:h+1,y=d-m+(g-h)/1e4;if(y<0&&void 0===e.clockseq&&(s=s+1&16383),(y<0||d>m)&&void 0===e.nsecs&&(g=0),g>=1e4)throw new Error("uuid.v1(): Can't create more than 10M uuids/sec");m=d,h=g,p=s;var v=(1e4*(268435455&(d+=122192928e5))+g)%4294967296;i[a++]=v>>>24&255,i[a++]=v>>>16&255,i[a++]=v>>>8&255,i[a++]=255&v;var I=d/4294967296*1e4&268435455;i[a++]=I>>>8&255,i[a++]=255&I,i[a++]=I>>>24&15|16,i[a++]=I>>>16&255,i[a++]=s>>>8|128,i[a++]=255&s;for(var S=0;S<6;++S)i[a+S]=o[S];return t||c(i)},y=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 v(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 f(e,t,r,a,i,n){return S((o=S(S(t,e),S(a,n)))<<(s=i)|o>>>32-s,r);var o,s}function b(e,t,r,a,i,n,o){return f(t&r|~t&a,e,t,i,n,o)}function T(e,t,r,a,i,n,o){return f(t&a|r&~a,e,t,i,n,o)}function P(e,t,r,a,i,n,o){return f(t^r^a,e,t,i,n,o)}function E(e,t,r,a,i,n,o){return f(r^(t|~a),e,t,i,n,o)}const A=v("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,o=parseInt(a.charAt(n>>>4&15)+a.charAt(15&n),16);t.push(o)}return t}(function(e,t){e[t>>5]|=128<>5]|=(255&e[a/8])<>>32-t}const F=v("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=I,I=v,v=w(y,30)>>>0,y=g,g=T}r[0]=r[0]+g>>>0,r[1]=r[1]+y>>>0,r[2]=r[2]+v>>>0,r[3]=r[3]+I>>>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]]}),C="00000000-0000-0000-0000-000000000000",x=function(e){if(!s(e))throw TypeError("Invalid UUID");return parseInt(e.substr(14,1),16)}},5493:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.registerAllSharedServices=function(e,t){a.ApiServiceRegistry.get(t).registerService(new n.AnimationServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new s.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 p.NotificationServiceImpl(e)),a.ApiServiceRegistry.get(t).registerService(new m.ParametersServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new h.SelectionServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new o.AnnotationServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new I.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 v.VizServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new d.ExternalContextMenuServiceImpl(e,t)),a.ApiServiceRegistry.get(t).registerService(new i.AccessibilityServiceImpl(e,t))};const a=r(2140),i=r(9074),n=r(6048),o=r(9153),s=r(1401),l=r(9640),d=r(677),c=r(7852),u=r(2414),p=r(1611),m=r(7742),h=r(9216),g=r(6261),y=r(3293),v=r(9605),I=r(7640)},5520:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.RangeDomain=t.CategoricalDomain=t.RelativeDateFilter=t.RangeFilter=t.HierarchicalFilter=t.HierarchicalLevelDetail=t.HierarchicalDataValue=t.CategoricalFilter=t.Filter=void 0;const a=r(5691),i=r(2140),n=r(2782);class o{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=o,t.CategoricalFilter=class extends o{constructor(e,t,r,a,i,n,o,s){super(e,t,a,r,i),this._appliedValues=n,this._isExcludeMode=o,this._isAllSelected=s}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 o{constructor(e,t,r,a,i,n,o,s,l,d,c){super(e,t,a,r,i),this._dimensionName=n,this._hierarchyCaption=o,this._numberOfLevels=s,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 o{constructor(e,t,r,a,i,n,o,s){super(e,t,a,r,i),this._min=n,this._max=o,this._includeNullValues=s}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 o{constructor(e,t,r,a,i,n,o,s,l){super(e,t,a,r,i),this._anchorDate=n,this._periodType=o,this._rangeType=s,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}}},5691:function(e,t,r){"use strict";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,i)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),i=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),i(r(460),t),i(r(6191),t)},5848:(e,t)=>{"use strict";var r,a,i,n,o,s,l,d,c,u,p,m,h,g,y,v;Object.defineProperty(t,"__esModule",{value:!0}),t.TableauDialogType=t.ApiMenuType=t.TableauEventType=t.PulseErrorMessageVisibility=t.PulseTimeDimension=t.PulseLayout=t.SheetSizeBehavior=t.Toolbar=t.ToolbarButtons=t.RevertVizSelection=t.PrintScaling=t.PrintPageSize=t.PrintOrientation=t.EmbeddingErrorCodes=t.DeviceType=t.CrosstabFileFormat=void 0,function(e){e.CSV="csv",e.Excel="xlsx"}(r||(t.CrosstabFileFormat=r={})),function(e){e.Default="default",e.Desktop="desktop",e.Tablet="tablet",e.Phone="phone"}(a||(t.DeviceType=a={})),function(e){e.AuthFailed="auth-failed",e.BrowserNotCapable="browser-not-capable",e.DownloadWorkbookNotAllowed="download-workbook-not-allowed",e.FilterCannotBePerformed="filter-cannot-be-performed",e.IndexOutOfRange="index-out-of-range",e.InternalError="internal-error",e.InvalidCustomViewName="invalid-custom-view-name",e.InvalidDateParameter="invalid-date-parameter",e.invalidFilterFieldNameOrValue="invalid-filter-field-name",e.InvalidParameter="invalid-parameter",e.InvalidTimeDimension="invalid-time-dimension",e.InvalidSize="invalid-size",e.InvalidSheetType="invalid-sheet-type",e.InvalidSizeBehavior="invalid-size-behavior",e.InvalidSizeBehaviorOnWorksheet="invalid-size-behavior-on-worksheet",e.InvalidUrl="invalid-url",e.MissingMaxSize="missing-max-size",e.MissingMinSize="missing-min-size",e.MissingMinMaxSize="missing-min-max-size",e.MissingParameter="missing-parameter",e.MissingRangeNForRelativeDateFilters="missing-range-n-for-relative-date-filters",e.NoUrlForHiddenWorksheet="no-url-for-hidden-worksheet",e.NoUrlOrParentElementNotFound="no-url-or-parent-element-not-found",e.NotActiveSheet="not-active-sheet",e.NullOrEmptyParameter="null-or-empty-parameter",e.SheetNotInWorkbook="sheet-not-in-workbook",e.StaleDataReference="stale-data-reference",e.UnknownAuthError="unknown-auth-error",e.UnsupportedEventName="unsupported-event-name",e.VizAlreadyInManager="viz-already-in-manager",e.ImplementationError="wrong-implementation",e.NotImplemented="not-implemented",e.EventInitializationError="event-initialization-error",e.IncompatibleVersionError="incompatible-version-error",e.UnknownDialogType="unknown-dialog-type",e.FilterMissingOrNotImplemented="filter-missing-not-implemented",e.StoryPointIdMismatch="storypoint-id-mismatch"}(i||(t.EmbeddingErrorCodes=i={})),function(e){e.Portrait="portrait",e.Landscape="landscape"}(n||(t.PrintOrientation=n={})),function(e){e.Letter="letter",e.Legal="legal",e.Note="note",e.Folio="folio",e.Tabloid="tabloid",e.Ledger="ledger",e.Statement="statement",e.Executive="executive",e.A3="A3",e.A4="A4",e.A5="A5",e.B4="B4",e.B5="B5",e.Quarto="quarto",e.Unspecified="unspecified"}(o||(t.PrintPageSize=o={})),function(e){e.Automatic="automatic",e.Perc25="25%",e.Perc50="50%",e.Perc60="60%",e.Perc75="75%",e.Perc80="80%",e.Perc90="90%",e.Perc100="100%",e.Perc200="200%",e.Perc400="400%",e.AtMost1PageHigh="at-most-1-page-high",e.AtMost2PagesHigh="at-most-2-pages-high",e.AtMost1PageWide="at-most-1-page-wide",e.AtMost2PagesWide="at-most-2-pages-wide"}(s||(t.PrintScaling=s={})),function(e){e.All="all",e.Axes="axes",e.Filters="filters",e.Sorts="sorts",e.Shelves="shelves"}(l||(t.RevertVizSelection=l={})),function(e){e.Alerts="alerts",e.AskData="askData",e.CustomViews="customViews",e.DataDetails="dataDetails",e.Share="share",e.Subscribe="subscribe"}(d||(t.ToolbarButtons=d={})),function(e){e.Top="top",e.Bottom="bottom",e.Hidden="hidden"}(c||(t.Toolbar=c={})),function(e){e.Automatic="automatic",e.Exactly="exactly",e.Range="range",e.AtLeast="atleast",e.AtMost="atmost"}(u||(t.SheetSizeBehavior=u={})),function(e){e.Default="default",e.Card="card",e.Ban="ban"}(p||(t.PulseLayout=p={})),function(e){e.Today="Today",e.Yesterday="Yesterday",e.WeekToDate="WeekToDate",e.LastWeek="LastWeek",e.MonthToDate="MonthToDate",e.LastMonth="LastMonth",e.QuarterToDate="QuarterToDate",e.LastQuarter="LastQuarter",e.YearToDate="YearToDate",e.LastYear="LastYear"}(m||(t.PulseTimeDimension=m={})),function(e){e.Visible="visible",e.Hidden="hidden",e.Suppressed="suppressed"}(h||(t.PulseErrorMessageVisibility=h={})),function(e){e.CustomViewLoaded="customviewloaded",e.CustomViewRemoved="customviewremoved",e.CustomViewSaved="customviewsaved",e.CustomViewSetDefault="customviewsetdefault",e.EditButtonClicked="editbuttonclicked",e.EditInDesktopButtonClicked="editindesktopbuttonclicked",e.FilterChanged="filterchanged",e.FirstVizSizeKnown="firstvizsizeknown",e.FirstInteractive="firstinteractive",e.CustomMarkContextMenuEvent="custommarkcontextmenu",e.MarkSelectionChanged="markselectionchanged",e.ParameterChanged="parameterchanged",e.ToolbarStateChanged="toolbarstatechanged",e.WorkbookReadyToClose="workbookreadytoclose",e.WorkbookPublished="workbookpublished",e.WorkbookPublishedAs="workbookpublishedas",e.UrlAction="urlaction",e.TabSwitched="tabswitched",e.StoryPointSwitched="storypointswitched",e.VizLoadError="vizloaderror",e.IframeSrcUpdated="iframesrcupdated",e.SummaryDataChanged="summarydatachanged",e.ReadyToReceiveAuthToken="readytoreceiveauthtoken",e.FirstPulseMetricSizeKnown="firstpulsemetricsizeknown",e.PulseError="pulseerror",e.PulseFiltersChanged="pulsefilterschanged",e.PulseInsightDiscovered="pulseinsightdiscovered",e.PulseMetricSizeChanged="pulsemetricsizechanged",e.PulseTimeDimensionChanged="pulsetimedimensionchanged",e.PulseUrlChanged="pulseurlchanged"}(g||(t.TableauEventType=g={})),function(e){e.Ubertip="ubertip"}(y||(t.ApiMenuType=y={})),function(e){e.ExportPDF="export-pdf",e.ExportPowerPoint="export-powerpoint",e.ExportData="export-data",e.ExportCrossTab="export-cross-tab",e.ExportWorkbook="export-workbook",e.Share="share"}(v||(t.TableauDialogType=v={}))},5877: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 o(e){try{l(a.next(e))}catch(e){n(e)}}function s(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(o,s)}l((a=a.apply(e,t||[])).next())})};Object.defineProperty(t,"__esModule",{value:!0}),t.DataTableReader=void 0;const i=r(2140),n=r(2782);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}),t.SingleEventManagerImpl=void 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}}}},5949:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.IdentityVersionConverter=void 0,t.IdentityVersionConverter=class{upgradeExecuteCall(e,t){return{verb:e,parameters:t}}downgradeExecuteReturn(e){return e}downgradeNotification(e){return e}}},6048:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AnimationServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(4369),o=r(2782),s=r(1891);class l extends s.ServiceImplBase{get serviceName(){return"animation-service"}replayAsync(e){const t={[i.ParameterId.ReplaySpeed]:1};return o.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},6191:function(e,t,r){"use strict";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,i)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),i=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.VizImageSortDirectionType=t.VizImageSizeSettingType=t.VizImageSizeSettingAlignmentType=t.VizImagePaletteType=t.VizImageEncodingType=t.TableauEventType=t.ExtensionMode=t.ExtensionContext=t.ExportedMediaType=t.ErrorCodes=void 0,i(r(4328),t);var n=r(154);Object.defineProperty(t,"ErrorCodes",{enumerable:!0,get:function(){return n.ErrorCodes}}),Object.defineProperty(t,"ExportedMediaType",{enumerable:!0,get:function(){return n.ExportedMediaType}}),Object.defineProperty(t,"ExtensionContext",{enumerable:!0,get:function(){return n.ExtensionContext}}),Object.defineProperty(t,"ExtensionMode",{enumerable:!0,get:function(){return n.ExtensionMode}}),Object.defineProperty(t,"TableauEventType",{enumerable:!0,get:function(){return n.TableauEventType}}),Object.defineProperty(t,"VizImageEncodingType",{enumerable:!0,get:function(){return n.VizImageEncodingType}}),Object.defineProperty(t,"VizImagePaletteType",{enumerable:!0,get:function(){return n.VizImagePaletteType}}),Object.defineProperty(t,"VizImageSizeSettingAlignmentType",{enumerable:!0,get:function(){return n.VizImageSizeSettingAlignmentType}}),Object.defineProperty(t,"VizImageSizeSettingType",{enumerable:!0,get:function(){return n.VizImageSizeSettingType}}),Object.defineProperty(t,"VizImageSortDirectionType",{enumerable:!0,get:function(){return n.VizImageSortDirectionType}}),i(r(2332),t),i(r(3980),t),i(r(2671),t),i(r(9770),t)},6261:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SizeServiceImpl=void 0;const a=r(6636),i=r(1891);class n extends i.ServiceImplBase{get serviceName(){return"size-service"}changeSizeAsync(e,t){var r,i,n,o;const s={[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===(o=t.maxSize)||void 0===o?void 0:o.width)||0};return this.execute(a.VerbId.SetSheetSize,s).then(e=>{})}}t.SizeServiceImpl=n},6300:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},6517:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},6538:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Extensions=void 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)}reportExtensionRenderComplete(e){return this.extensionImpl.reportExtensionRenderComplete(e)}}},6575:e=>{"use strict";var t;!function(e){let t,r,a,i,n,o,s,l,d,c,u,p,m,h,g,y,v,I,S,f,b,T,P,E,A,_,D,w,F,C,x,M;!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"}(o=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"}(s=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"}(p=e.FieldAggregationType||(e.FieldAggregationType={})),function(e){e.Dimension="dimension",e.Measure="measure",e.Unknown="unknown"}(m=e.FieldRoleType||(e.FieldRoleType={})),function(e){e.Categorical="categorical",e.Range="range",e.Hierarchical="hierarchical",e.RelativeDate="relative-date"}(h=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"}(v=e.FilterNullOption||(e.FilterNullOption={})),function(e){e.AllValues="all-values",e.OnlyNativeValues="only-native-values",e.OnlyFormattedValues="only-formatted-values"}(I=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.AutoFormat="auto-format",e.SystemNumber="system-number",e.SystemCurrency="system-currency",e.SystemLongDate="system-long-date",e.SystemShortDate="system-short-date",e.SystemTime="system-time",e.Custom="custom",e.CustomNumber="custom-number",e.CustomCurrency="custom-currency",e.CustomScientific="custom-scientific",e.CustomPercentage="custom-percentage"}(f=e.DataFormatType||(e.DataFormatType={})),function(e){e.None="units-none",e.Thousands="units-thousands",e.Millions="units-millions",e.BillionsEnglish="units-billions-english",e.BillionsStandard="units-billions-standard"}(b=e.NumberFormatUnits||(e.NumberFormatUnits={})),function(e){e.Automatic="automatic",e.Parentheses="parentheses",e.OuterPrefix="outer-prefix",e.OuterSuffix="outer-suffix",e.InnerPrefix="inner-prefix",e.InnerSuffix="inner-suffix"}(T=e.NegativeNumberFormat||(e.NegativeNumberFormat={})),function(e){e.All="all",e.List="list",e.Range="range"}(P=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",e.IsoYears="iso-years",e.IsoQuarters="iso-quarters",e.IsoWeeks="iso-weeks"}(E=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"}(A=e.QuickTableCalcType||(e.QuickTableCalcType={})),function(e){e.Replace="select-replace",e.Add="select-add",e.Remove="select-remove"}(_=e.SelectionUpdateType||(e.SelectionUpdateType={})),function(e){e.Simple="select-options-simple",e.Toggle="select-options-toggle"}(D=e.SelectOptions||(e.SelectOptions={})),function(e){e.Dashboard="dashboard",e.Story="story",e.Worksheet="worksheet"}(w=e.SheetType||(e.SheetType={})),function(e){e.Increasing="increasing",e.Decreasing="decreasing"}(F=e.SortDirection||(e.SortDirection={})),function(e){e.Linear="linear",e.Logarithmic="logarithmic",e.Exponential="exponential",e.Polynomial="polynomial"}(C=e.TrendLineModelType||(e.TrendLineModelType={})),function(e){e.Slow="slow",e.Normal="normal",e.Fast="fast"}(x=e.ReplaySpeedType||(e.ReplaySpeedType={})),function(e){e.AllSelected="all-selected",e.NoneSelected="none-selected",e.SomeSelected="some-selected",e.UnknownSelected="unknown-selected"}(M=e.HierarchicalLevelSelectionState||(e.HierarchicalLevelSelectionState={})),e.ZoneVisibilityType=Object.assign({},o)}(t||(t={})),e.exports=t},6583:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DowngradeWorksheetFomattingNotification175=t.DowngradeWorksheetFomatting175=void 0,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},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},t.DowngradePeriodType=function(e){if(Array.isArray(e.result)){const t=e.result;for(const e of t)o(e)}else o(e.result);return e};const a=r(6636),i=r(6677),n=["tableau-row-dividers","tableau-column-dividers","tableau-pane"];function o(e){e.allowableValuesType===a.DomainRestrictionType.Range&&(e.dateStepPeriod===a.DateStepPeriod.IsoYears?e.dateStepPeriod=a.DateStepPeriod.Years:e.dateStepPeriod===a.DateStepPeriod.IsoQuarters?e.dateStepPeriod=a.DateStepPeriod.Quarters:e.dateStepPeriod===a.DateStepPeriod.IsoWeeks&&(e.dateStepPeriod=a.DateStepPeriod.Weeks))}t.DowngradeWorksheetFomatting175=e=>function(e,t){var r;const a=e.result;return(null===(r=null==a?void 0:a.extensionWorksheetInfo)||void 0===r?void 0:r.formatting)&&(a.extensionWorksheetInfo.formatting.formattingSheets=a.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)},6636:function(e,t,r){"use strict";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,i)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),i=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.MESSAGING_VERSION=t.INTERNAL_CONTRACT_VERSION=void 0;const n=r(8347);t.INTERNAL_CONTRACT_VERSION=n,i(r(3153),t),i(r(9875),t),i(r(1647),t),i(r(6677),t),i(r(7193),t),i(r(2219),t),i(r(1768),t),i(r(1596),t),i(r(2616),t),i(r(7664),t),i(r(7515),t),i(r(822),t),i(r(385),t),i(r(4879),t),i(r(386),t),i(r(8709),t),i(r(5310),t),i(r(6517),t),i(r(742),t),i(r(1262),t),i(r(4656),t),i(r(3916),t),i(r(4965),t),t.MESSAGING_VERSION={major:1,minor:0,fix:0}},6658:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.UnregisterTimeoutInMilliseconds=t.Deferred=void 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},6677:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.NotificationId=void 0,function(e){e.CustomMarkContextMenuClicked="custom-mark-context-menu-clicked",e.ContextMenuClick="context-menu-click",e.CustomViewRemoved="custom-view-removed",e.CustomViewSaved="custom-view-saved",e.CustomViewSetDefault="custom-view-set-default",e.CustomViewsLoaded="custom-views-loaded",e.DashboardLayoutChanged="dashboard-layout-changed",e.EditButtonClicked="edit-button-clicked",e.EditInDesktopButtonClicked="edit-in-desktop-button-clicked",e.ExtensionDialogUpdate="extension-dialog-update",e.ExtensionDialogMessage="extension-dialog-message",e.FilterChanged="filter-changed",e.FirstVizSizeKnown="first-viz-size-known",e.FirstPulseMetricSizeKnown="first-pulse-metric-size-known",e.ParameterChanged="parameter-changed",e.PulseError="pulse-error",e.PulseFiltersChanged="pulse-filters-changed",e.PulseMetricSizeChanged="pulse-metric-size-changed",e.PulseInsightDiscovered="pulse-insight-discovered",e.PulseInteractive="pulse-interactive",e.PulseTimeDimensionChanged="pulse-time-dimension-changed",e.PulseUrlChanged="pulse-url-changed",e.SelectedMarksChanged="selected-marks-changed",e.SettingsChanged="settings-changed",e.SummaryDataChanged="summary-data-changed",e.TestConversionNotification="test-conversion-notification",e.ToolbarStateChanged="toolbar-state-changed",e.VizInteractive="viz-interactive",e.AskDataInteractive="ask-data-interactive",e.WorkbookReadyToClose="workbook-ready-to-close",e.WorkbookFormattingChanged="workbook-formatting-changed",e.WorkbookPublished="workbook-published",e.WorkbookPublishedAs="workbook-published-as",e.WorksheetFormattingChanged="worksheet-formatting-changed",e.UrlAction="url-action",e.TabSwitched="tab-switched",e.StoryPointSwitched="story-point-switched",e.ReadyToReceiveAuthToken="ready-to-receive-auth-token"}(r||(t.NotificationId=r={}))},6707:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},6743:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},6753:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.InternalToExternalEnumMappings=void 0;const a=r(5691),i=r(6636),n=r(130);class o{}t.InternalToExternalEnumMappings=o,o.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}),o.dataFormatType=new n.EnumConverter({[i.DataFormatType.AutoFormat]:a.DataFormatType.AutoFormat,[i.DataFormatType.SystemNumber]:a.DataFormatType.SystemNumber,[i.DataFormatType.SystemCurrency]:a.DataFormatType.SystemCurrency,[i.DataFormatType.SystemLongDate]:a.DataFormatType.SystemLongDate,[i.DataFormatType.SystemShortDate]:a.DataFormatType.SystemShortDate,[i.DataFormatType.SystemTime]:a.DataFormatType.SystemTime,[i.DataFormatType.Custom]:a.DataFormatType.Custom,[i.DataFormatType.CustomNumber]:a.DataFormatType.CustomNumber,[i.DataFormatType.CustomCurrency]:a.DataFormatType.CustomCurrency}),o.numberFormatUnits=new n.EnumConverter({[i.NumberFormatUnits.None]:a.NumberFormatUnits.None,[i.NumberFormatUnits.Thousands]:a.NumberFormatUnits.Thousands,[i.NumberFormatUnits.Millions]:a.NumberFormatUnits.Millions,[i.NumberFormatUnits.BillionsEnglish]:a.NumberFormatUnits.BillionsEnglish,[i.NumberFormatUnits.BillionsStandard]:a.NumberFormatUnits.BillionsStandard}),o.negativeNumberFormat=new n.EnumConverter({[i.NegativeNumberFormat.Automatic]:a.NegativeNumberFormat.Automatic,[i.NegativeNumberFormat.Parentheses]:a.NegativeNumberFormat.Parentheses,[i.NegativeNumberFormat.OuterPrefix]:a.NegativeNumberFormat.OuterPrefix,[i.NegativeNumberFormat.OuterSuffix]:a.NegativeNumberFormat.OuterSuffix,[i.NegativeNumberFormat.InnerPrefix]:a.NegativeNumberFormat.InnerPrefix,[i.NegativeNumberFormat.InnerSuffix]:a.NegativeNumberFormat.InnerSuffix}),o.extensionMode=new n.EnumConverter({[i.ExtensionMode.Authoring]:a.ExtensionMode.Authoring,[i.ExtensionMode.Viewing]:a.ExtensionMode.Viewing}),o.exportedMediaType=new n.EnumConverter({[i.ExportedMediaType.Image]:a.ExportedMediaType.Image,[i.ExportedMediaType.Pdf]:a.ExportedMediaType.Pdf,[i.ExportedMediaType.Svg]:a.ExportedMediaType.Svg,[i.ExportedMediaType.Html]:a.ExportedMediaType.Html,[i.ExportedMediaType.PowerPoint]:a.ExportedMediaType.PowerPoint,[i.ExportedMediaType.Excel]:a.ExportedMediaType.Excel}),o.columnType=new n.EnumConverter({[i.ColumnType.Continuous]:a.ColumnType.Continuous,[i.ColumnType.Discrete]:a.ColumnType.Discrete,[i.ColumnType.Unknown]:a.ColumnType.Unknown}),o.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}),o.fieldRoleType=new n.EnumConverter({[i.FieldRoleType.Dimension]:a.FieldRoleType.Dimension,[i.FieldRoleType.Measure]:a.FieldRoleType.Measure,[i.FieldRoleType.Unknown]:a.FieldRoleType.Unknown}),o.sheetType=new n.EnumConverter({[i.SheetType.Dashboard]:a.SheetType.Dashboard,[i.SheetType.Story]:a.SheetType.Story,[i.SheetType.Worksheet]:a.SheetType.Worksheet}),o.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}),o.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}),o.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}),o.allowableValues=new n.EnumConverter({[i.DomainRestrictionType.All]:a.ParameterValueType.All,[i.DomainRestrictionType.List]:a.ParameterValueType.List,[i.DomainRestrictionType.Range]:a.ParameterValueType.Range}),o.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,[i.DateStepPeriod.IsoYears]:a.PeriodType.IsoYears,[i.DateStepPeriod.IsoQuarters]:a.PeriodType.IsoQuarters,[i.DateStepPeriod.IsoWeeks]:a.PeriodType.IsoWeeks}),o.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}),o.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),o.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}),o.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}),o.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}),o.annotationType=new n.EnumConverter({[i.AnnotateEnum.Area]:a.AnnotationType.Area,[i.AnnotateEnum.Mark]:a.AnnotationType.Mark,[i.AnnotateEnum.Point]:a.AnnotationType.Point}),o.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})},6835:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.AskDataAttributes=void 0,function(e){e.Origin="origin",e.ShowEmbed="show-embed",e.ShowPin="show-pin",e.ShowSave="show-save",e.ShowShare="show-share"}(r||(t.AskDataAttributes=r={}))},6877:(e,t)=>{"use strict";var r,a,i,n;Object.defineProperty(t,"__esModule",{value:!0}),t.WebComponentChildElementAttributes=t.WebComponentChildElements=t.EmbeddedIframeAttributes=t.WebComponentAttributes=void 0,function(e){e.Src="src",e.Width="width",e.Height="height",e.Token="token",e.Debug="debug",e.IframeAuth="iframe-auth",e.OnVizLoadError="onvizloaderror",e.ForceTokenSync="force-token-sync"}(r||(t.WebComponentAttributes=r={})),function(e){e.Loading="iframe-attr-loading",e.Style="iframe-attr-style",e.Class="iframe-attr-class"}(a||(t.EmbeddedIframeAttributes=a={})),function(e){e.CustomParameter="custom-parameter",e.IframeStyle="iframe-style"}(i||(t.WebComponentChildElements=i={})),function(e){e.Field="field",e.Value="value",e.Name="name"}(n||(t.WebComponentChildElementAttributes=n={}))},6879:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},6944:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ParameterChangedEvent=void 0;const a=r(5691),i=r(7464),n=r(5231),o=r(8518),s=r(964);class l extends s.TableauSheetEvent{constructor(e,t){super(a.TableauEventType.ParameterChanged,t),this._globalFieldName=e}getParameterAsync(){return i.ApiServiceRegistry.get(o.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},6950:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ShortLivedDeferred=void 0;const a=r(5691),i=r(3267),n=r(6658);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)}}},7039:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SummaryDataChangedEvent=void 0;const a=r(5691),i=r(769);class n extends i.TableauWorksheetEvent{constructor(e){super(a.TableauEventType.SummaryDataChanged,e)}}t.SummaryDataChangedEvent=n},7193:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.ParameterId=void 0,function(e){e.ActiveTablesInfo="active-tables-info",e.AnchorDate="anchor-date",e.AnnotateEnum="annotate-enum",e.AnnotationList="annotation-list",e.ApplyWorksheetFormatting="apply-worksheet-formatting",e.CategoricalDomain="categorical-domain",e.ClickThroughEnabled="click-through-enabled",e.Columns="columns",e.ColumnsToInclude="columns-to-include",e.ColumnsToIncludeById="columns-to-include-by-id",e.ConnectionDescriptionSummaries="connection-description-summaries",e.CurrentSheetType="current-sheet-type",e.CustomView="custom-view",e.CustomViewIsDefault="custom-view-is-default",e.CustomViewIsPublic="custom-view-is-public",e.CustomViewLuid="custom-view-luid",e.CustomViewName="custom-view-name",e.CustomViews="custom-views",e.Dashboard="dashboard",e.DashboardFilters="dashboard-filters",e.DashboardName="dashboard",e.DashboardObjectPositionAndSizeUpdate="dashboard-object-position-and-size-update",e.DashboardObjectPositionAndSizeUpdateList="dashboard-object-position-and-size-update-list",e.DataRowIndex="data-row-index",e.DataSchema="data-schema",e.DataSource="data-source",e.DataSourceDataTable="data-source-data-table",e.DataSourceId="data-source-id",e.DataSourceName="data-source-name",e.DataTable="data-table",e.DataTableReader="data-table-reader",e.DateRangeType="date-range-type",e.DeleteCount="delete-count",e.DeltaTimeMs="delta-time-ms",e.DimValSelectionModels="dimensionValueSelectionModels",e.DomainType="domain-type",e.EmbeddingAbstractQuery="embedding-abstract-query",e.EmbeddingBootstrapInfo="embedding-bootstrap-info",e.EncodingType="encoding-type",e.ExportCrosstabSheetMap="export-crosstab-sheet-map",e.ExportFile="export-file",e.ExportOriginUrl="export-origin-url",e.ExportPdfOptions="export-pdf-options",e.ExtensionBootstrapInfo="extension-bootstrap-info",e.ExtensionContextMenuIds="extension-context-menu-ids",e.ExtensionDialogH="extension-dialog-height",e.ExtensionDialogMessage="extension-dialog-message",e.ExtensionDialogPayload="extension-dialog-payload",e.ExtensionDialogResult="extension-dialog-result",e.ExtensionDialogStyle="extension-dialog-style",e.ExtensionDialogUrl="extension-dialog-url",e.ExtensionDialogUrlSource="extension-dialog-url-source",e.ExtensionDialogW="extension-dialog-width",e.ExtensionLocator="extension-locator",e.ExtensionSettingsInfo="extension-settings-info",e.ExtensionZoneId="extension-zone-id",e.ExtensionMediaBlob="extension-media-blob",e.HasExtensionRenderingTimedOut="has-extension-rendering-timed-out",e.ExternalMenuDescription="external-menu-description",e.ExternalMenuHeader="external-menu-header",e.ExternalMenuItemDisplayName="external-menu-item-display-name",e.ExternalMenuItemId="external-menu-item-id",e.Field="field",e.FieldCount="field-count",e.FieldId="field-id",e.FieldName="field-name",e.FilterLevels="filter-levels",e.FilterRangeMax="filter-range-max",e.FilterRangeMin="filter-range-min",e.FilterRangeNullOption="filter-range-null-option",e.FilterUpdateType="filter-update-type",e.FilterValues="filter-values",e.FontNameListItems="font-name-list-items",e.FormattedText="formatted-text",e.FunctionName="function-name",e.FromIndex="from-index",e.HierValSelectionModels="hierarchicalValueSelectionModels",e.HighlightedData="highlighted-data",e.HoverTupleInteraction="hover-tuple-interaction",e.IgnoreAliases="ignore-aliases",e.IgnoreSelection="ignore-selection",e.IncludeAllColumns="include-all-columns",e.InvalidAggFieldName="invalid-agg-field-name",e.InvalidDates="invalid-dates",e.InvalidFieldCaption="invalid-field-caption",e.InvalidFields="invalid-fields",e.InvalidValues="invalid-values",e.IsAnalyticsAssistantAvailable="is-analytics-assistant-available",e.IsExcludeMode="is-exclude",e.IsExtensionDialog="is-extension-dialog",e.IsFromCalcDialog="is-from-calc-dialog",e.JoinDescription="join-description",e.LogicalTableId="logical-table-id",e.LogicalTableInfoList="logical-table-info-list",e.MarksCardIndex="marks-card-index",e.MaxHeight="max-height",e.MaxRows="max-rows",e.MaxWidth="max-width",e.MinHeight="min-height",e.MinWidth="min-width",e.PageRowCount="page-row-count",e.ParameterCaption="paremeter-caption",e.ParameterError="parameter-error",e.ParameterFieldName="parameter-field-name",e.ParameterInfo="parameter-info",e.ParameterInfos="parameter-infos",e.ParameterValue="parameter-value",e.PeriodType="period-type",e.PulseFieldName="fieldName",e.PulseFieldNames="fieldNames",e.PulseFilterDomainType="domainType",e.PulseFilterDomainSearchTerm="searchTerm",e.PulsePageSize="pageSize",e.PulseNextPageToken="nextPageToken",e.PulseFilters="filters",e.PulseTimeDimension="timeDimension",e.QuantitativeDomain="quantitative-dmain",e.QuantRangeSelectionModels="quantativeRangeSelectionModels",e.RangeN="range-n",e.ReplaySpeed="replay-speed",e.SelectedData="selected-data",e.SelectedSheetNames="selected-sheet-names",e.Selection="selection",e.SelectionList="selection-list",e.SelectionUpdateType="selectionUpdateType",e.SelectTuplesInteraction="select-tuples-interaction",e.SendNotifications="send-notifications",e.SettingsValues="settings-values",e.SharedFilterSheets="shared-filter-sheets",e.SharedFiltersInfo="shared-filters-info",e.SheetIdentifier="sheet-identifier",e.SheetName="sheet-name",e.SheetPath="sheet-path",e.ShouldRefreshDS="should-refresh-ds",e.ShowDataTableFormat="show-data-table-format",e.StartIndex="start-index",e.State="state",e.StoryPointIndex="story-point-index",e.StoryPointInfo="story-point-info",e.SwitchToSheetName="switch-to-sheet-name",e.TargetPoint="target-point",e.TestConversionParameter="test-conversion-parameter",e.Text="formatted-text",e.ToIndex="to-index",e.TooltipContext="tooltip-context",e.TooltipTextRequest="tooltip-text-request",e.TooltipText="tooltip-text",e.UnderlyingDataTable="underlying-data-table",e.UnderlyingSummaryDataTable="underlying-summary-data-table",e.Url="url",e.UseTabDelimiters="use-tab-delimiters",e.ViewDataTableCacheId="view-data-table-cache-id",e.ViewDataTableId="view-data-table-id",e.VisualId="visual-id",e.VisualSpecification="visual-specification",e.VizAPIInputJson="vizapi-input-json",e.VizAPIStateWithDataModel="vizapi-state-with-data-model",e.VizAPIStateWarningMsg="vizapi-state-warning-msg",e.VizAPISVG="vizapi-svg",e.WorksheetName="worksheet-name",e.WorksheetFilters="worksheet-filters",e.ZoneIdsVisibilityMap="zone-ids-visibility-map"}(r||(t.ParameterId=r={}))},7316:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},7464:function(e,t,r){"use strict";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,i)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),i=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.VersionedExternalApiDispatcher=t.VersionNumber=t.SheetUtils=t.ExportHelpers=t.ErrorHelpers=t.Deferred=t.TableauError=t.StoryActivationServiceImpl=t.SizeServiceImpl=t.ServiceImplBase=t.Registration=t.NotificationServiceImplBase=t.NotificationServiceImpl=t.ClientInfoServiceImpl=t.Point=t.WorksheetImpl=t.WorkbookImpl=t.StoryPointInfoImpl=t.StoryPointImpl=t.StoryImpl=t.SingleEventManagerImpl=t.SheetInfoImpl=t.SheetImpl=t.ParameterImpl=t.DataSourceImpl=t.DashboardObjectImpl=t.DashboardImpl=t.CustomViewImpl=t.Field=t.EventListenerManager=t.InternalToExternalEnumMappings=t.ExternalToInternalEnumMappings=t.DataSource=t.CrossFrameDispatcher=t.ApiVersion=void 0;var n=r(9279);Object.defineProperty(t,"ApiVersion",{enumerable:!0,get:function(){return n.ApiVersion}}),i(r(9188),t);var o=r(4941);Object.defineProperty(t,"CrossFrameDispatcher",{enumerable:!0,get:function(){return o.CrossFrameDispatcher}});var s=r(4602);Object.defineProperty(t,"DataSource",{enumerable:!0,get:function(){return s.DataSource}});var l=r(4369);Object.defineProperty(t,"ExternalToInternalEnumMappings",{enumerable:!0,get:function(){return l.ExternalToInternalEnumMappings}});var d=r(6753);Object.defineProperty(t,"InternalToExternalEnumMappings",{enumerable:!0,get:function(){return d.InternalToExternalEnumMappings}});var c=r(8904);Object.defineProperty(t,"EventListenerManager",{enumerable:!0,get:function(){return c.EventListenerManager}});var u=r(8127);Object.defineProperty(t,"Field",{enumerable:!0,get:function(){return u.Field}});var p=r(3092);Object.defineProperty(t,"CustomViewImpl",{enumerable:!0,get:function(){return p.CustomViewImpl}});var m=r(2632);Object.defineProperty(t,"DashboardImpl",{enumerable:!0,get:function(){return m.DashboardImpl}});var h=r(9531);Object.defineProperty(t,"DashboardObjectImpl",{enumerable:!0,get:function(){return h.DashboardObjectImpl}});var g=r(7887);Object.defineProperty(t,"DataSourceImpl",{enumerable:!0,get:function(){return g.DataSourceImpl}});var y=r(3443);Object.defineProperty(t,"ParameterImpl",{enumerable:!0,get:function(){return y.ParameterImpl}});var v=r(8935);Object.defineProperty(t,"SheetImpl",{enumerable:!0,get:function(){return v.SheetImpl}});var I=r(9735);Object.defineProperty(t,"SheetInfoImpl",{enumerable:!0,get:function(){return I.SheetInfoImpl}});var S=r(5885);Object.defineProperty(t,"SingleEventManagerImpl",{enumerable:!0,get:function(){return S.SingleEventManagerImpl}});var f=r(9661);Object.defineProperty(t,"StoryImpl",{enumerable:!0,get:function(){return f.StoryImpl}});var b=r(7663);Object.defineProperty(t,"StoryPointImpl",{enumerable:!0,get:function(){return b.StoryPointImpl}});var T=r(1471);Object.defineProperty(t,"StoryPointInfoImpl",{enumerable:!0,get:function(){return T.StoryPointInfoImpl}});var P=r(770);Object.defineProperty(t,"WorkbookImpl",{enumerable:!0,get:function(){return P.WorkbookImpl}});var E=r(3964);Object.defineProperty(t,"WorksheetImpl",{enumerable:!0,get:function(){return E.WorksheetImpl}});var A=r(9357);Object.defineProperty(t,"Point",{enumerable:!0,get:function(){return A.Point}}),i(r(5493),t),i(r(2140),t);var _=r(1615);Object.defineProperty(t,"ClientInfoServiceImpl",{enumerable:!0,get:function(){return _.ClientInfoServiceImpl}});var D=r(1611);Object.defineProperty(t,"NotificationServiceImpl",{enumerable:!0,get:function(){return D.NotificationServiceImpl}});var w=r(8194);Object.defineProperty(t,"NotificationServiceImplBase",{enumerable:!0,get:function(){return w.NotificationServiceImplBase}}),Object.defineProperty(t,"Registration",{enumerable:!0,get:function(){return w.Registration}});var F=r(1891);Object.defineProperty(t,"ServiceImplBase",{enumerable:!0,get:function(){return F.ServiceImplBase}});var C=r(6261);Object.defineProperty(t,"SizeServiceImpl",{enumerable:!0,get:function(){return C.SizeServiceImpl}});var x=r(9753);Object.defineProperty(t,"StoryActivationServiceImpl",{enumerable:!0,get:function(){return x.StoryActivationServiceImpl}});var M=r(3267);Object.defineProperty(t,"TableauError",{enumerable:!0,get:function(){return M.TableauError}});var N=r(6658);Object.defineProperty(t,"Deferred",{enumerable:!0,get:function(){return N.Deferred}});var O=r(2782);Object.defineProperty(t,"ErrorHelpers",{enumerable:!0,get:function(){return O.ErrorHelpers}});var k=r(4706);Object.defineProperty(t,"ExportHelpers",{enumerable:!0,get:function(){return k.ExportHelpers}});var R=r(633);Object.defineProperty(t,"SheetUtils",{enumerable:!0,get:function(){return R.SheetUtils}});var V=r(2570);Object.defineProperty(t,"VersionNumber",{enumerable:!0,get:function(){return V.VersionNumber}});var z=r(9730);Object.defineProperty(t,"VersionedExternalApiDispatcher",{enumerable:!0,get:function(){return z.VersionedExternalApiDispatcher}})},7515:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},7640:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ZoneServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(4369),o=r(2782),s=r(720),l=r(1891);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 s.Param.convertParameterToMap(r,"zoneVisibilityMap").forEach((e,r)=>{o.ErrorHelpers.verifyZoneIsValid(t,Number.parseInt(r,10)),o.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=>{o.ErrorHelpers.verifyZoneIsValidAndFloating(t,e.dashboardObjectID),o.ErrorHelpers.verifyWidthAndHeightOfDashboardObjectPositionAndSizeUpdate(e)}),this.execute(i.VerbId.MoveAndResizeZones,a).then(e=>{})}}t.ZoneServiceImpl=d},7663:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StoryPointImpl=void 0;const a=r(5691),i=r(3267),n=r(633),o=r(2632),s=r(9735),l=r(3964);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,p=d?d.url:"",m=new s.SheetInfoImpl(e.name,n.SheetUtils.getSheetTypeEnum(e.sheetType),c,-1,!1,u,p);let h;switch(m.sheetType){case a.SheetType.Worksheet:{const e={worksheet:m.name};h=new l.WorksheetImpl(m,r,e,null,this);break}case a.SheetType.Dashboard:{const t={sheetName:m.name,isDashboard:!0};h=new o.DashboardImpl(m,e.dashboardZones,t,r,this);break}default:throw new i.TableauError(a.SharedErrorCodes.ServerError,"Invalid SheetType")}return h}}},7664:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.PulseOptionNames=void 0,function(e){e.embed="embed",e.token="token",e.disableExploreFilter="disableExploreFilter",e.layout="embed_layout",e.theme="embed_theme",e.ApiExternalVersion=":apiExternalVersion",e.ApiInternalVersion=":apiInternalVersion",e.EmbedCount=":embcount",e.PulseWebComponent=":pulseWebComponent"}(r||(t.PulseOptionNames=r={}))},7708:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorksheetFormattingChangedEvent=void 0;const a=r(5691),i=r(769);class n extends i.TableauWorksheetEvent{constructor(e,t){super(a.TableauEventType.WorksheetFormattingChanged,e),this._formatting=t}get formatting(){return this._formatting}}t.WorksheetFormattingChangedEvent=n},7736:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.registerAllExtensionsServices=function(e){a.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new n.SettingsServiceImpl(e,s.ExtensionsRegistryId)),a.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new o.UIServiceImpl(e,s.ExtensionsRegistryId))},t.registerInitializationExtensionsServices=function(e){a.ApiServiceRegistry.get(s.ExtensionsRegistryId).registerService(new i.InitializationServiceImpl(e,s.ExtensionsRegistryId))};const a=r(7464),i=r(5204),n=r(407),o=r(2594),s=r(8518)},7742:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ParametersServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(3443),o=r(3267),s=r(1891);class l extends s.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 o.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},7750:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},7832:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.FieldImpl=void 0;const a=r(5691),i=r(6636),n=r(6753);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)&&void 0!==e?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}get semanticRole(){return this._fieldInfo.semanticRole}get dataFormat(){return this._fieldInfo.dataFormat}}},7852: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 o(e){try{l(a.next(e))}catch(e){n(e)}}function s(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(o,s)}l((a=a.apply(e,t||[])).next())})};Object.defineProperty(t,"__esModule",{value:!0}),t.FilterServiceImpl=void 0;const i=r(5691),n=r(6636),o=r(6636),s=r(7464),l=r(4369),d=r(6753),c=r(5520),u=r(9012),p=r(720),m=r(1891);class h extends m.ServiceImplBase{get serviceName(){return"filter-service"}applyFilterAsync(e,t,r,a,n){const d=o.VerbId.ApplyCategoricalFilter,c={[o.ParameterId.FunctionName]:"applyFilterAsync"};if(c[o.ParameterId.VisualId]=e,c[o.ParameterId.FieldName]=t,!Array.isArray(r))throw new s.TableauError(i.ErrorCodes.InvalidParameter,"values parameter for applyFilterAsync must be an array");return c[o.ParameterId.FilterValues]=r,c[o.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(a),c[o.ParameterId.IsExcludeMode]=void 0!==n&&void 0!==n.isExcludeMode&&n.isExcludeMode,this.execute(d,c).then(e=>t)}applyRangeFilterAsync(e,t,r){const a=o.VerbId.ApplyRangeFilter,i={[o.ParameterId.FunctionName]:"applyRangeFilterAsync"};if(void 0!==r.min&&null!==r.min){let e;e=r.min instanceof Date?p.Param.serializeDateForPlatform(r.min):r.min,i[o.ParameterId.FilterRangeMin]=e}if(void 0!==r.max&&null!==r.max){let e;e=r.max instanceof Date?p.Param.serializeDateForPlatform(r.max):r.max,i[o.ParameterId.FilterRangeMax]=e}return r.nullOption&&(i[o.ParameterId.FilterRangeNullOption]=l.ExternalToInternalEnumMappings.nullOptions.convert(r.nullOption)),i[o.ParameterId.FieldName]=t,i[o.ParameterId.VisualId]=e,this.execute(a,i).then(e=>(this.apiFilterHandlerCheckForCommandError(e.result),t))}applyHierarchicalFilterAsync(e,t,r,a,i){const n=o.VerbId.HierarchicalFilter,s={[o.ParameterId.FunctionName]:"applyHierarchicalFilterAsync"};s[o.ParameterId.VisualId]=e,s[o.ParameterId.FieldName]=t;const d=r.levels;return Array.isArray(d)&&d.length>0?s[o.ParameterId.FilterLevels]=d:r.length>0?s[o.ParameterId.FilterValues]=r:s[o.ParameterId.FilterLevels]=[],s[o.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(a),s[o.ParameterId.IsExcludeMode]=i&&!!i.isExcludeMode,this.execute(n,s).then(e=>t)}clearFilterAsync(e,t){const r=o.VerbId.ClearFilter,a={[o.ParameterId.FunctionName]:"clearFilterAsync"};return a[o.ParameterId.VisualId]=e,a[o.ParameterId.FieldName]=t,this.execute(r,a).then(e=>t)}applyRelativeDateFilterAsync(e,t,r){const a=o.VerbId.ApplyRelativeDateFilter,n={[o.ParameterId.FunctionName]:"applyRelativeDateFilterAsync"};if(n[o.ParameterId.VisualId]=e,n[o.ParameterId.FieldName]=t,n[o.ParameterId.PeriodType]=l.ExternalToInternalEnumMappings.periodType.convert(r.periodType),n[o.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 s.TableauError(i.EmbeddingErrorCodes.MissingRangeNForRelativeDateFilters,"Missing rangeN field for a relative date filter of LASTN or NEXTN.");n[o.ParameterId.RangeN]=r.rangeN}return void 0!==r.anchorDate&&null!==r.anchorDate&&(n[o.ParameterId.AnchorDate]=this.convertAnchorDate(r.anchorDate)),this.execute(a,n).then(e=>e.result)}getFiltersAsync(e){const t=o.VerbId.GetFilters,r={[o.ParameterId.FunctionName]:"getFiltersAsync"};return r[o.ParameterId.VisualId]=e,this.execute(t,r).then(e=>{const t=e.result;return this.convertDomainFilters(t)})}getCategoricalDomainAsync(e,t,r){const a=o.VerbId.GetCategoricalDomain,i={[o.ParameterId.FunctionName]:"getCategoricalDomainAsync"};return i[o.ParameterId.VisualId]={worksheet:e},i[o.ParameterId.FieldId]=t,i[o.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=o.VerbId.GetRangeDomain,i={[o.ParameterId.FunctionName]:"getRangeDomainAsync"};return i[o.ParameterId.VisualId]={worksheet:e},i[o.ParameterId.FieldId]=t,i[o.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=o.VerbId.GetDashboardFilters,t={[o.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=o.VerbId.DashboardCategoricalFilter,n={[o.ParameterId.FunctionName]:"applyDashboardFilterAsync"};return n[o.ParameterId.FieldName]=e,n[o.ParameterId.FilterValues]=t,n[o.ParameterId.FilterUpdateType]=l.ExternalToInternalEnumMappings.filterUpdateType.convert(r),n[o.ParameterId.IsExcludeMode]=a&&!!a.isExcludeMode,this.execute(i,n).then(e=>e.result)}getAppliedWorksheetsAsync(e,t){return a(this,void 0,void 0,function*(){var r;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 s.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 s.TableauError(i.SharedErrorCodes.InternalError,"No active worksheet");if(!n.includes(d))throw new s.TableauError(i.SharedErrorCodes.InternalError,`${d} must be included in the applied worksheets`);n.forEach(e=>{if(!l.includes(e))throw new s.TableauError(i.SharedErrorCodes.InternalError,`The field ${t} isn't applicable to the worksheet ${e}`)});const c=o.VerbId.ChangeSharedFilter,u={};return u[o.ParameterId.FunctionName]="setAppliedWorksheetsAsync",u[o.ParameterId.VisualId]={worksheet:e},u[o.ParameterId.FieldId]=r,u[o.ParameterId.SharedFilterSheets]=n,this.execute(c,u).then(e=>n)})}executeGetAppliedWorksheets(e,t,r){const a=o.VerbId.GetSharedFilter,i={};return i[o.ParameterId.FunctionName]=r,i[o.ParameterId.VisualId]={worksheet:e},i[o.ParameterId.FieldId]=t,this.execute(a,i).then(e=>e.result)}convertDomainFilters(e){const t=[];return e.forEach(e=>{switch(e.filterType){case o.FilterType.Categorical:{const r=e;if(!r)throw new Error("Invalid Categorical Filter");t.push(this.convertCategoricalFilter(r));break}case o.FilterType.Hierarchical:{const r=e;if(!r)throw new Error("Invalid Hierarchical Filter");t.push(this.convertHierarchicalFilter(r));break}case o.FilterType.Range:{const r=e;if(!r)throw new Error("Invalid Range Filter");t.push(this.convertRangeFilter(r));break}case o.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,i.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,i.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,i.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(),o=e.getUTCMinutes(),l=e.getUTCSeconds();if(isNaN(t)||isNaN(r)||isNaN(a)||isNaN(n)||isNaN(o)||isNaN(l))throw new s.TableauError(i.EmbeddingErrorCodes.InvalidDateParameter,"Invalid date parameter: anchorDate");return`${t}-${r}-${a} ${n}:${o}:${l}`}apiFilterHandlerCheckForCommandError(e){if(e[n.ParameterId.ParameterError]){if(e[n.ParameterId.InvalidFieldCaption])throw new s.TableauError(i.SharedErrorCodes.InvalidFilterFieldName,e[n.ParameterId.InvalidFieldCaption]);if(e[n.ParameterId.InvalidValues])throw new s.TableauError(i.SharedErrorCodes.InvalidFilterFieldValue,e[n.ParameterId.InvalidValues]);if(e[n.ParameterId.InvalidAggFieldName])throw new s.TableauError(i.SharedErrorCodes.InvalidAggregationFieldName,e[n.ParameterId.InvalidAggFieldName]);throw new s.TableauError(i.SharedErrorCodes.ServerError,"Server Error")}}}t.FilterServiceImpl=h},7879:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Environment=void 0;const a=r(7464),i=r(4524),n=r(8484);t.Environment=class{constructor(e){this._apiVersion=a.ApiVersion.Instance&&a.ApiVersion.Instance.formattedValue,this._context=a.InternalToExternalEnumMappings.extensionContext.convert(e.extensionContext),this._isExporting=e.isExporting,this._formatting=n.WorkbookFormattingEnvUtil.convertToWorkbookFormatting(e.workbookFormatting),this._language=e.extensionLanguage,this._country=e.extensionCountry,this._locale=e.extensionLocale,this._workbookLocale=e.workbookLocale,this._mode=a.InternalToExternalEnumMappings.extensionMode.convert(e.extensionMode),this._operatingSystem=e.operatingSystem,this._tableauVersion=e.tableauVersion,this._uniqueUserId=e.uniqueUserId,this._exportedMediaType=e.exportedMediaType?a.InternalToExternalEnumMappings.exportedMediaType.convert(e.exportedMediaType):void 0,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 workbookLocale(){return this._workbookLocale}get mode(){return this._mode}get operatingSystem(){return this._operatingSystem}get tableauVersion(){return this._tableauVersion}get uniqueUserId(){return this._uniqueUserId}get isExporting(){return this._isExporting}get exportedMediaType(){return this._exportedMediaType}}},7887:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataSourceImpl=void 0;const a=r(5691),i=r(8395),n=r(8127),o=r(8810),s=r(2140),l=r(1871),d=r(2782),c=r(7832);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 s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").refreshAsync(this._dataSourceInfo.id)}getConnectionSummariesAsync(){return s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getConnectionSummariesAsync(this._dataSourceInfo.id).then(e=>e.map(e=>new i.ConnectionSummary(e)))}getActiveTablesAsync(){return s.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||{},s.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||{},s.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||{},s.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 s.ApiServiceRegistry.get(this._registryId).getService("data-source-service").getLogicalTablesAsync(this.id).then(e=>e.map(e=>new o.LogicalTable(e)))}}},7944:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Dashboard=void 0;const a=r(5691),i=r(6636),n=r(7464),o=r(9385),s=r(636),l=r(8518),d=r(895),c=r(751),u=r(9680);class p 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 o.DashboardLayoutChangedEvent(t))}),e.push(r);const d=new n.SingleEventManagerImpl(a.TableauEventType.WorkbookFormattingChanged);return t.registerHandler(i.NotificationId.WorkbookFormattingChanged,()=>!0,e=>{d.triggerEvent(()=>new s.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=p},8013:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SettingsImpl=void 0;const a=r(5691),i=r(6636),n=r(7464),o=r(9577),s=r(8518);class l extends o.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(s.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(s.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new n.SingleEventManagerImpl(a.TableauEventType.SettingsChanged);return t.registerHandler(i.NotificationId.SettingsChanged,()=>!0,e=>{var t;this._currentSettings=null!==(t=e.newSettings)&&void 0!==t?t:{},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."},8127:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Field=void 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}get semanticRole(){return this._fieldImpl.semanticRole}get dataFormat(){return this._fieldImpl.dataFormat}}},8194:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.NotificationServiceImplBase=t.Registration=void 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))}}},8347:e=>{"use strict";e.exports=JSON.parse('{"major":1,"minor":196,"fix":0}')},8395:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ConnectionSummary=void 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}}},8413:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorksheetContent=void 0,t.WorksheetContent=class{constructor(e){this._worksheet=e}get worksheet(){return this._worksheet}}},8484:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.WorkbookFormattingEnvUtil=void 0;const a=r(7464);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})}}}},8518:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ExtensionsRegistryId=void 0,t.ExtensionsRegistryId=0},8531:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.isMessage=s,t.isVersion=l,t.isInitMessage=function(e){if(!s(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(!s(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(!s(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(!s(e))return!1;const t=e;return t.msgType===n.MessageType.Notification&&(!(!t.data&&!o.has(t.notificationId))&&!(!t.notificationId||"string"!=typeof t.notificationId))},t.isHandshakeMessage=function(e){return!!s(e)&&e.msgType===n.MessageType.Handshake};const a=r(1966),i=r(6677),n=r(8709),o=new Set([i.NotificationId.EditButtonClicked,i.NotificationId.EditInDesktopButtonClicked,i.NotificationId.WorkbookPublished,i.NotificationId.WorkbookReadyToClose,i.NotificationId.ReadyToReceiveAuthToken]);function s(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}},8709:(e,t)=>{"use strict";var r;Object.defineProperty(t,"__esModule",{value:!0}),t.MessageType=void 0,function(e){e.Initialize="initialize",e.Notification="notification",e.Command="command",e.CommandResponse="command-response",e.Handshake="v-handshake",e.Ack="v-ack"}(r||(t.MessageType=r={}))},8810:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.LogicalTable=void 0,t.LogicalTable=class{constructor(e){this._logicalTable=e}get id(){return this._logicalTable.id}get caption(){return this._logicalTable.caption}}},8904:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.EventListenerManager=void 0;const a=r(5691),i=r(3267);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}}},8935:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SheetImpl=void 0;const a=r(5691),i=r(2140),n=r(3267),o=r(2782),s=r(720),l=r(633);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 o.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),o=r.behavior===a.SheetSizeBehavior.Automatic;if(!o&&!r.minSize&&!r.maxSize)throw t;if(!o&&this.sheetType===a.SheetType.Worksheet)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSizeBehaviorOnWorksheet,"Only SheetSizeBehavior.Automatic is allowed on Worksheets");if(o&&this.getSheetSize().behavior===r.behavior)return Promise.resolve(e);const s=this.processNewSize(r);return i.ApiServiceRegistry.get(this._registryId).getService("size-service").changeSizeAsync(this.name,s).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 o.ErrorHelpers.verifyEnumValue(t,a.SheetSizeBehavior,"SheetSizeBehavior"),{behavior:t,minSize:d.parseDimensions(e.minSize),maxSize:d.parseDimensions(e.maxSize)}}processNewSize(e){const{behavior:t,minSize:r,maxSize:i}=e,o=!s.Param.isNullOrUndefined(null==r?void 0:r.width),l=!s.Param.isNullOrUndefined(null==r?void 0:r.height),d=!s.Param.isNullOrUndefined(null==i?void 0:i.width),c=!s.Param.isNullOrUndefined(null==i?void 0:i.height),u=o&&l,p=d&&c;switch(t){case a.SheetSizeBehavior.Automatic:return{behavior:t};case a.SheetSizeBehavior.AtMost:{if(!i||!p)throw new n.TableauError(a.EmbeddingErrorCodes.MissingMaxSize,"Missing maxSize for SheetSizeBehavior.AtMost");const e={width:i.width,height:i.height};if(e.width<0||e.height<0)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:t,maxSize:e}}case a.SheetSizeBehavior.AtLeast:{if(!r||!u)throw new n.TableauError(a.EmbeddingErrorCodes.MissingMinSize,"Missing minSize for SheetSizeBehavior.AtLeast");const e={width:r.width,height:r.height};if(e.width<0||e.height<0)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Size value cannot be less than zero");return{behavior:t,minSize:e}}case a.SheetSizeBehavior.Range:{if(!(r&&i&&u&&p))throw new n.TableauError(a.EmbeddingErrorCodes.MissingMinMaxSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");const e={width:r.width,height:r.height},o={width:i.width,height:i.height};if(e.width<0||e.height<0||o.width<0||o.height<0||e.width>o.width||e.height>o.height)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Missing minSize or maxSize for SheetSizeBehavior.Range");return{behavior:t,minSize:e,maxSize:o}}case a.SheetSizeBehavior.Exactly:if(r&&i){if(u&&p){const e={width:r.width,height:r.height},o={width:i.width,height:i.height};if(e.width!==o.width||e.height!==o.height)throw new n.TableauError(a.EmbeddingErrorCodes.InvalidSize,"Conflicting size values for SheetSizeBehavior.Exactly");return{behavior:t,minSize:e,maxSize:o}}if(u){const e={width:r.width,height:r.height};return{behavior:t,minSize:e,maxSize:e}}if(p){const e={width:i.width,height:i.height};return{behavior:t,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: ${t}`)}}}t.SheetImpl=d,d.parseDimensions=e=>{const t={width:void 0,height:void 0};if(!e)return t;const{success:r,parsed:a}=s.Param.tryParseNumber(e.width),{success:i,parsed:n}=s.Param.tryParseNumber(e.height);return r&&i?{width:a,height:n}:r?{width:a}:i?{height:n}:t}},9012:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DataValueFactory=void 0;const a=r(6636),i=r(608);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)}}},9074:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AccessibilityServiceImpl=void 0;const a=r(6636),i=r(1592),n=r(1891);class o 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=o},9153:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.AnnotationServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(6753),o=r(1990),s=r(3267),l=r(1891);class d extends l.ServiceImplBase{get serviceName(){return"annotation-service"}annotateMarkAsync(e,t,r){const a=this.parseMarkSelectionIds([t]),n=`${r}`,o={[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,o).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 o.SelectionModelsContainer;if(e.forEach(e=>{const r=e.tupleId;if(!(null!=r&&r>0))throw new s.TableauError(a.ErrorCodes.InternalError,"invalid tupleId");t.push(r.toString())}),0!==t.length){const e=new o.TupleSelectionModel;e.selectionType="tuples",e.objectIds=t,r.selection=e}return r}parseAnnotationSelectionIds(e){const t=[],r=new o.SelectionModelsContainer;if(e.forEach(e=>{const r=e.annotationId;if(!(null!=r&&r>=0))throw new s.TableauError(a.ErrorCodes.InternalError,"invalid annotationId");t.push(r.toString())}),0!==t.length){const e=new o.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},9188:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.doCrossFrameBootstrap=function(e,t,r){return new Promise((n,o)=>{let s;s=function(e){try{return e.self!==e.parent}catch(e){return!0}}(e)?e.parent:e.opener,s||o("This extension is not running inside an iframe, desktop, or popup window. Initialization failed.");const l=new a.CrossFrameMessenger(e,s,"*"),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()})};const a=r(6636),i=r(4941)},9216:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SelectionServiceImpl=void 0;const a=r(5691),i=r(6636),n=r(1990),o=r(3267),s=r(720),l=r(1891);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 o.TableauError(a.ErrorCodes.InvalidParameter,"Selection criteria missing for selecting marks by value");const n=this.validateSelectionUpdateType(r),s=this.parseSelectionMarks(t),l={[i.ParameterId.FunctionName]:"selectMarksByValueAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.SelectionUpdateType]:n};return s.hierModelArr&&s.hierModelArr.length&&(l[i.ParameterId.HierValSelectionModels]=s.hierModelArr),s.quantModelArr&&s.quantModelArr.length&&(l[i.ParameterId.QuantRangeSelectionModels]=s.quantModelArr),s.dimModelArr&&s.dimModelArr.length&&(l[i.ParameterId.DimValSelectionModels]=s.dimModelArr),this.execute(i.VerbId.SelectByValue,l).then(e=>{this.apiFilterHandlerCheckForCommandError(e.result)})}hoverTupleAsync(e,t,r,a){let o=new n.HoverTupleInteractionModel(e,this.ensureTupleIDIsNonNegative(t),r,a);const s={[i.ParameterId.FunctionName]:"hoverTupleAsync",[i.ParameterId.HoverTupleInteraction]:o};return this.execute(i.VerbId.RaiseHoverTupleNotification,s).then(e=>{})}selectTuplesAsync(e,t,r,a){let o=new n.SelectTuplesInteractionModel(e,t,r,a);const s={[i.ParameterId.FunctionName]:"selectTuplesAsync",[i.ParameterId.SelectTuplesInteraction]:o};return this.execute(i.VerbId.RaiseSelectTuplesNotification,s).then(e=>{})}apiFilterHandlerCheckForCommandError(e){if(e[i.ParameterId.ParameterError]){if(e[i.ParameterId.InvalidFields])throw new o.TableauError(a.SharedErrorCodes.InvalidSelectionFieldName,e[i.ParameterId.InvalidFields]);if(e[i.ParameterId.InvalidValues])throw new o.TableauError(a.SharedErrorCodes.InvalidSelectionValue,e[i.ParameterId.InvalidValues]);if(e[i.ParameterId.InvalidDates])throw new o.TableauError(a.SharedErrorCodes.InvalidSelectionDate,e[i.ParameterId.InvalidDates])}}selectMarksByIdAsync(e,t,r){if(0===t.length)throw new o.TableauError(a.ErrorCodes.InvalidParameter,"Marks info missing for selecting marks by Id");const n=this.validateSelectionUpdateType(r),s=this.parseSelectionIds(t),l={[i.ParameterId.FunctionName]:"selectMarksByIdAsync",[i.ParameterId.VisualId]:e,[i.ParameterId.SelectionUpdateType]:n,[i.ParameterId.Selection]:s.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},9279:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.ApiVersion=void 0;const a=r(2570);class i{static get Instance(){return i._instance}static SetVersionNumber(e,t){i._instance=new a.VersionNumber(e,t)}}t.ApiVersion=i},9336:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},9357:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Point=void 0,t.Point=class{constructor(e,t){this._x=e,this._y=t}get x(){return this._x}get y(){return this._y}}},9385:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardLayoutChangedEvent=void 0;const a=r(5691),i=r(9577);class n extends i.TableauEvent{constructor(e){super(a.TableauEventType.DashboardLayoutChanged),this._dashboardLayoutChangeDetails=e}get dashboardLayoutChangeDetails(){return this._dashboardLayoutChangeDetails}}t.DashboardLayoutChangedEvent=n},9435:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StackingVersionConverter=void 0,t.StackingVersionConverter=class{static fromData(e,t,r,a,i){return new this(e.major,t.major,r,a,i)}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}`)}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}}},9531:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.DashboardObjectImpl=void 0,t.DashboardObjectImpl=class{constructor(e,t,r,a,i,n,o,s,l,d){this._dashboardImpl=e,this._type=t,this._position=r,this._size=a,this._worksheetImpl=i,this._name=n,this._isFloating=o,this._isVisible=s,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}}},9577:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.TableauEvent=void 0,t.TableauEvent=class{constructor(e){this._type=e}get type(){return this._type}}},9605:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.VizServiceImpl=void 0;const a=r(6636),i=r(3092),n=r(1891);class o 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=>{const t=e.result;return(null==t?void 0:t.luid)?new i.CustomViewImpl(t,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=o},9640: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 o(e){try{l(a.next(e))}catch(e){n(e)}}function s(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(o,s)}l((a=a.apply(e,t||[])).next())})};Object.defineProperty(t,"__esModule",{value:!0}),t.ExportServiceImpl=void 0;const i=r(5691),n=r(6636),o=r(4369),s=r(3267),l=r(2782),d=r(4706),c=r(1891);class u extends c.ServiceImplBase{get serviceName(){return"export-service"}getExportCrosstabSheetMapAsync(e){const t=n.VerbId.GetExportCrosstabSheetMap,r={[n.ParameterId.FunctionName]:"getExportCrosstabSheetMapAsync",[n.ParameterId.CurrentSheetType]:o.ExternalToInternalEnumMappings.sheetType.convert(e)};return this.execute(t,r).then(e=>e.result)}exportCrosstabAsync(e,t,r,o){return a(this,void 0,void 0,function*(){l.ErrorHelpers.verifySheetName(r,e),l.ErrorHelpers.verifyEnumValue(t,i.CrosstabFileFormat,"CrosstabFileFormat");const a=yield this.getExportCrosstabSheetMapAsync(o);if(!a[e])throw new s.TableauError(i.SharedErrorCodes.InternalError,"missing sheet doc id from sheetMap");const d={[n.ParameterId.FunctionName]:"exportCrosstabAsync",[n.ParameterId.SheetIdentifier]:a[e],[n.ParameterId.SendNotifications]:!0};let c;switch(t){case i.CrosstabFileFormat.CSV:c=n.VerbId.ExportCrosstabCsvDownload,d[n.ParameterId.UseTabDelimiters]=!0;break;case i.CrosstabFileFormat.Excel:c=n.VerbId.ExportCrosstabExcelDownload;break;default:throw new s.TableauError(i.SharedErrorCodes.InternalError,"unsupported Crosstab file format.")}return this.execute(c,d).then(e=>e.result).catch(()=>{throw new s.TableauError(i.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),o=Array.from(a),d=n.VerbId.ExportDataDownload,c={[n.ParameterId.FunctionName]:"exportDataAsync",[n.ParameterId.VisualId]:e,[n.ParameterId.IgnoreAliases]:null!==(r=t.ignoreAliases)&&void 0!==r&&r,[n.ParameterId.ColumnsToIncludeById]:o};return this.execute(d,c).then(()=>{}).catch(()=>{throw new s.TableauError(i.SharedErrorCodes.DataCreationError,"An unexpected error occurred while generating the document.")})}exportPowerPointAsync(e,t){l.ErrorHelpers.verifySheetNamesForPDFAndPPT(e,t);const r=n.VerbId.ExportPowerpointDownload,a={[n.ParameterId.FunctionName]:"exportPowerPointAsync",[n.ParameterId.ExportOriginUrl]:"",[n.ParameterId.SelectedSheetNames]:e};return this.execute(r,a).then(e=>e.result).catch(()=>{throw new s.TableauError(i.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();d.ExportHelpers.updateInternalExportPDFOptions(a,t,e);const o=n.VerbId.ExportPdfDownload,c={[n.ParameterId.FunctionName]:"exportPDFAsync",[n.ParameterId.ExportPdfOptions]:a};return this.execute(o,c).then(e=>e.result).catch(()=>{throw new s.TableauError(i.SharedErrorCodes.PDFCreationError,"Unable to create PDF because something went wrong. Try again.")})})}getExportPDFOptionsAsync(){const e=n.VerbId.GetExportPdfOptions,t={[n.ParameterId.FunctionName]:"getExportPdfOptionsAsync"};return this.execute(e,t).then(e=>e.result)}reportExtensionRenderComplete(e){const t={[n.ParameterId.FunctionName]:n.VerbId.ReportExtensionRenderComplete,[n.ParameterId.HasExtensionRenderingTimedOut]:!1};return e&&(t[n.ParameterId.ExtensionMediaBlob]=e),this.execute(n.VerbId.ReportExtensionRenderComplete,t).then(()=>{})}}t.ExportServiceImpl=u},9661:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StoryImpl=void 0;const a=r(5691),i=r(2140),n=r(3267),o=r(2782),s=r(6950),l=r(8935),d=r(7663),c=r(1471);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 s.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(o.ErrorHelpers.verifyParameter(e,"index"),o.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(o.ErrorHelpers.verifyParameter(e,"index"),o.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},9680:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.Worksheet=void 0;const a=r(5691),i=r(5691),n=r(6636),o=r(7464),s=r(4641),l=r(4858),d=r(7039),c=r(7708),u=r(8518),p=r(7944),m=r(751);class h extends m.Sheet{constructor(e){super(e),this._worksheetImpl=e,this.initializeEvents().forEach(e=>this.addNewEventType(e))}get parentDashboard(){if(null==this._worksheetImpl.parentDashboard)throw new o.TableauError(a.SharedErrorCodes.ImplementationError,"Parent dashboard not implemented");return new p.Dashboard(this._worksheetImpl.parentDashboard)}get backgroundColor(){if(null==this._worksheetImpl.backgroundColor)throw new o.TableauError(a.SharedErrorCodes.ImplementationError,"Worksheet background color is not available");return this._worksheetImpl.backgroundColor}get formatting(){if(null==this._worksheetImpl.formatting)throw new o.TableauError(a.SharedErrorCodes.ImplementationError,"Worksheet formatting information is not available");return this._worksheetImpl.formatting}initializeEvents(){const e=new Array;let t;try{t=o.ApiServiceRegistry.get(u.ExtensionsRegistryId).getService("notification-service")}catch(t){return e}const r=new o.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 o.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 s.FilterChangedEvent(this,e.fieldName,e.fieldId))});const p=new o.SingleEventManagerImpl(i.TableauEventType.SummaryDataChanged);t.registerHandler(n.NotificationId.SummaryDataChanged,e=>{const t=e;return this._worksheetImpl.visualId.worksheet===t.visualId.worksheet},e=>{p.triggerEvent(()=>new d.SummaryDataChangedEvent(this))});const m=new o.SingleEventManagerImpl(i.TableauEventType.WorksheetFormattingChanged);return t.registerHandler(n.NotificationId.WorksheetFormattingChanged,e=>{const t=e;return this._worksheetImpl.visualId.worksheet===t.visualId.worksheet},e=>{m.triggerEvent(()=>new c.WorksheetFormattingChangedEvent(this,e))}),e.push(r),e.push(a),e.push(p),e.push(m),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=h},9730:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.VersionedExternalApiDispatcher=void 0;const a=r(6636);t.VersionedExternalApiDispatcher=class{constructor(e,t){this._apiDelegateDispatcher=e,this._versionConverter=(0,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(0,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)}}},9735:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.SheetInfoImpl=void 0;const a=r(5691);t.SheetInfoImpl=class{constructor(e,t,r,a,i,n,o){this._name=e,this._sheetType=t,this._sheetSize=r,this._index=a,this._isActive=i,this._isHidden=n,this._url=o}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}}},9745:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0})},9753:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.StoryActivationServiceImpl=void 0;const a=r(6636),i=r(1891);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},9770:function(e,t,r){"use strict";var a=this&&this.__createBinding||(Object.create?function(e,t,r,a){void 0===a&&(a=r);var i=Object.getOwnPropertyDescriptor(t,r);i&&!("get"in i?!t.__esModule:i.writable||i.configurable)||(i={enumerable:!0,get:function(){return t[r]}}),Object.defineProperty(e,a,i)}:function(e,t,r,a){void 0===a&&(a=r),e[a]=t[r]}),i=this&&this.__exportStar||function(e,t){for(var r in e)"default"===r||Object.prototype.hasOwnProperty.call(t,r)||a(t,e,r)};Object.defineProperty(t,"__esModule",{value:!0}),t.ZoneVisibilityType=t.TrendLineModelType=t.SortDirection=t.SheetType=t.SelectOptions=t.SelectionUpdateType=t.ReplaySpeedType=t.QuickTableCalcType=t.PeriodType=t.ParameterValueType=t.NumberFormatUnits=t.NegativeNumberFormat=t.MarkType=t.IncludeDataValuesOption=t.HierarchicalLevelSelectionState=t.FilterUpdateType=t.FilterType=t.FilterNullOption=t.FilterDomainType=t.FieldRoleType=t.FieldAggregationType=t.EncodingType=t.DialogStyle=t.DateRangeType=t.DataType=t.DataFormatType=t.DashboardObjectVisibilityType=t.DashboardObjectType=t.DashboardLayoutChange=t.ColumnType=t.ClassNameKey=t.AnnotationType=t.AnalyticsObjectType=void 0,i(r(6879),t),i(r(3855),t),i(r(7316),t),i(r(370),t),i(r(9745),t),i(r(6300),t);var n=r(6575);Object.defineProperty(t,"AnalyticsObjectType",{enumerable:!0,get:function(){return n.AnalyticsObjectType}}),Object.defineProperty(t,"AnnotationType",{enumerable:!0,get:function(){return n.AnnotationType}}),Object.defineProperty(t,"ClassNameKey",{enumerable:!0,get:function(){return n.ClassNameKey}}),Object.defineProperty(t,"ColumnType",{enumerable:!0,get:function(){return n.ColumnType}}),Object.defineProperty(t,"DashboardLayoutChange",{enumerable:!0,get:function(){return n.DashboardLayoutChange}}),Object.defineProperty(t,"DashboardObjectType",{enumerable:!0,get:function(){return n.DashboardObjectType}}),Object.defineProperty(t,"DashboardObjectVisibilityType",{enumerable:!0,get:function(){return n.DashboardObjectVisibilityType}}),Object.defineProperty(t,"DataFormatType",{enumerable:!0,get:function(){return n.DataFormatType}}),Object.defineProperty(t,"DataType",{enumerable:!0,get:function(){return n.DataType}}),Object.defineProperty(t,"DateRangeType",{enumerable:!0,get:function(){return n.DateRangeType}}),Object.defineProperty(t,"DialogStyle",{enumerable:!0,get:function(){return n.DialogStyle}}),Object.defineProperty(t,"EncodingType",{enumerable:!0,get:function(){return n.EncodingType}}),Object.defineProperty(t,"FieldAggregationType",{enumerable:!0,get:function(){return n.FieldAggregationType}}),Object.defineProperty(t,"FieldRoleType",{enumerable:!0,get:function(){return n.FieldRoleType}}),Object.defineProperty(t,"FilterDomainType",{enumerable:!0,get:function(){return n.FilterDomainType}}),Object.defineProperty(t,"FilterNullOption",{enumerable:!0,get:function(){return n.FilterNullOption}}),Object.defineProperty(t,"FilterType",{enumerable:!0,get:function(){return n.FilterType}}),Object.defineProperty(t,"FilterUpdateType",{enumerable:!0,get:function(){return n.FilterUpdateType}}),Object.defineProperty(t,"HierarchicalLevelSelectionState",{enumerable:!0,get:function(){return n.HierarchicalLevelSelectionState}}),Object.defineProperty(t,"IncludeDataValuesOption",{enumerable:!0,get:function(){return n.IncludeDataValuesOption}}),Object.defineProperty(t,"MarkType",{enumerable:!0,get:function(){return n.MarkType}}),Object.defineProperty(t,"NegativeNumberFormat",{enumerable:!0,get:function(){return n.NegativeNumberFormat}}),Object.defineProperty(t,"NumberFormatUnits",{enumerable:!0,get:function(){return n.NumberFormatUnits}}),Object.defineProperty(t,"ParameterValueType",{enumerable:!0,get:function(){return n.ParameterValueType}}),Object.defineProperty(t,"PeriodType",{enumerable:!0,get:function(){return n.PeriodType}}),Object.defineProperty(t,"QuickTableCalcType",{enumerable:!0,get:function(){return n.QuickTableCalcType}}),Object.defineProperty(t,"ReplaySpeedType",{enumerable:!0,get:function(){return n.ReplaySpeedType}}),Object.defineProperty(t,"SelectionUpdateType",{enumerable:!0,get:function(){return n.SelectionUpdateType}}),Object.defineProperty(t,"SelectOptions",{enumerable:!0,get:function(){return n.SelectOptions}}),Object.defineProperty(t,"SheetType",{enumerable:!0,get:function(){return n.SheetType}}),Object.defineProperty(t,"SortDirection",{enumerable:!0,get:function(){return n.SortDirection}}),Object.defineProperty(t,"TrendLineModelType",{enumerable:!0,get:function(){return n.TrendLineModelType}}),Object.defineProperty(t,"ZoneVisibilityType",{enumerable:!0,get:function(){return n.ZoneVisibilityType}}),i(r(3658),t),i(r(6743),t),i(r(7750),t),i(r(3069),t)},9875:(e,t)=>{"use strict";var r,a,i,n,o,s,l,d,c,u,p,m,h,g,y,v,I,S,f,b,T,P,E,A,_,D,w,F,C,x,M,N,O,k,R,V,z,j;Object.defineProperty(t,"__esModule",{value:!0}),t.NegativeNumberFormat=t.NumberFormatUnits=t.DataFormatType=t.PulseErrorMessageVisibility=t.PulseTimeDimension=t.EncodingType=t.FitPages=t.PageScalingOption=t.ScaleMode=t.PageOrientation=t.PageSizeOption=t.ApiShowDataTableFormat=t.ExtensionDialogResult=t.DateRangeType=t.FilterType=t.MarkType=t.HierarchicalLevelSelectionState=t.QuantitativeIncludedValues=t.SelectOptions=t.SelectionUpdateType=t.FilterDomainType=t.FilterNullOption=t.DateStepPeriod=t.DomainRestrictionType=t.SheetType=t.FilterUpdateType=t.FieldRoleType=t.FieldAggregationType=t.ErrorCodes=t.EncodedDataType=t.DialogStyle=t.DataType=t.DashboardObjectType=t.ColumnType=t.AnnotateEnum=t.ExportedMediaType=t.ExtensionMode=t.ExtensionContext=void 0,function(e){e.Desktop="desktop",e.Server="server",e.Unknown="unknown",e.Cloud="cloud",e.PublicWeb="public-web",e.PublicDesktop="public-desktop"}(r||(t.ExtensionContext=r={})),function(e){e.Authoring="authoring",e.Viewing="viewing",e.Unknown="unknown"}(a||(t.ExtensionMode=a={})),function(e){e.Image="image",e.Pdf="pdf",e.Svg="svg",e.Html="html",e.PowerPoint="powerpoint",e.Excel="excel"}(i||(t.ExportedMediaType=i={})),function(e){e.Mark="mark",e.Point="point",e.Area="area"}(n||(t.AnnotateEnum=n={})),function(e){e.Discrete="discrete",e.Continuous="continuous",e.Unknown="unknown"}(o||(t.ColumnType=o={})),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"}(s||(t.DashboardObjectType=s={})),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"}(l||(t.DataType=l={})),function(e){e.Window="window",e.Modal="modal",e.Modeless="modeless"}(d||(t.DialogStyle=d={})),function(e){e.Number="number",e.String="string",e.Date="date",e.Boolean="boolean"}(c||(t.EncodedDataType=c={})),function(e){e.INITIALIZATION_ERROR="initialization-error",e.INTERNAL_ERROR="internal-error",e.MISSING_ENUM_MAPPING="missing-enum-mapping",e.MISSING_PARAMETER="missing-parameter",e.PERMISSION_DENIED="permission-denied",e.PRES_MODEL_PARSING_ERROR="pres-model-parsing-error",e.VERSION_NOT_CONFIGURED="version-not-configured",e.VISIBILITY_ERROR="visibility-error",e.UNKNOWN_VERB_ID="unknown-verb-id"}(u||(t.ErrorCodes=u={})),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"}(p||(t.FieldAggregationType=p={})),function(e){e.Dimension="dimension",e.Measure="measure",e.Unknown="unknown"}(m||(t.FieldRoleType=m={})),function(e){e.Add="add",e.All="all",e.Replace="replace",e.Remove="remove"}(h||(t.FilterUpdateType=h={})),function(e){e.Dashboard="dashboard",e.Story="story",e.Worksheet="worksheet"}(g||(t.SheetType=g={})),function(e){e.All="all",e.List="list",e.Range="range"}(y||(t.DomainRestrictionType=y={})),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",e.IsoYears="iso-years",e.IsoQuarters="iso-quarters",e.IsoWeeks="iso-weeks"}(v||(t.DateStepPeriod=v={})),function(e){e.NullValues="nullvalues",e.NonNullValues="nonnullvalues",e.AllValues="allvalues"}(I||(t.FilterNullOption=I={})),function(e){e.Relevant="relevant",e.Database="database"}(S||(t.FilterDomainType=S={})),function(e){e.Replace="select-replace",e.Add="select-add",e.Remove="select-remove"}(f||(t.SelectionUpdateType=f={})),function(e){e.Simple="select-options-simple",e.Toggle="select-options-toggle",e.Menu="select-options-menu",e.Range="select-options-range",e.Search="select-options-search"}(b||(t.SelectOptions=b={})),function(e){e.IncludeNull="include-null",e.IncludeNonNull="include-non-null",e.IncludeAll="include-all"}(T||(t.QuantitativeIncludedValues=T={})),function(e){e.AllSelected="all-selected",e.NoneSelected="none-selected",e.SomeSelected="some-selected",e.UnknownSelected="unknown-selected"}(P||(t.HierarchicalLevelSelectionState=P={})),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"}(E||(t.MarkType=E={})),function(e){e.Categorical="categorical",e.Range="range",e.RelativeDate="relativeDate",e.Hierarchical="hierarchical"}(A||(t.FilterType=A={})),function(e){e.Last="last",e.LastN="lastN",e.Next="next",e.NextN="nextN",e.Current="current",e.ToDate="toDate"}(_||(t.DateRangeType=_={})),function(e){e.DialogAlreadyOpen="dialog-already-open",e.InvalidDomain="invalid-domain",e.Success="success"}(D||(t.ExtensionDialogResult=D={})),function(e){e.NativeValuesOnly="native-values-only",e.FormattedValuesOnly="formatted-values-only",e.NativeAndFormattedValues="native-and-formatted-values"}(w||(t.ApiShowDataTableFormat=w={})),function(e){e.Letter="letter",e.Legal="legal",e.Note="note",e.Folio="folio",e.Tabloid="tabloid",e.Ledger="ledger",e.Statement="statement",e.Executive="executive",e.A3="a3",e.A4="a4",e.A5="a5",e.B4="b4",e.B5="b5",e.Quarto="quarto",e.Unspecified="unspecified"}(F||(t.PageSizeOption=F={})),function(e){e.Printer="printer",e.Portrait="portrait",e.Landscape="landscape"}(C||(t.PageOrientation=C={})),function(e){e.ScaleAuto="auto",e.ScalePercentage="percent",e.ScaleFitPages="fit-pages"}(x||(t.ScaleMode=x={})),function(e){e.ScalePctAuto="auto",e.ScalePct400="pct400",e.ScalePct200="pct200",e.ScalePct100="pct100",e.ScalePct90="pct90",e.ScalePct80="pct80",e.ScalePct75="pct75",e.ScalePct60="pct60",e.ScalePct50="pct50",e.ScalePct25="pct25"}(M||(t.PageScalingOption=M={})),function(e){e.FitOneHigh="fit0x1",e.FitTwoHigh="fit0x2",e.FitOneWide="fit1x0",e.FitTwoWide="fit2x0"}(N||(t.FitPages=N={})),function(e){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"}(O||(t.EncodingType=O={})),function(e){e.Today="Today",e.Yesterday="Yesterday",e.WeekToDate="WeekToDate",e.LastWeek="LastWeek",e.MonthToDate="MonthToDate",e.LastMonth="LastMonth",e.QuarterToDate="QuarterToDate",e.LastQuarter="LastQuarter",e.YearToDate="YearToDate",e.LastYear="LastYear"}(k||(t.PulseTimeDimension=k={})),function(e){e.Visible="visible",e.Hidden="hidden",e.Suppressed="suppressed"}(R||(t.PulseErrorMessageVisibility=R={})),function(e){e.AutoFormat="auto-format",e.SystemNumber="system-number",e.SystemCurrency="system-currency",e.SystemLongDate="system-long-date",e.SystemShortDate="system-short-date",e.SystemTime="system-time",e.Custom="custom",e.CustomNumber="custom-number",e.CustomCurrency="custom-currency",e.CustomScientific="custom-scientific",e.CustomPercentage="custom-percentage"}(V||(t.DataFormatType=V={})),function(e){e.None="units-none",e.Thousands="units-thousands",e.Millions="units-millions",e.BillionsEnglish="units-billions-english",e.BillionsStandard="units-billions-standard"}(z||(t.NumberFormatUnits=z={})),function(e){e.Automatic="automatic",e.Parentheses="parentheses",e.OuterPrefix="outer-prefix",e.OuterSuffix="outer-suffix",e.InnerPrefix="inner-prefix",e.InnerSuffix="inner-suffix"}(j||(t.NegativeNumberFormat=j={}))}},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}),e.ZoneVisibilityType=e.VizImageSortDirectionType=e.VizImageSizeSettingType=e.VizImageSizeSettingAlignmentType=e.VizImagePaletteType=e.VizImageEncodingType=e.TrendLineModelType=e.TableauEventType=e.SortDirection=e.SheetType=e.SelectOptions=e.SelectionUpdateType=e.ReplaySpeedType=e.QuickTableCalcType=e.PeriodType=e.ParameterValueType=e.MarkType=e.IncludeDataValuesOption=e.HierarchicalLevelSelectionState=e.FilterUpdateType=e.FilterType=e.FilterNullOption=e.FilterDomainType=e.FieldRoleType=e.FieldAggregationType=e.ExtensionMode=e.ExtensionContext=e.ExportedMediaType=e.ErrorCodes=e.EncodingType=e.DialogStyle=e.DateRangeType=e.DataType=e.DashboardObjectVisibilityType=e.DashboardObjectType=e.DashboardLayoutChange=e.ColumnType=e.ClassNameKey=e.AnnotationType=e.AnalyticsObjectType=e.extensions=void 0;const t=r(7464),i=r(74),n=r(6538),o="undefined"!=typeof VERSION_IS_ALPHA&&VERSION_IS_ALPHA;t.ApiVersion.SetVersionNumber("1.17.0-pre.8",o);const s=new i.ExtensionsImpl;e.extensions=new n.Extensions(s);var l=r(5691);Object.defineProperty(e,"AnalyticsObjectType",{enumerable:!0,get:function(){return l.AnalyticsObjectType}}),Object.defineProperty(e,"AnnotationType",{enumerable:!0,get:function(){return l.AnnotationType}}),Object.defineProperty(e,"ClassNameKey",{enumerable:!0,get:function(){return l.ClassNameKey}}),Object.defineProperty(e,"ColumnType",{enumerable:!0,get:function(){return l.ColumnType}}),Object.defineProperty(e,"DashboardLayoutChange",{enumerable:!0,get:function(){return l.DashboardLayoutChange}}),Object.defineProperty(e,"DashboardObjectType",{enumerable:!0,get:function(){return l.DashboardObjectType}}),Object.defineProperty(e,"DashboardObjectVisibilityType",{enumerable:!0,get:function(){return l.DashboardObjectVisibilityType}}),Object.defineProperty(e,"DataType",{enumerable:!0,get:function(){return l.DataType}}),Object.defineProperty(e,"DateRangeType",{enumerable:!0,get:function(){return l.DateRangeType}}),Object.defineProperty(e,"DialogStyle",{enumerable:!0,get:function(){return l.DialogStyle}}),Object.defineProperty(e,"EncodingType",{enumerable:!0,get:function(){return l.EncodingType}}),Object.defineProperty(e,"ErrorCodes",{enumerable:!0,get:function(){return l.ErrorCodes}}),Object.defineProperty(e,"ExportedMediaType",{enumerable:!0,get:function(){return l.ExportedMediaType}}),Object.defineProperty(e,"ExtensionContext",{enumerable:!0,get:function(){return l.ExtensionContext}}),Object.defineProperty(e,"ExtensionMode",{enumerable:!0,get:function(){return l.ExtensionMode}}),Object.defineProperty(e,"FieldAggregationType",{enumerable:!0,get:function(){return l.FieldAggregationType}}),Object.defineProperty(e,"FieldRoleType",{enumerable:!0,get:function(){return l.FieldRoleType}}),Object.defineProperty(e,"FilterDomainType",{enumerable:!0,get:function(){return l.FilterDomainType}}),Object.defineProperty(e,"FilterNullOption",{enumerable:!0,get:function(){return l.FilterNullOption}}),Object.defineProperty(e,"FilterType",{enumerable:!0,get:function(){return l.FilterType}}),Object.defineProperty(e,"FilterUpdateType",{enumerable:!0,get:function(){return l.FilterUpdateType}}),Object.defineProperty(e,"HierarchicalLevelSelectionState",{enumerable:!0,get:function(){return l.HierarchicalLevelSelectionState}}),Object.defineProperty(e,"IncludeDataValuesOption",{enumerable:!0,get:function(){return l.IncludeDataValuesOption}}),Object.defineProperty(e,"MarkType",{enumerable:!0,get:function(){return l.MarkType}}),Object.defineProperty(e,"ParameterValueType",{enumerable:!0,get:function(){return l.ParameterValueType}}),Object.defineProperty(e,"PeriodType",{enumerable:!0,get:function(){return l.PeriodType}}),Object.defineProperty(e,"QuickTableCalcType",{enumerable:!0,get:function(){return l.QuickTableCalcType}}),Object.defineProperty(e,"ReplaySpeedType",{enumerable:!0,get:function(){return l.ReplaySpeedType}}),Object.defineProperty(e,"SelectionUpdateType",{enumerable:!0,get:function(){return l.SelectionUpdateType}}),Object.defineProperty(e,"SelectOptions",{enumerable:!0,get:function(){return l.SelectOptions}}),Object.defineProperty(e,"SheetType",{enumerable:!0,get:function(){return l.SheetType}}),Object.defineProperty(e,"SortDirection",{enumerable:!0,get:function(){return l.SortDirection}}),Object.defineProperty(e,"TableauEventType",{enumerable:!0,get:function(){return l.TableauEventType}}),Object.defineProperty(e,"TrendLineModelType",{enumerable:!0,get:function(){return l.TrendLineModelType}}),Object.defineProperty(e,"VizImageEncodingType",{enumerable:!0,get:function(){return l.VizImageEncodingType}}),Object.defineProperty(e,"VizImagePaletteType",{enumerable:!0,get:function(){return l.VizImagePaletteType}}),Object.defineProperty(e,"VizImageSizeSettingAlignmentType",{enumerable:!0,get:function(){return l.VizImageSizeSettingAlignmentType}}),Object.defineProperty(e,"VizImageSizeSettingType",{enumerable:!0,get:function(){return l.VizImageSizeSettingType}}),Object.defineProperty(e,"VizImageSortDirectionType",{enumerable:!0,get:function(){return l.VizImageSortDirectionType}}),Object.defineProperty(e,"ZoneVisibilityType",{enumerable:!0,get:function(){return l.ZoneVisibilityType}})})(),window.tableau=a})(); +//# sourceMappingURL=tableau.extensions.1.17.0-pre.8.min.js.map \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 378e5f59..32895d50 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "extensions-api-sdk", - "version": "1.16.0", + "version": "1.17.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "extensions-api-sdk", - "version": "1.16.0", + "version": "1.17.0", "license": "MIT", "dependencies": { "http-server": "^14.1.0" }, "devDependencies": { - "@tableau/extensions-api-types": "1.16.0", - "@tableau/tabextsandbox": "1.16.0", + "@tableau/extensions-api-types": "1.17.0", + "@tableau/tabextsandbox": "1.17.0", "@tableau/tableau-ui": "3.10", "@testing-library/jest-dom": "^5.11.0", "@testing-library/react": "^11.1.0", @@ -39,28 +39,14 @@ "integrity": "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==", "dev": true }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -69,9 +55,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.5.tgz", - "integrity": "sha512-KiRAp/VoJaWkkte84TvUd9qjdbZAdiqyvMxrGl1N6vzFogKmaLgoM3L1kgtLicp2HP5fBJS8JrZKLVIZGVJAVg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", "peer": true, @@ -80,23 +66,23 @@ } }, "node_modules/@babel/core": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.4.tgz", - "integrity": "sha512-bXYxrXFubeYdvB0NhD/NBB3Qi6aZeV20GOWVI47t2dkecCEoneR4NPVcb7abpXDEvejgrUfFtG6vG/zxAKmg+g==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.27.3", - "@babel/helpers": "^7.27.4", - "@babel/parser": "^7.27.4", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.27.4", - "@babel/types": "^7.27.3", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -145,17 +131,17 @@ } }, "node_modules/@babel/generator": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.5.tgz", - "integrity": "sha512-ZGhA37l0e/g2s1Cnzdix0O3aLYm66eF8aufiVteOgnwxgnRP8GoyMj7VWsgWnQbVKXyge7hqrFh2K2TQM6t1Hw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/parser": "^7.27.5", - "@babel/types": "^7.27.3", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" }, "engines": { @@ -163,15 +149,15 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -191,32 +177,43 @@ "semver": "bin/semver.js" } }, + "node_modules/@babel/helper-globals": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", + "dev": true, + "license": "MIT", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.27.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.3.tgz", - "integrity": "sha512-dSOvYwvyLsWBeIRyOeHXp5vPj5l1I011r52FM1+r1jCERv+aFXYk4whgQccYEGYxK2H3ZAIA8nuPkQ0HaUo3qg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.3" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -237,9 +234,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "dev": true, "license": "MIT", "peer": true, @@ -248,18 +245,19 @@ } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "peer": true, @@ -268,15 +266,15 @@ } }, "node_modules/@babel/helpers": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.6.tgz", - "integrity": "sha512-muE8Tt8M22638HU31A3CgfSUciwz1fhATfoVai05aPXGor//CdWDCbnlY1yvBPo07njuVOCNGCSp/GTt12lIug==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.6" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -369,14 +367,14 @@ } }, "node_modules/@babel/parser": { - "version": "7.27.5", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.5.tgz", - "integrity": "sha512-OsQd175SxWkGlzbny8J3K8TnnDD0N3lrIUtB92xwyRpzaenGZhxDvxN/JgU00U3CDZNj9tPuDJ5H0WS4Nt3vKg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -646,62 +644,51 @@ } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.27.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.4.tgz", - "integrity": "sha512-oNcu2QbHqts9BtOWJosOVJapWjBDSxGCpFvikNR5TGDYDQf3JwpIoMzIKrvfoti93cLfPJEG4tH9SPVeyCGgdA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.3", - "@babel/parser": "^7.27.4", - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", - "debug": "^4.3.1", - "globals": "^11.1.0" + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "peer": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/types": { - "version": "7.27.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.6.tgz", - "integrity": "sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "dev": true, "license": "MIT", "peer": true, "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1410,17 +1397,26 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -1432,15 +1428,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { "version": "0.3.11", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz", @@ -1459,10 +1446,11 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, + "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" @@ -1497,9 +1485,9 @@ } }, "node_modules/@tableau/extensions-api-types": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@tableau/extensions-api-types/-/extensions-api-types-1.16.0.tgz", - "integrity": "sha512-kvw13CJAyDghgemjokmon7ZjgGDuI8NtODv3TYZMBavHcgBCb5a3knf/VKhiW+We1w0Y9nFJlpofj76wi+WZGw==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@tableau/extensions-api-types/-/extensions-api-types-1.17.0.tgz", + "integrity": "sha512-3Anv2/IL2ZsLUShSPNsYJNSSxE+C8+SpdwEiGlzwK7ZoEjFgOQ32C4dPihho1LCqZNk1Z20cDxwU774YkJHcsw==", "dev": true, "license": "MIT", "dependencies": { @@ -1507,9 +1495,9 @@ } }, "node_modules/@tableau/tabextsandbox": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/@tableau/tabextsandbox/-/tabextsandbox-1.16.0.tgz", - "integrity": "sha512-gH/nklnh2wPWIDsO2ydKNFT0aRWrpQSzISrTtAh5N2dSAZ7sxJRbOGyj6aLKwXdWP9QttnLMdL+/uMQIARSL4A==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/@tableau/tabextsandbox/-/tabextsandbox-1.17.0.tgz", + "integrity": "sha512-ZruJ44TF7itaKXGavt8E0gID/qdNaE+ElJ4D94ux1mln1HnSw8l7GRgDR0Pe8o+8SiP0J/UcMDQIzinxBLlOWA==", "dev": true, "license": "MIT", "dependencies": { @@ -2643,9 +2631,9 @@ } }, "node_modules/body-parser": { - "version": "1.20.4", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", - "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", + "version": "1.20.5", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz", + "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==", "dev": true, "license": "MIT", "dependencies": { @@ -2657,7 +2645,7 @@ "http-errors": "~2.0.1", "iconv-lite": "~0.4.24", "on-finished": "~2.4.1", - "qs": "~6.14.0", + "qs": "~6.15.1", "raw-body": "~2.5.3", "type-is": "~1.6.18", "unpipe": "~1.0.0" @@ -2672,6 +2660,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -2702,6 +2691,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -2713,7 +2703,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/body-parser/node_modules/statuses": { "version": "2.0.2", @@ -2726,9 +2717,9 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.1.tgz", + "integrity": "sha512-WR1cURNjuvBLMZBMbqM0UoE+WAfdUcEV1ccD8PVBVOI+Z3ND4+SZbN8RsfT2bMuG1qwz5RFvPukSZm5fF2D5eA==", "dev": true, "license": "MIT", "dependencies": { @@ -3154,6 +3145,7 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -4489,15 +4481,15 @@ } }, "node_modules/express": { - "version": "4.22.1", - "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", - "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.2.tgz", + "integrity": "sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "~1.20.3", + "body-parser": "~1.20.5", "content-disposition": "~0.5.4", "content-type": "~1.0.4", "cookie": "~0.7.1", @@ -4516,7 +4508,7 @@ "parseurl": "~1.3.3", "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "~6.14.0", + "qs": "~6.15.1", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", "send": "~0.19.0", @@ -4589,9 +4581,9 @@ "dev": true }, "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", + "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", "dev": true, "funding": [ { @@ -4602,7 +4594,8 @@ "type": "opencollective", "url": "https://opencollective.com/fastify" } - ] + ], + "license": "BSD-3-Clause" }, "node_modules/fastest-levenshtein": { "version": "1.0.16", @@ -4739,21 +4732,23 @@ } }, "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -4779,9 +4774,9 @@ } }, "node_modules/form-data": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", - "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.5.tgz", + "integrity": "sha512-j23EibVLnp4zNXGW7LjryXYa2X6U/M96yoOX+ybZxwkYajdxRNEqYY3zhh7y0i6kfISKS2jr+EJq1YTUDEv5+w==", "dev": true, "license": "MIT", "peer": true, @@ -4789,7 +4784,7 @@ "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", + "hasown": "^2.0.4", "mime-types": "^2.1.35" }, "engines": { @@ -5165,9 +5160,10 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", + "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, @@ -7540,9 +7536,9 @@ } }, "node_modules/lodash": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.23.tgz", - "integrity": "sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "dev": true, "license": "MIT" }, @@ -7643,6 +7639,7 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7750,9 +7747,9 @@ } }, "node_modules/minimatch/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", "dev": true, "license": "MIT", "dependencies": { @@ -8160,10 +8157,11 @@ "dev": true }, "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "dev": true + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz", + "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==", + "dev": true, + "license": "MIT" }, "node_modules/picocolors": { "version": "1.1.1", @@ -8172,10 +8170,11 @@ "dev": true }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -8409,9 +8408,9 @@ } }, "node_modules/qs": { - "version": "6.14.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", - "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==", + "version": "6.15.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.2.tgz", + "integrity": "sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -9977,6 +9976,7 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -10657,9 +10657,9 @@ } }, "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "version": "7.5.11", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz", + "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==", "dev": true, "license": "MIT", "peer": true, diff --git a/package.json b/package.json index 0993006e..35bc9c9c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "extensions-api-sdk", - "version": "1.16.0", + "version": "1.17.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.16.0", - "@tableau/tabextsandbox": "1.16.0", + "@tableau/extensions-api-types": "1.17.0", + "@tableau/tabextsandbox": "1.17.0", "@tableau/tableau-ui": "3.10", "@testing-library/jest-dom": "^5.11.0", "@testing-library/react": "^11.1.0",